Описание
Конвенциональная OneScript-библиотека может содержать вложенную конвенциональную библиотеку, которую разрешено подключать по пути отдельно. Пример — autumn-library: в autumn есть src/Классы, src/Модули, а внутри ещё каталог internal, который сам является конвенциональной библиотекой и может подключаться по пути, в том числе как #Использовать "autumn/internal".
Сейчас такой вложенный internal моделируется как деталь реализации родителя (autumn), а не как самостоятельно подключаемая библиотека.
Текущее поведение (по коду)
-
Обнаружение не теряется. ConventionalLibraryDiscovery.walk после регистрации Классы/Модули внутрь не спускается («завершённая библиотека»), но OScriptLibraryIndex.collectImplicitEntries отдельно рекурсивно обходит всё дерево библиотеки (IMPLICIT_SCAN_MAX_DEPTH = 8) и подхватывает src/internal/Классы/*.os. Зафиксировано тестом ConventionalLibraryImplicitDiscoveryTest#deeperConventionalClassPickedUpAsImplicit.
-
Но привязка — к родителю и implicit=true:
libOrigin = "autumn" (родитель), ключ — голое имя класса (InternalConv), без квалификации путём;
implicit=true → в completion по умолчанию скрыты (при oscript.showImplicitLibraryEntriesInCompletion=false и не «своём» пакете), см. CompletionProvider#libraryEntryVisible.
-
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; договорились разобрать после релиза.
Описание
Конвенциональная OneScript-библиотека может содержать вложенную конвенциональную библиотеку, которую разрешено подключать по пути отдельно. Пример —
autumn-library: вautumnестьsrc/Классы,src/Модули, а внутри ещё каталогinternal, который сам является конвенциональной библиотекой и может подключаться по пути, в том числе как#Использовать "autumn/internal".Сейчас такой вложенный
internalмоделируется как деталь реализации родителя (autumn), а не как самостоятельно подключаемая библиотека.Текущее поведение (по коду)
Обнаружение не теряется.
ConventionalLibraryDiscovery.walkпосле регистрацииКлассы/Модуливнутрь не спускается («завершённая библиотека»), ноOScriptLibraryIndex.collectImplicitEntriesотдельно рекурсивно обходит всё дерево библиотеки (IMPLICIT_SCAN_MAX_DEPTH = 8) и подхватываетsrc/internal/Классы/*.os. Зафиксировано тестомConventionalLibraryImplicitDiscoveryTest#deeperConventionalClassPickedUpAsImplicit.Но привязка — к родителю и
implicit=true:libOrigin = "autumn"(родитель), ключ — голое имя класса (InternalConv), без квалификации путём;implicit=true→ в completion по умолчанию скрыты (приoscript.showImplicitLibraryEntriesInCompletion=falseи не «своём» пакете), см.CompletionProvider#libraryEntryVisible.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.autumn/internal) и полный путь из#Использовать, чтобы матчить и полный путь, и последний сегмент. Implicit-семантику не трогаем, добавляем адресуемость по пути.Перед реализацией стоит уточнить реальную раскладку
autumn-library(где именно лежитinternal:autumn/internal/src/...илиautumn/src/internal/...) и как OneScript семантически резолвит такой путь.Затронутые места
ConventionalLibraryDiscovery#walk/#tryRegisterConventionalOScriptLibraryIndex#collectImplicitEntries/#indexConventional/#libOriginOfUseDirectiveScanner#libraryNameFromPathCompletionProvider#libraryEntryVisibleConventionalLibraryImplicitDiscoveryTest,ImplicitEntryCompletionFilterTest,OScriptLibraryIndexImplicitDiscoveryTestВыявлено при ревью #4169; договорились разобрать после релиза.