Skip to content

OScript: вложенная конвенциональная библиотека (autumn/internal) не подключается отдельно по пути #4170

Description

@nixel2007

Описание

Конвенциональная OneScript-библиотека может содержать вложенную конвенциональную библиотеку, которую разрешено подключать по пути отдельно. Пример — autumn-library: в autumn есть src/Классы, src/Модули, а внутри ещё каталог internal, который сам является конвенциональной библиотекой и может подключаться по пути, в том числе как #Использовать "autumn/internal".

Сейчас такой вложенный internal моделируется как деталь реализации родителя (autumn), а не как самостоятельно подключаемая библиотека.

Текущее поведение (по коду)

  1. Обнаружение не теряется. ConventionalLibraryDiscovery.walk после регистрации Классы/Модули внутрь не спускается («завершённая библиотека»), но OScriptLibraryIndex.collectImplicitEntries отдельно рекурсивно обходит всё дерево библиотеки (IMPLICIT_SCAN_MAX_DEPTH = 8) и подхватывает src/internal/Классы/*.os. Зафиксировано тестом ConventionalLibraryImplicitDiscoveryTest#deeperConventionalClassPickedUpAsImplicit.

  2. Но привязка — к родителю и implicit=true:

    • libOrigin = "autumn" (родитель), ключ — голое имя класса (InternalConv), без квалификации путём;
    • implicit=true → в completion по умолчанию скрыты (при oscript.showImplicitLibraryEntriesInCompletion=false и не «своём» пакете), см. CompletionProvider#libraryEntryVisible.
  3. Path-подключение #Использовать "autumn/internal" не срабатывает как отдельная библиотека. UseDirectiveScanner.libraryNameFromPath("autumn/internal") берёт последний сегмент"internal". Гейтинг (samePackage || usedLibs.contains(origin)) ищет origin "internal", а у внутренних классов origin "autumn" → рассинхрон, под этой директивой классы не всплывают.

Возможные направления

  • Регистрировать вложенный каталог как отдельную ConventionalLibrary с libOrigin = имя каталога (internal), не помечая implicit — тогда gating-имя "internal" (последний сегмент пути) совпадёт. Дополнительно к текущей implicit-привязке к autumn. Затронет deeperConventionalClassPickedUpAsImplicit.
  • Path-aware гейтинг: хранить path-квалифицированный origin (autumn/internal) и полный путь из #Использовать, чтобы матчить и полный путь, и последний сегмент. Implicit-семантику не трогаем, добавляем адресуемость по пути.

Перед реализацией стоит уточнить реальную раскладку autumn-library (где именно лежит internal: autumn/internal/src/... или autumn/src/internal/...) и как OneScript семантически резолвит такой путь.

Затронутые места

  • ConventionalLibraryDiscovery#walk / #tryRegisterConventional
  • OScriptLibraryIndex#collectImplicitEntries / #indexConventional / #libOriginOf
  • UseDirectiveScanner#libraryNameFromPath
  • CompletionProvider#libraryEntryVisible
  • тесты: ConventionalLibraryImplicitDiscoveryTest, ImplicitEntryCompletionFilterTest, OScriptLibraryIndexImplicitDiscoveryTest

Выявлено при ревью #4169; договорились разобрать после релиза.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions