Skip to content

feat: аннотации как значения параметров аннотаций (рекурсивный разворот)#22

Open
nixel2007 wants to merge 8 commits into
masterfrom
claude/annotation-parameter-values-a33kvw
Open

feat: аннотации как значения параметров аннотаций (рекурсивный разворот)#22
nixel2007 wants to merge 8 commits into
masterfrom
claude/annotation-parameter-values-a33kvw

Conversation

@nixel2007

Copy link
Copy Markdown
Member

Что и зачем

Начиная с OneScript 2.0.0 значением параметра аннотации может быть другая аннотация (вложенные аннотации), например @OpenApiDefinition(&Info("title")) или прикладной кейс из autumn#101:

&Пластилин(&Деталька("ИмяАппендера")) Аппендер

Рефлектор OneScript отдаёт такое значение строкой таблицы значений с колонками Имя/Параметры — так же, как строку таблицы аннотаций. Библиотека этого не учитывала: вложенное значение проходило как «сырой» Произвольный, не распознавалось и не разворачивалось.

Изменения

  • РаботаСАннотациями.ЭтоАннотация(Значение) — предикат распознавания вложенной аннотации (СтрокаТаблицыЗначений с колонками Имя и Параметры).
  • ОпределениеАннотации.СоздатьОбъектАннотации(Аннотация, КонтейнерАннотаций = Неопределено) — при переданном контейнере значения-параметры, являющиеся вложенными аннотациями, рекурсивно материализуются в объекты своих аннотаций (в т.ч. для повторяемых параметров). Второй параметр опционален — обратная совместимость сохранена: без контейнера вложенная аннотация остаётся строкой таблицы значений.
  • РазворачивательАннотаций пробрасывает контейнер в СоздатьОбъектАннотации, поэтому материализация включается при штатном разворачивании.
  • packagedef: Версия → 1.7.0, ВерсияСреды → 2.0.0 (фича требует OneScript 2.0.0).

Тесты

tests/ВложенныеАннотации.os (распознавание ЭтоАннотация; рекурсивная материализация в объект; сохранение строки таблицы без контейнера) + фикстуры АннотацияВнешняя, ВладелецВложенныхАннотаций.

На что обратить внимание

  • Тесты не запускались в среде разработки автора PR (нет OneScript локально) — проверка на CI.
  • Фикстура ВладелецВложенныхАннотаций использует синтаксис вложенных аннотаций и требует OneScript 2.0.0; на версиях матрицы младше 2.0.0 этот тест-файл не скомпилируется (изолирован в отдельном файле, остальные тесты не затрагивает).

🤖 Generated with Claude Code


Generated by Claude Code

С 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
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a0c4f14d-7953-418f-8791-6c6e1c0fd133

📥 Commits

Reviewing files that changed from the base of the PR and between fb16221 and 6acc1d2.

📒 Files selected for processing (4)
  • src/Классы/КонтейнерАннотаций.os
  • src/Классы/ОпределениеАннотации.os
  • src/Модули/РаботаСАннотациями.os
  • tests/ВложенныеАннотации.os

Walkthrough

Добавлено распознавание описаний вложенных аннотаций и их рекурсивная материализация в объекты через контейнер определений. Контекст контейнера передается при создании определения, добавлены фикстуры и тесты для зарегистрированных и незарегистрированных вложенных аннотаций. Обновлены версии пакета и среды.

Changes

Вложенные аннотации

Layer / File(s) Summary
Распознавание и материализация значений
src/Модули/РаботаСАннотациями.os, src/Классы/ОпределениеАннотации.os
Добавлена проверка описаний аннотаций и рекурсивное преобразование повторяемых и неповторяемых параметров во вложенные объекты.
Передача контейнера и версия пакета
src/Классы/КонтейнерАннотаций.os, src/Классы/ОпределениеАннотации.os, packagedef
Контейнер определений передается и сохраняется при создании определения аннотации; версии пакета и среды обновлены.
Фикстуры и проверки вложенных аннотаций
tests/Классы/*, tests/ВложенныеАннотации.os
Добавлены тестовые аннотации, владелец вложенной аннотации и проверки распознавания, рекурсивной материализации и сохранения описания незарегистрированной аннотации.

Estimated code review effort: 3 (Moderate) | ~20 minutes

### Sequence Diagram(s)

sequenceDiagram
  participant МетодСВложеннойАннотацией
  participant КонтейнерАннотаций
  participant СоздатьОбъектАннотации
  participant МатериализоватьЗначение
  МетодСВложеннойАннотацией->>КонтейнерАннотаций: получает определение Внешняя
  КонтейнерАннотаций-->>СоздатьОбъектАннотации: передает определение и контейнер
  СоздатьОбъектАннотации->>МатериализоватьЗначение: передает значение Цель
  МатериализоватьЗначение->>КонтейнерАннотаций: ищет определение Цель
  КонтейнерАннотаций-->>МатериализоватьЗначение: возвращает определение или пустой результат
  МатериализоватьЗначение-->>СоздатьОбъектАннотации: возвращает объект или исходное описание
Loading

Possibly related PRs

  • autumn-library/annotations#17: Изменяет связанную логику обработки параметров аннотаций в ОпределениеАннотации.os.

Suggested reviewers: claude

Poem

Я, кролик, вложил аннотаций ряд,
Теперь объекты скачут в свой наряд.
Контейнер знает каждый новый след,
А если цели нет — останется сюжет.
Тесты морковкой машут: всё цело! 🐇

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed Заголовок ясно отражает основное изменение: поддержку вложенных аннотаций и их рекурсивный разворот.
Description check ✅ Passed Описание напрямую соответствует изменениям: вложенные аннотации, рекурсивная материализация, тесты и повышение версии среды.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/annotation-parameter-values-a33kvw

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coveralls

coveralls commented Jul 19, 2026

Copy link
Copy Markdown

Coverage Status

coverage: 95.37% (+0.4%) from 95.017% — claude/annotation-parameter-values-a33kvw into master

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 8f65470 and fb16221.

📒 Files selected for processing (7)
  • packagedef
  • src/Классы/ОпределениеАннотации.os
  • src/Классы/РазворачивательАннотаций.os
  • src/Модули/РаботаСАннотациями.os
  • tests/ВложенныеАннотации.os
  • tests/Классы/АннотацияВнешняя.os
  • tests/Классы/ВладелецВложенныхАннотаций.os

Comment thread src/Классы/ОпределениеАннотации.os
- МатериализоватьЗначение вызывает Проверить для вложенной аннотации перед
  созданием объекта: иначе неизвестные параметры игнорировались бы молча,
  а обязательные неявно получали бы Неопределено (замечание ревью).
- Убраны длинные тире (—) из добавленных комментариев (InvalidCharacterInFile).
- Убрана буква "ё" из имён тестовых процедур (YoLetterUsage).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Перечисли допутимые типы - все литералы + СтрокаТаблицыЗначений с колонками

Значение параметра аннотации — литерал (Строка, Число, Булево, Дата,
Неопределено, Null) либо СтрокаТаблицыЗначений с колонками "Имя"/"Параметры"
(вложенная аннотация). По замечанию ревью.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Может лучше принимать контейнер аннотаций как параметр конструктора и сохранять в поле?

claude added 2 commits July 19, 2026 13:13
По замечанию ревью: контейнер определений передаётся в конструктор
ОпределениеАннотации и хранится в поле, а не прокидывается параметром
в СоздатьОбъектАннотации.

- ОпределениеАннотации получает контейнер при создании (КонтейнерАннотаций
  передаёт ЭтотОбъект) и использует его в МатериализоватьЗначение.
- СоздатьОбъектАннотации снова принимает только Аннотация (исходная сигнатура),
  РазворачивательАннотаций и прочие вызовы не меняются.
- Тест переориентирован: незарегистрированная вложенная аннотация остаётся
  строкой таблицы значений.

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
// Подчиненные аннотации
Перем Аннотации;

// Контейнер определений аннотаций, которому принадлежит данное определение.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Нарушена типизация поля

Комментарий поля начинается с имени типа (КонтейнерАннотаций), чтобы
bsl-language-server корректно выводил тип поля. По замечанию ревью.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Knr8gmzxGCTqmbLhYXUEue
// ** Имя - Строка - Имя параметра аннотации.
// ** Значение - Строка - Значение параметра аннотации.
// ** Значение - Строка, Число, Булево, Дата, Неопределено, Null - литеральное значение параметра.
// - СтрокаТаблицыЗначений - вложенная аннотация (строка с колонками "Имя" и "Параметры",

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Неверный формат описания строки тз. См https://v8std.ru/std/641/

//
Функция МатериализоватьЗначение(Значение)

Если КонтейнерАннотаций = Неопределено ИЛИ НЕ РаботаСАннотациями.ЭтоАннотация(Значение) Тогда

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В каком случае КонтейнерАннотаций может быть пустым?

// Возвращаемое значение:
// Булево - Истина, если значение является вложенной аннотацией.
//
Функция ЭтоАннотация(Значение) Экспорт

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Имя функции неудачное

claude added 2 commits July 19, 2026 13:33
- КонтейнерАннотаций стал обязательным параметром конструктора (определение
  всегда создаётся контейнером), убрана мёртвая ветка проверки на Неопределено
  в МатериализоватьЗначение.
- Описание значения-параметра приведено к формату стандарта 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
@sonar-openbsl-ru-qa-bot

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants