Hover/signature/автокомплит: «?» у необязательных параметров и список содержимого структур#3985
Conversation
…мплите Необязательные параметры теперь рендерятся со знаком «?»: он приклеивается к типу (Имя: Тип?), а при отсутствии типа — к имени (Имя?). Затрагивает SignatureHelpProvider, PlatformMemberHoverBuilder, ConstructorHoverBuilder, DescriptionFormatter (исходные методы) и CompletionProvider.formatSignature (где ранее использовались квадратные скобки [Имя]). Co-Authored-By: Claude Opus 4.8 <[email protected]>
Содержимое «открытых» объектов (Структура, ФиксированнаяСтруктура,
Соответствие, ФиксированноеСоответствие, строка ТаблицыЗначений) теперь
показывается в hover маркдаун-списком вида
Тип: Структура
* **Ключ**: `Тип` | `Тип2`
вместо однострочного инлайна `Структура { Ключ: Тип }`. Вложенные структуры
и колонки строки ТаблицыЗначений рекурсивно получают увеличенный отступ.
Слот под описание ключа зарезервирован форматом (заполняется отдельно).
Co-Authored-By: Claude Opus 4.8 <[email protected]>
…over Для параметра-структуры с задокументированными ключами («Параметры:» с вложенными «* Ключ - Тип - описание») в hover к каждому ключу добавляется описание из doc-комментария: «* **Ключ**: `Тип` — описание». Источник — ParameterDescription.types().fields() охватывающего метода; ключи, описанные в doc, но не выведенные инференсером, тоже отображаются. Заодно у «открытых» объектов с собственными полями (Структура/Соответствие) в заголовке типа убран шумный элемент-итератор «из КлючИЗначение» — содержимое и так показано списком ключей. Co-Authored-By: Claude Opus 4.8 <[email protected]>
WalkthroughPR standardизирует отображение необязательных параметров, заменяя локализованные маркеры на суффикс ChangesOptional Parameter Marking & Structure Field Rendering
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 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 |
There was a problem hiding this comment.
Pull request overview
Этот PR улучшает отображение сигнатур и типов в LSP-фичах (hover, signature help, completion): вводит единый маркер необязательных параметров ? и делает более читабельным вывод содержимого «открытых» объектов (Структура/Соответствие/фиксированные варианты/строка ТаблицыЗначений) в виде markdown-списка, включая описания ключей из doc-комментариев.
Changes:
- Перевод маркировки необязательных параметров на
?(вместо[...]/optionalParameter) в signature help, hover и completion detail. - Рендер содержимого структур/соответствий/строки ТЗ в hover переменных markdown-списком с поддержкой вложенности и union-типов.
- Подмешивание описаний ключей из doc-комментариев параметров-структур в hover.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java | Добавлена маркировка необязательных параметров ? в label сигнатуры. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java | В completion detail необязательные параметры теперь помечаются ? вместо квадратных скобок. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilder.java | Убрана текстовая пометка optionalParameter; добавлен ? в markdown-рендер параметров. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilder.java | Аналогично PlatformMemberHoverBuilder: ? для optional и обновлён рендер параметров. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java | В сигнатурах методов optional-параметры помечаются ? перед значением по умолчанию. |
| src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java | Новый рендер содержимого «открытых» объектов markdown-списком + doc-описания ключей. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProviderTest.java | Обновлены ожидания по ? для optional параметров без типа. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java | Обновлены ожидания: ? вместо [...], проверка отсутствия скобок. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilderTest.java | Обновлены ожидания markdown-рендера optional параметров с ?. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilderTest.java | Обновлены ожидания markdown-рендера optional параметров с ?. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java | Обновлены ожидания сигнатур: ? у optional параметров. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java | Добавлены проверки bullet-list рендера из инференса и doc-описаний ключей. |
| src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java | Новый детерминированный тест рендера пяти «открытых» типов через вручную заданный TypeSet. |
| var typeLabel = field.types().stream() | ||
| .map(td -> "`" + td.name() + "`") | ||
| .collect(Collectors.joining(" | ")); |
| for (var info : doc.values()) { | ||
| if (rendered.contains(info.name().toLowerCase(Locale.ROOT))) { | ||
| continue; | ||
| } | ||
| out.add(fieldBullet(pad, info.name(), info.typeLabel(), info.description())); | ||
| if (!info.children().isEmpty()) { | ||
| var childOut = new ArrayList<String>(); | ||
| collectDocOnlyBullets(childOut, info.children(), indent + 1); | ||
| out.addAll(childOut); | ||
| } |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilder.java (1)
189-196: ⚡ Quick winConsider extracting the duplicated optional parameter formatting logic.
The optional parameter rendering logic (lines 189-196) is identical to lines 97-105 in
ConstructorHoverBuilder. Consider extracting this into a shared utility method to improve maintainability and ensure consistent formatting across both builders.♻️ Example refactored approach
Create a shared helper method:
private static void appendParameterNameAndType( StringBuilder sb, String displayName, String typesLabel, boolean optional) { sb.append("- `").append(displayName); if (typesLabel.isEmpty()) { sb.append(optional ? "?" : "").append('`'); } else { sb.append("`: ").append(typesLabel).append(optional ? "?" : ""); } }Then both builders can call:
appendParameterNameAndType(sb, p.displayName(lang), typesLabel, p.optional());🤖 Prompt for 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. In `@src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilder.java` around lines 189 - 196, The duplicated optional-parameter formatting in PlatformMemberHoverBuilder (around the sb.append block using p.displayName(lang), renderTypeSet(p.types(), lang), and p.optional()) and the identical block in ConstructorHoverBuilder should be extracted to a shared helper to avoid duplication and ensure consistency; add a static utility method (e.g., appendParameterNameAndType) that accepts a StringBuilder, displayName, typesLabel, and optional boolean and implements the current conditional logic, then replace the duplicated code blocks in both PlatformMemberHoverBuilder and ConstructorHoverBuilder with a single call to that helper.src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilderTest.java (1)
180-196: 💤 Low valueConsider adding test coverage for optional parameter without type.
The test
buildRendersOptionalParameterWithDefaultValueverifies optional parameters that have a type (TypeSet.of(NUMBER)). Consider adding a test case for an optional parameter with an emptyTypeSetto verify the format`ParamName?`is rendered correctly.📝 Example test case
`@Test` void buildRendersOptionalParameterWithoutType() { // given var param = new ParameterDescriptor( BilingualString.of("Опц"), TypeSet.EMPTY, true, BilingualString.EMPTY, ""); var sig = new SignatureDescriptor(List.of(param), TypeSet.EMPTY, ""); // when var content = builder.build("X", STRUCTURE, sig, List.of(sig), false, ""); // then assertThat(content.getValue()) .contains("`Опц?`") .doesNotContain("[optionalParameter]"); }🤖 Prompt for 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. In `@src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilderTest.java` around lines 180 - 196, Add a new unit test (e.g., buildRendersOptionalParameterWithoutType) alongside buildRendersOptionalParameterWithDefaultValue that constructs a ParameterDescriptor with BilingualString.of("Опц"), TypeSet.EMPTY, true, BilingualString.EMPTY and empty default value, wraps it in a SignatureDescriptor, calls builder.build("X", STRUCTURE, sig, List.of(sig), false, ""), and asserts that content.getValue() contains "`Опц?`" and doesNotContain("[optionalParameter]"); this verifies the optional-parameter-without-type formatting.
🤖 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/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java`:
- Around line 245-247: elemJoined currently joins elementTypes.refs() with ", "
which breaks the union formatting contract; in
VariableSymbolMarkupContentBuilder change the stream collect call that builds
elemJoined (the map using inlineTypeLabel(elementTypes, r, lang, code)) to use
Collectors.joining(" | ") so collection element unions render with the same " |
" separator as field types.
---
Nitpick comments:
In
`@src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilder.java`:
- Around line 189-196: The duplicated optional-parameter formatting in
PlatformMemberHoverBuilder (around the sb.append block using
p.displayName(lang), renderTypeSet(p.types(), lang), and p.optional()) and the
identical block in ConstructorHoverBuilder should be extracted to a shared
helper to avoid duplication and ensure consistency; add a static utility method
(e.g., appendParameterNameAndType) that accepts a StringBuilder, displayName,
typesLabel, and optional boolean and implements the current conditional logic,
then replace the duplicated code blocks in both PlatformMemberHoverBuilder and
ConstructorHoverBuilder with a single call to that helper.
In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilderTest.java`:
- Around line 180-196: Add a new unit test (e.g.,
buildRendersOptionalParameterWithoutType) alongside
buildRendersOptionalParameterWithDefaultValue that constructs a
ParameterDescriptor with BilingualString.of("Опц"), TypeSet.EMPTY, true,
BilingualString.EMPTY and empty default value, wraps it in a
SignatureDescriptor, calls builder.build("X", STRUCTURE, sig, List.of(sig),
false, ""), and asserts that content.getValue() contains "`Опц?`" and
doesNotContain("[optionalParameter]"); this verifies the
optional-parameter-without-type formatting.
🪄 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: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: f9219932-21e8-46c3-846f-8357d310838d
📒 Files selected for processing (13)
src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilderTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilderTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProviderTest.java
Ревью (Copilot/CodeRabbit): - doc-типы ключей с перечислением через запятую («Строка, Число») разворачиваются в union через « | », а не одним токеном; - doc-only ключи больше не дублируются при union-типах (Структура | Неопределено): collectFieldBullets работает по всему TypeSet, ключи дедуплицируются по имени, doc-only секция формируется один раз; - union типов элемента коллекции тоже через « | »; - общий хелпер HoverParameters.appendNameAndType вместо дублирования логики «?» в PlatformMemberHoverBuilder и ConstructorHoverBuilder. Sonar: - collectDocOnlyBullets/docFieldsFromTypes сделаны static (S2325); - явные скобки в тернаре (S864); - toSignatureInformation разгружен: отрисовка параметра вынесена в appendParameter (S1541, цикломатика); - убран неиспользуемый импорт Trees (S1128); - в тесте убраны лишние eq(...) (S6068) и комментарии-псевдокод (S125). Co-Authored-By: Claude Opus 4.8 <[email protected]>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java (1)
537-540: 💤 Low valueРазделитель типов «, » внутри метки параметра неоднозначен.
renderTypes(строки 597‑611) склеивает несколько типов через,, поэтому в метке получается, например,Метод(П: Строка, Число?)— запятая визуально неотличима от разделителя параметров. В hover-карточках (ConstructorHoverBuilder.renderTypeSet) объединение типов рендерится через|. Для единообразия и читаемости стоит использовать|и здесь.♻️ Возможная правка
private String renderTypes(TypeSet types, Language lang) { if (types == null || types.isEmpty()) { return ""; } var sb = new StringBuilder(); boolean first = true; for (var ref : types.refs()) { if (!first) { - sb.append(", "); + sb.append(" | "); } sb.append(typeService.displayName(ref, lang)); first = false; } return sb.toString(); }Учтите, что это затронет ожидания существующих тестов signature help.
🤖 Prompt for 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. In `@src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java` around lines 537 - 540, The parameter type separator is ambiguous in signature labels; update the code so signature help uses " | " between union types instead of ", ". Modify the call in SignatureHelpProvider (the lines using renderTypes(p.types(), lang) and label.append) to use a variant that joins types with " | " (either by adding an overload/parameter to renderTypes or by introducing a new helper like renderTypesForSignature that calls the existing rendering logic but uses " | " as the delimiter), and ensure the produced typesLabel is appended unchanged to the label; adjust tests that expect the old ", " separator accordingly.
🤖 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.
Nitpick comments:
In
`@src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java`:
- Around line 537-540: The parameter type separator is ambiguous in signature
labels; update the code so signature help uses " | " between union types instead
of ", ". Modify the call in SignatureHelpProvider (the lines using
renderTypes(p.types(), lang) and label.append) to use a variant that joins types
with " | " (either by adding an overload/parameter to renderTypes or by
introducing a new helper like renderTypesForSignature that calls the existing
rendering logic but uses " | " as the delimiter), and ensure the produced
typesLabel is appended unchanged to the label; adjust tests that expect the old
", " separator accordingly.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 599fb71a-0be5-4dc0-9064-cc9d742380ee
📒 Files selected for processing (7)
src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorHoverBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/HoverParameters.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java
🚧 Files skipped from review as they are similar to previous changes (3)
- src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberHoverBuilder.java
- src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java
- src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java
|



Что сделано
Три связанных улучшения отображения параметров и структур в hover, signature help и автокомплите.
1. Необязательные параметры помечаются «?»
Знак приклеивается к типу (
Имя: Тип?), а при отсутствии типа — к имени (Имя?), перед значением по умолчанию:Имя: Тип?,Имя: Тип? = -10,Имя?,Имя? = ЛожьЗатронуты
SignatureHelpProvider,PlatformMemberHoverBuilder,ConstructorHoverBuilder,DescriptionFormatter(исходные методы) иCompletionProvider.formatSignature(где ранее использовались квадратные скобки[Имя]).2. Содержимое структур/соответствий — маркдаун-списком
Вместо однострочного
Структура { Ключ: Тип }:Работает для
Структура,ФиксированнаяСтруктура,Соответствие,ФиксированноеСоответствиеи строкиТаблицаЗначений(колонки подТип: ТаблицаЗначений из СтрокаТаблицыЗначений). Вложенные структуры и колонки получают отступ, объединения типов —`A` | `B`.3. Описания ключей из doc-комментария параметра
Для параметра-структуры с задокументированными ключами к каждому ключу добавляется описание:
Источник —
ParameterDescription.types().fields()охватывающего метода. Ключи, описанные в doc, но не выведенные инференсером, тоже отображаются. Заодно у «открытых» объектов с собственными полями из заголовка убран шумный элемент-итераториз КлючИЗначение.Тесты
Добавлены/обновлены тесты в
SignatureHelpProviderTest,CompletionProviderTest,PlatformMemberHoverBuilderTest,ConstructorHoverBuilderTest,MethodSymbolMarkupContentBuilderTest,VariableSymbolMarkupContentBuilderTestи новыйVariableSymbolStructureRenderTest(детерминированный рендер всех пяти типов). Прогон поhover.*, провайдерам signature/completion/hover иtypes.*зелёный.🤖 Generated with Claude Code