feat(oscript): регистрировать &Обходимое-классы OneScript как коллекции#4134
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthroughIntroduces ChangesOScript iterable collection registration
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Poem
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Test Results 3 480 files +12 3 480 suites +12 1h 41m 49s ⏱️ + 12m 46s Results for commit a4a3bbd. ± Comparison against base commit 3dd3a91. This pull request removes 1 and adds 16 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Пользовательские OneScript-классы, помеченные аннотацией &Обходимое (&Iterable) на ПриСозданииОбъекта, теперь регистрируются в TypeRegistry как коллекции, обходимые через `Для Каждого … Цикл`. Это движковый маркер итерируемости (UserIterableContextInstance), который использует, например, collectionos. Тип элемента при этом не задаётся: в исходниках OneScript он нигде не объявлен (итератор возвращает нетипизированное значение), поэтому элемент остаётся «любым» — ровно как у платформенного Массив. Вывод конкретного типа элемента вынесен в отдельный follow-up. - TypeRegistry.setUserTypeIterable(ref, iterable): императивная пометка USER-типа supportsForEach (+ очистка в unregisterUserType), идемпотентна и пригодна для hot-reload. - OScriptExtends.isIterable(dc): детект &Обходимое/&Iterable на конструкторе (переиспользует чтение аннотаций ПриСозданииОбъекта). - OScriptModuleMembersProvider: проводка при каждой регистрации типа. Closes #4033 Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
&Обходимое — маркер стандартной библиотеки самого OneScript (движковый UserIterableContextInstance), к библиотеке extends отношения не имеет. Перенёс isIterable из OScriptExtends в новый компонент OScriptIterable (пакет types.oscript), самодостаточный (сканирует аннотации конструктора через Methods.isOscriptClassConstructorName). OScriptModuleMembersProvider теперь зависит от OScriptIterable. Тесты isIterable переехали в OScriptIterableTest. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
a4a3bbd to
2fe245c
Compare
…лишний null-чек По ревью: скоуп языка протаскивается параметром (как в остальных методах регистрации TypeRegistry), а не хардкодится FileType.OS внутри; убрана лишняя проверка ref на null — registerUserType всегда возвращает TypeRef. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
|



Что
Пользовательские OneScript-классы, помеченные аннотацией
&Обходимое(&Iterable) наПриСозданииОбъекта, теперь регистрируются вTypeRegistryкак коллекции, обходимые черезДля Каждого … Цикл. Диагностики и инференс, опирающиеся наsupportsForEach, начинают видеть пользовательские коллекции наравне с платформенными.Closes #4033
Как устроен маркер в OneScript
&Обходимое— маркер итерируемости стандартной библиотеки самого OneScript (не библиотекиextends): класс с ним движок оборачивает вUserIterableContextInstanceи требует функциюПолучитьИтератор(). Ставится наПриСозданииОбъекта. Именно этот механизм использует collectionos (&Обходимое+ПолучитьИтератор, итератор помечен&ИтераторсТекущийЭлемент()).Про тип элемента (важно по объёму)
В исходниках OneScript тип элемента коллекции нигде не объявлен: итератор возвращает нетипизированное значение, движок отдаёт
Произвольный. Даже в collectionosТекущийЭлемент()нетипизирован. Поэтому здесь реализовано распознавание коллекции (supportsForEach=true), а тип элемента остаётся «любым» — ровно как у платформенногоМассив. Это согласованный объём.Follow-up — выведено в отдельную задачу #4138 (откуда брать тип элемента коллекции).
Изменения
TypeRegistry.setUserTypeIterable(ref, iterable)— императивная пометка USER-типаsupportsForEach(+ очистка вunregisterUserType); идемпотентна, пригодна для hot-reload (снятие аннотации снимает признак).OScriptIterable.isIterable(dc)— отдельный компонент (механизм стандартной библиотеки OneScript), детектит&Обходимое/&Iterableна конструктореПриСозданииОбъекта.OScriptModuleMembersProvider— проводка при каждой регистрации типа.Тесты
OScriptIterableTest— детект ru/en маркера, отрицательные кейсы (обычный класс, bsl, аннотация на не-конструкторе).OScriptModuleMembersProviderTest— проводкаsetUserTypeIterable(true/false).OScriptIterableCollectionTest+ фикстураiterable-lib— интеграционно:&Обходимое-класс →supportsForEach=true, тип элемента пуст; обычный класс →false.Прогон целевых тестов:
BUILD SUCCESSFUL.🤖 Generated with Claude Code
Summary by CodeRabbit
ОбходимоеorIterableare now recognized as supporting forEach iteration (with correct default element type handling).