feat: аннотации как значения параметров аннотаций (рекурсивный разворот)#22
feat: аннотации как значения параметров аннотаций (рекурсивный разворот)#22nixel2007 wants to merge 8 commits into
Conversation
С OneScript 2.0.0 значением параметра аннотации может быть другая аннотация. Добавлено: - РаботаСАннотациями.ЭтоАннотация(Значение) — распознавание вложенной аннотации (СтрокаТаблицыЗначений с колонками Имя/Параметры). - ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация, КонтейнерАннотаций) — при переданном контейнере значения-параметры, являющиеся вложенными аннотациями, рекурсивно материализуются в объекты своих аннотаций. - РазворачивательАннотаций пробрасывает контейнер в СоздатьОбъектАннотации. - ВерсияСреды поднята до 2.0.0. Тесты + фикстуры (АннотацияВнешняя, ВладелецВложенныхАннотаций) покрывают распознавание и рекурсивную материализацию. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
WalkthroughДобавлено распознавание описаний вложенных аннотаций и их рекурсивная материализация в объекты через контейнер определений. Контекст контейнера передается при создании определения, добавлены фикстуры и тесты для зарегистрированных и незарегистрированных вложенных аннотаций. Обновлены версии пакета и среды. ChangesВложенные аннотации
Estimated code review effort: 3 (Moderate) | ~20 minutes ### Sequence Diagram(s) sequenceDiagram
participant МетодСВложеннойАннотацией
participant КонтейнерАннотаций
participant СоздатьОбъектАннотации
participant МатериализоватьЗначение
МетодСВложеннойАннотацией->>КонтейнерАннотаций: получает определение Внешняя
КонтейнерАннотаций-->>СоздатьОбъектАннотации: передает определение и контейнер
СоздатьОбъектАннотации->>МатериализоватьЗначение: передает значение Цель
МатериализоватьЗначение->>КонтейнерАннотаций: ищет определение Цель
КонтейнерАннотаций-->>МатериализоватьЗначение: возвращает определение или пустой результат
МатериализоватьЗначение-->>СоздатьОбъектАннотации: возвращает объект или исходное описание
Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 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 |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/Классы/ОпределениеАннотации.os`:
- Around line 177-183: Добавьте вызов метода Проверить для
ОпределениеВложеннойАннотации перед вызовом СоздатьОбъектАннотации в обработке
вложенной аннотации, чтобы синтаксические ошибки выявлялись до материализации
объекта; сохраните существующий возврат Значение при отсутствии определения.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: d408ed96-a174-45c3-a3a7-eb4485f15916
📒 Files selected for processing (7)
packagedefsrc/Классы/ОпределениеАннотации.ossrc/Классы/РазворачивательАннотаций.ossrc/Модули/РаботаСАннотациями.ostests/ВложенныеАннотации.ostests/Классы/АннотацияВнешняя.ostests/Классы/ВладелецВложенныхАннотаций.os
- МатериализоватьЗначение вызывает Проверить для вложенной аннотации перед созданием объекта: иначе неизвестные параметры игнорировались бы молча, а обязательные неявно получали бы Неопределено (замечание ревью). - Убраны длинные тире (—) из добавленных комментариев (InvalidCharacterInFile). - Убрана буква "ё" из имён тестовых процедур (YoLetterUsage). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
There was a problem hiding this comment.
Перечисли допутимые типы - все литералы + СтрокаТаблицыЗначений с колонками
Значение параметра аннотации — литерал (Строка, Число, Булево, Дата, Неопределено, Null) либо СтрокаТаблицыЗначений с колонками "Имя"/"Параметры" (вложенная аннотация). По замечанию ревью. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
There was a problem hiding this comment.
Может лучше принимать контейнер аннотаций как параметр конструктора и сохранять в поле?
По замечанию ревью: контейнер определений передаётся в конструктор ОпределениеАннотации и хранится в поле, а не прокидывается параметром в СоздатьОбъектАннотации. - ОпределениеАннотации получает контейнер при создании (КонтейнерАннотаций передаёт ЭтотОбъект) и использует его в МатериализоватьЗначение. - СоздатьОбъектАннотации снова принимает только Аннотация (исходная сигнатура), РазворачивательАннотаций и прочие вызовы не меняются. - Тест переориентирован: незарегистрированная вложенная аннотация остаётся строкой таблицы значений. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
- Конструктор ОпределениеАннотации разбит по параметрам (LineLength). - Убрано длинное тире из комментария теста (InvalidCharacterInFile). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
| // Подчиненные аннотации | ||
| Перем Аннотации; | ||
|
|
||
| // Контейнер определений аннотаций, которому принадлежит данное определение. |
There was a problem hiding this comment.
Нарушена типизация поля
Комментарий поля начинается с имени типа (КонтейнерАннотаций), чтобы bsl-language-server корректно выводил тип поля. По замечанию ревью. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
| // ** Имя - Строка - Имя параметра аннотации. | ||
| // ** Значение - Строка - Значение параметра аннотации. | ||
| // ** Значение - Строка, Число, Булево, Дата, Неопределено, Null - литеральное значение параметра. | ||
| // - СтрокаТаблицыЗначений - вложенная аннотация (строка с колонками "Имя" и "Параметры", |
There was a problem hiding this comment.
Неверный формат описания строки тз. См https://v8std.ru/std/641/
| // | ||
| Функция МатериализоватьЗначение(Значение) | ||
|
|
||
| Если КонтейнерАннотаций = Неопределено ИЛИ НЕ РаботаСАннотациями.ЭтоАннотация(Значение) Тогда |
There was a problem hiding this comment.
В каком случае КонтейнерАннотаций может быть пустым?
| // Возвращаемое значение: | ||
| // Булево - Истина, если значение является вложенной аннотацией. | ||
| // | ||
| Функция ЭтоАннотация(Значение) Экспорт |
- КонтейнерАннотаций стал обязательным параметром конструктора (определение всегда создаётся контейнером), убрана мёртвая ветка проверки на Неопределено в МатериализоватьЗначение. - Описание значения-параметра приведено к формату стандарта 641: колонки вложенной СтрокаТаблицыЗначений описаны отдельными пунктами. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
По замечанию ревью. Обновлены вызовы, ссылки в документации и имя теста. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
|

0 New Issues
0 Fixed Issues
0 Accepted Issues
Что и зачем
Начиная с OneScript 2.0.0 значением параметра аннотации может быть другая аннотация (вложенные аннотации), например
@OpenApiDefinition(&Info("title"))или прикладной кейс из autumn#101:Рефлектор OneScript отдаёт такое значение строкой таблицы значений с колонками
Имя/Параметры— так же, как строку таблицы аннотаций. Библиотека этого не учитывала: вложенное значение проходило как «сырой»Произвольный, не распознавалось и не разворачивалось.Изменения
РаботаСАннотациями.ЭтоАннотация(Значение)— предикат распознавания вложенной аннотации (СтрокаТаблицыЗначенийс колонкамиИмяиПараметры).ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация, КонтейнерАннотаций = Неопределено)— при переданном контейнере значения-параметры, являющиеся вложенными аннотациями, рекурсивно материализуются в объекты своих аннотаций (в т.ч. для повторяемых параметров). Второй параметр опционален — обратная совместимость сохранена: без контейнера вложенная аннотация остаётся строкой таблицы значений.РазворачивательАннотацийпробрасывает контейнер вСоздатьОбъектАннотации, поэтому материализация включается при штатном разворачивании.packagedef:Версия→ 1.7.0,ВерсияСреды→ 2.0.0 (фича требует OneScript 2.0.0).Тесты
tests/ВложенныеАннотации.os(распознаваниеЭтоАннотация; рекурсивная материализация в объект; сохранение строки таблицы без контейнера) + фикстурыАннотацияВнешняя,ВладелецВложенныхАннотаций.На что обратить внимание
ВладелецВложенныхАннотацийиспользует синтаксис вложенных аннотаций и требует OneScript 2.0.0; на версиях матрицы младше 2.0.0 этот тест-файл не скомпилируется (изолирован в отдельном файле, остальные тесты не затрагивает).🤖 Generated with Claude Code
Generated by Claude Code