Что
Пользовательские классы-коллекции OneScript (т.е. классы со специальной разметкой / маркером итерируемости в исходниках OneScript) должны регистрироваться в TypeRegistry как коллекции, чтобы:
Для каждого ... Из коллекция Цикл корректно типизировался — итератор получал тип элемента, а не Произвольный.
коллекция[i] через индексатор возвращал тип элемента.
- Диагностики, опирающиеся на
isCollection(typeRef) / collectionElementTypes(typeRef), видели пользовательские коллекции наравне с платформенными Массив, Соответствие, СписокЗначений и пр.
Сейчас, насколько видно из кода, такая разметка не поднимается до TypeRegistry-уровня: пользовательский класс попадает в реестр как обычный TYPE без указания, что он представляет коллекцию.
Зачем
OneScript-проекты активно используют свои контейнеры — например, обёртки над Массив, специализированные коллекции c индексаторами, итераторами и т. п. Текущая инференция теряет тип элемента на первой же итерации, ломая цепочку дальнейших типизированных подсказок и QuickFix'ов.
Что нужно сделать
- На стороне
bsl-context (если ещё не) — извлекать признак «класс — коллекция» + тип элемента из метаданных OneScript класса (доку/манифест/аннотации в .os исходнике).
- На стороне LS — при регистрации
TypeDecl для пользовательских OneScript-типов помечать их как коллекции (isCollection=true + collectionElementType).
- Покрыть тестом:
Для каждого Элемент Из колл Цикл → Элемент имеет ожидаемый тип элемента, не Произвольный.
Связано
- Платформенные коллекции уже работают через
ContextCollection / collectionElementTypes. Здесь распространить тот же контракт на пользовательские.
Что
Пользовательские классы-коллекции OneScript (т.е. классы со специальной разметкой / маркером итерируемости в исходниках OneScript) должны регистрироваться в
TypeRegistryкак коллекции, чтобы:Для каждого ... Из коллекция Циклкорректно типизировался — итератор получал тип элемента, а неПроизвольный.коллекция[i]через индексатор возвращал тип элемента.isCollection(typeRef)/collectionElementTypes(typeRef), видели пользовательские коллекции наравне с платформеннымиМассив,Соответствие,СписокЗначенийи пр.Сейчас, насколько видно из кода, такая разметка не поднимается до
TypeRegistry-уровня: пользовательский класс попадает в реестр как обычныйTYPEбез указания, что он представляет коллекцию.Зачем
OneScript-проекты активно используют свои контейнеры — например, обёртки над
Массив, специализированные коллекции c индексаторами, итераторами и т. п. Текущая инференция теряет тип элемента на первой же итерации, ломая цепочку дальнейших типизированных подсказок и QuickFix'ов.Что нужно сделать
bsl-context(если ещё не) — извлекать признак «класс — коллекция» + тип элемента из метаданных OneScript класса (доку/манифест/аннотации в .os исходнике).TypeDeclдля пользовательских OneScript-типов помечать их как коллекции (isCollection=true+collectionElementType).Для каждого Элемент Из колл Цикл→Элементимеет ожидаемый тип элемента, неПроизвольный.Связано
ContextCollection/collectionElementTypes. Здесь распространить тот же контракт на пользовательские.