Skip to content

fix(types): поля структуры из возврата функции (в т.ч. межмодульно) + bump bsl-parser 0.36.0#4122

Merged
nixel2007 merged 6 commits into
developfrom
feature/bump-bsl-parser-0.36.0
Jun 15, 2026
Merged

fix(types): поля структуры из возврата функции (в т.ч. межмодульно) + bump bsl-parser 0.36.0#4122
nixel2007 merged 6 commits into
developfrom
feature/bump-bsl-parser-0.36.0

Conversation

@nixel2007

@nixel2007 nixel2007 commented Jun 15, 2026

Copy link
Copy Markdown
Member

Исходный репорт: НовыеСвойстваПодписи = ЭлектроннаяПодписьКлиентСервер.НовыеСвойстваПодписи(); → после точки нет автокомплита/hover ключей структуры, а в hover нет описаний полей.

Тремя слоями. Все чинятся.

1. Парсинг многострочного составного типа поля (bsl-parser 0.36.0)

Бамп bsl-parser 0.35.00.36.0 (#390). Continuation-строка типа поля (std453 п.5.3) «разрезала» структуру возврата на второй тип верхнего уровня.

2. Потеря полей при МЕЖМОДУЛЬНОМ вызове

ОбщийМодуль.Метод() резолвился через MemberDescriptor с голым TypeRef без localFields. inferDereference теперь для member-метода с source-символом MethodSymbol берёт полный тип из SymbolTypeIndex.getDeclaredReturnTypes (с полями) — как одномодульный вызов.

3. Текстовые описания полей в hover/автокомплите

TypeSet.localFields теперь несёт LocalField(types, description) — единое представление (без параллельных карт). Описания берутся в SymbolTypeIndex.applyFields из JsDoc (Параметры/Возвращаемое значение) и текут через union/withField. Потребители: hover по переменной-структуре, hover по полю (X.Поле), documentation автокомплита — раньше описания подмешивались только для переменных-параметров. getLocalFields(ref)Map<String, LocalField> (единый источник).

Архитектура согласована с пользователем и проверена ревью-агентом (вариант A: единый rich-аксессор).

Тесты

  • Парсер: ReturnStructureMultilineFieldTypeInferenceTest (синтетика), RealReturnStructureCompletionTest (реальный JsDoc БСП: completion + hover + описания).
  • Межмодульно: CrossModuleStructureReturnInferenceTest.
  • Модель: TypeSetTest (withField c описанием, union-merge — первое непустое).
  • Регрессия types/hover/completion/signatureHelp: 1536 тестов, 0 падений.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Chores
    • Updated the bundled BSL parser to the latest stable version.
  • Bug Fixes
    • Improved type inference for member access reached via method calls using the method’s declared return types.
    • Enhanced structure/map field metadata so dot-completion and hover consistently show JsDoc descriptions (including multiline/nested fields), and avoid blank descriptions when docs are missing.
  • Tests
    • Added/expanded coverage for multiline Структура return fields, cross-module structure inference, and real-document dot-completion/hover behavior.
    • Added tests for local field description handling in TypeSet unions/merges.

0.36.0 чинит разбор многострочного составного типа поля в описании
метода (std453 п.5.3): раньше continuation-строка типа "разрезала"
структуру возвращаемого значения на второй тип верхнего уровня, и
автокомплит после точки не показывал часть ключей структуры.

Добавлен инференс-тест: тип переменной, присвоенной из вызова функции
с таким JsDoc, выводится как единый Структура со всеми полями (а не
{Структура, Строка}); поле с многострочным типом несёт оба типа.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@coderabbitai

coderabbitai Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Introduces LocalField record to pair types and descriptions, refactors TypeSet.localFields to use LocalField instead of raw TypeSet, updates SymbolTypeIndex to extract field descriptions from metadata and attach them via enhanced withField(...) APIs. ExpressionTypeInferencer preserves field descriptions and resolves method call return types via symbolTypeIndex.getDeclaredReturnTypes(...). IDE providers (CompletionProvider, DereferenceMemberMatcher, VariableSymbolMarkupContentBuilder) are updated to surface field descriptions in completion and hover. Bumps bsl-parser to 0.36.0. Adds three test classes validating multiline field inference, cross-module structure returns, and real completion/hover behavior for return structure descriptions.

Changes

LocalField model, TypeSet refactoring, and return structure metadata handling

Layer / File(s) Summary
LocalField record and factory/merge helpers
src/main/java/.../types/model/LocalField.java
Adds new LocalField record with TypeSet types and String description components. Compact constructor normalizes null inputs. Includes of(TypeSet) static factory for empty descriptions and merge(first, second) to union types and deterministically select the first non-blank description.
TypeSet refactoring to use LocalField
src/main/java/.../types/model/TypeSet.java, src/test/java/.../types/model/TypeSetTest.java
Updates TypeSet record to change localFields mapping from TypeSet to LocalField values. Compact constructor, union method, and field-attachment APIs (withField overloads) work with LocalField. Retrieval methods getLocalFields and getFieldTypes access underlying LocalField.types(). Test coverage verifies field description preservation and union behavior.
SymbolTypeIndex field description extraction
src/main/java/.../types/index/SymbolTypeIndex.java
Adds ParameterDescription dependency and updates applyFields to derive field descriptions and pass to TypeSet.withField(..., description). New helper fieldDescription(ParameterDescription) extracts the first non-blank TypeDescription.description from field types or falls back to empty string.
ExpressionTypeInferencer metadata preservation and method return types
src/main/java/.../types/inferencer/ExpressionTypeInferencer.java
Updates to handle LocalField decoration: collectKeyValueFields and inferDereference (PROPERTY path) union via entry.getValue().types(). When dereferencing a method call member (expectedKind == METHOD), resolves method's declared return types and unions them, skipping prior enrichment. Field enrichment via enrichReturnRefWithElementFields preserves both types and descriptions.
CompletionProvider and DereferenceMemberMatcher field descriptions
src/main/java/.../providers/CompletionProvider.java, src/main/java/.../types/DereferenceMemberMatcher.java
CompletionProvider.dotCompletion passes field.description() into MemberDescriptor.property(...) for declared local fields. DereferenceMemberMatcher.collectLocalFieldMembers derives field reference from field.types().refs() and sets MemberDescriptor description to field.description().
VariableSymbolMarkupContentBuilder hover rendering
src/main/java/.../hover/VariableSymbolMarkupContentBuilder.java
Updates to render field descriptions from LocalField model: collectFieldBullets uses doc-comment description when present and non-blank, otherwise normalizes field's own description. collectFields reworked to return Map&lt;String, LocalField&gt; and merge using LocalField::merge.
bsl-parser dependency version bump
build.gradle.kts
Updates io.github.1c-syntax:bsl-parser from 0.35.0 to 0.36.0 in the api(...) runtime dependency declaration.
Multiline field type inference test
src/test/java/.../types/ReturnStructureMultilineFieldTypeInferenceTest.java
ReturnStructureMultilineFieldTypeInferenceTest loads a .bsl fixture with multiline composite field descriptions, infers types at a marker, and asserts the top-level type is Структура with expected local fields and that the multiline field Подпись preserves both component types. Includes inferAtMarker helper for marker-based position computation.
Cross-module structure return inference test
src/test/java/.../types/CrossModuleStructureReturnInferenceTest.java
CrossModuleStructureReturnInferenceTest verifies inter-module method calls returning Структура retain expected local fields with preserved multiline-described types. Helper at() computes line/character position from marker strings and queries inferred types.
Real return structure completion and hover test
src/test/java/.../providers/RealReturnStructureCompletionTest.java
RealReturnStructureCompletionTest validates IDE behavior for real return structure descriptions: completion exposes all documented field labels, hover on the variable exposes field descriptions from JSDoc, hover on specific field names shows field-level descriptions, and completion items carry documentation. Helpers load test resource, locate markers, and convert text offsets to LSP positions.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested reviewers

  • theshadowco

Poem

🐇 With LocalField in sight, descriptions take flight,
From TypeSet's bare values to metadata-bright!
Multiline Подпись holds both types with care,
Method returns fully resolved, everywhere.
The bunny hops through completion and hover so fair,
Return structures shine—documented everywhere!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.12% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title clearly describes the main fix: structure fields from function returns (including cross-module) and bsl-parser version bump to 0.36.0, which aligns with the changeset's primary objectives.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/bump-bsl-parser-0.36.0

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 and usage tips.

@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/test/java/com/github/_1c_syntax/bsl/languageserver/types/ReturnStructureMultilineFieldTypeInferenceTest.java`:
- Around line 75-77: The indexOf call for the marker variable on the line
assigning to markerStart can return -1 if the marker is not found in the content
string. Add an explicit guard immediately after the indexOf assignment that
checks if markerStart equals -1, and if so, throw an exception with a
descriptive message that includes the missing marker value. This prevents
subsequent calculations using targetOffset and lineStart from producing
misleading results that could hide fixture regressions.
🪄 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: b45b0377-2e92-4389-bf0f-5a5b6ec0ebd3

📥 Commits

Reviewing files that changed from the base of the PR and between c344dcf and c6454f1.

⛔ Files ignored due to path filters (1)
  • src/test/resources/types/ReturnStructureMultilineFieldType.bsl is excluded by !src/test/resources/**
📒 Files selected for processing (2)
  • build.gradle.kts
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ReturnStructureMultilineFieldTypeInferenceTest.java

Проверка на реальном JsDoc ЭлектроннаяПодписьКлиентСервер.НовыеСвойстваПодписи
(а не синтетическом): после фикса разбора многострочного составного типа поля
(bsl-parser 0.36.0) completion после точки и hover по переменной показывают
все поля структуры, включая объявленные многострочным типом.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

@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/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RealReturnStructureCompletionTest.java`:
- Around line 57-58: The code calls indexOf to find marker strings and
immediately uses the returned offsets to compute positions without checking if
the markers were actually found. If indexOf returns -1 (when the marker is
missing), it gets used in arithmetic operations that produce misleading offset
values passed to positionAtOffset. Add explicit precondition assertions
immediately after each indexOf call to verify that the found offset is not -1
before using it to calculate the position, ensuring that missing marker strings
cause clear test failures rather than subtle misleading behavior.
🪄 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: 5118647b-06aa-4bc2-a279-63eebe9c6f8c

📥 Commits

Reviewing files that changed from the base of the PR and between c6454f1 and cfec29b.

⛔ Files ignored due to path filters (1)
  • src/test/resources/types/RealSignaturePropertiesReturn.bsl is excluded by !src/test/resources/**
📒 Files selected for processing (1)
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RealReturnStructureCompletionTest.java

…зова

Вызов экспортной функции другого общего модуля (ОбщийМодуль.Метод())
резолвился через MemberDescriptor, чей returnType — лишь головной TypeRef
без localFields. Поэтому поля структуры/ТЗ, объявленные в JsDoc, терялись,
и автокомплит/hover по точке от результата межмодульного вызова не видели
ключей (в отличие от вызова внутри того же модуля).

inferDereference теперь для member-метода с source-символом MethodSymbol
берёт полный тип возврата из SymbolTypeIndex.getDeclaredReturnTypes (с
localFields) — тем же путём, что и одномодульный вызов.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@nixel2007 nixel2007 changed the title build(deps): обновить bsl-parser до 0.36.0 fix(types): поля структуры из возврата функции (в т.ч. межмодульно) + bump bsl-parser 0.36.0 Jun 15, 2026

@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/test/java/com/github/_1c_syntax/bsl/languageserver/types/CrossModuleStructureReturnInferenceTest.java`:
- Around line 72-77: The helper method computes a position based on a marker in
the content without validating that the marker was actually found. When
indexOf(marker) returns -1 (marker not found), the subsequent calculations for
targetOffset, lineStart, line, and charInLine become invalid and may query the
wrong location silently. After the indexOf(marker) call, add an explicit
assertion or check to verify that markerStart is not -1, and fail fast with a
clear error message if the marker is missing from the content.
🪄 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: 2d4b34cf-4d2a-4564-b1ae-8beb2e241c8b

📥 Commits

Reviewing files that changed from the base of the PR and between cfec29b and 72c7ff1.

⛔ Files ignored due to path filters (2)
  • src/test/resources/metadata/designer/CommonModules/ОбщегоНазначения/Ext/Module.bsl is excluded by !src/test/resources/**
  • src/test/resources/types/CrossModuleStructureReturn.bsl is excluded by !src/test/resources/**
📒 Files selected for processing (2)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/ExpressionTypeInferencer.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CrossModuleStructureReturnInferenceTest.java

@github-actions

Copy link
Copy Markdown
Contributor

Test Results

 3 432 files   3 432 suites   1h 40m 45s ⏱️
 3 399 tests  3 381 ✅  18 💤 0 ❌
20 394 runs  20 286 ✅ 108 💤 0 ❌

Results for commit 72c7ff1.

nixel2007 and others added 2 commits June 15, 2026 15:20
Поля «открытого» объекта (localFields) теперь несут не только типы, но и
текстовое описание из doc-комментария (LocalField(types, description)).
Источник — SymbolTypeIndex.applyFields (секции Параметры/Возвращаемое
значение); описание течёт через union/withField в тип переменной.

Потребители: hover по переменной-структуре и по отдельному полю (X.Поле),
а также documentation элемента автокомплита — теперь показывают описание
поля, в т.ч. для локальной переменной из возврата функции (раньше описания
подмешивались только для переменных-параметров).

getLocalFields(ref) возвращает Map<String, LocalField> (единый источник,
без параллельных структур); рантайм-ключи (.Вставить/колонки) — с пустым
описанием через 3-арг withField.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Гард на indexOf == -1 в хелперах вычисления позиции по маркеру: при
отсутствии маркера тест падает с понятным сообщением, а не считает
ложную позицию и не прячет регресс фикстуры за невнятным ассертом.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>

@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.

♻️ Duplicate comments (1)
src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RealReturnStructureCompletionTest.java (1)

58-58: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Guard marker lookups before offset math.

Each indexOf(...) result is used immediately to build an offset. If a marker is absent, the test can fail at an unrelated position instead of failing with a clear cause. Add explicit assertions after every marker lookup.

Proposed patch
@@
   void completionAfterDotExposesAllStructureFields() {
@@
-    var afterDot = content.indexOf("Свойства.", content.indexOf("X = Свойства.")) + "Свойства.".length();
+    var assignOffset = content.indexOf("X = Свойства.");
+    assertThat(assignOffset).isGreaterThanOrEqualTo(0);
+    var dotOffset = content.indexOf("Свойства.", assignOffset);
+    assertThat(dotOffset).isGreaterThanOrEqualTo(0);
+    var afterDot = dotOffset + "Свойства.".length();
@@
   void hoverOnVariableExposesStructureFields() {
@@
-    var varOffset = content.indexOf("Свойства = НовыеСвойстваПодписи()") + 1;
+    var assignmentOffset = content.indexOf("Свойства = НовыеСвойстваПодписи()");
+    assertThat(assignmentOffset).isGreaterThanOrEqualTo(0);
+    var varOffset = assignmentOffset + 1;
@@
   void hoverOnFieldExposesFieldDescription() {
@@
-    var dotField = content.indexOf(".Подпись") + 1;
+    var fieldOffset = content.indexOf(".Подпись");
+    assertThat(fieldOffset).isGreaterThanOrEqualTo(0);
+    var dotField = fieldOffset + 1;
@@
   void completionItemCarriesFieldDescription() {
@@
-    var afterDot = content.indexOf("Свойства.", content.indexOf("X = Свойства.")) + "Свойства.".length();
+    var assignOffset = content.indexOf("X = Свойства.");
+    assertThat(assignOffset).isGreaterThanOrEqualTo(0);
+    var dotOffset = content.indexOf("Свойства.", assignOffset);
+    assertThat(dotOffset).isGreaterThanOrEqualTo(0);
+    var afterDot = dotOffset + "Свойства.".length();

Also applies to: 83-83, 106-106, 125-125

🤖 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/providers/RealReturnStructureCompletionTest.java`
at line 58, Add explicit assertions to guard each indexOf marker lookup before
performing offset arithmetic. In the RealReturnStructureCompletionTest class,
locate all lines where indexOf is used to find markers and immediately assert
the result is not -1 (indicating the marker was found). This applies at multiple
sites: line 58 where indexOf is used to find "X = Свойства." and "Свойства.",
line 83, line 106, and line 125. For each indexOf call used in offset
calculations (like the afterDot assignment and similar patterns), insert an
assertion immediately after the lookup to verify the marker exists before using
the result in arithmetic operations, ensuring test failures clearly indicate
missing markers rather than failing at unrelated positions due to incorrect
offsets.
🤖 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.

Duplicate comments:
In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RealReturnStructureCompletionTest.java`:
- Line 58: Add explicit assertions to guard each indexOf marker lookup before
performing offset arithmetic. In the RealReturnStructureCompletionTest class,
locate all lines where indexOf is used to find markers and immediately assert
the result is not -1 (indicating the marker was found). This applies at multiple
sites: line 58 where indexOf is used to find "X = Свойства." and "Свойства.",
line 83, line 106, and line 125. For each indexOf call used in offset
calculations (like the afterDot assignment and similar patterns), insert an
assertion immediately after the lookup to verify the marker exists before using
the result in arithmetic operations, ensuring test failures clearly indicate
missing markers rather than failing at unrelated positions due to incorrect
offsets.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 009bb8af-7fcb-4f57-a596-63cdd73b6b50

📥 Commits

Reviewing files that changed from the base of the PR and between 72c7ff1 and 76d8ba3.

📒 Files selected for processing (10)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/DereferenceMemberMatcher.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/index/SymbolTypeIndex.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/ExpressionTypeInferencer.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/model/LocalField.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/model/TypeSet.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/RealReturnStructureCompletionTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ReturnStructureMultilineFieldTypeInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/model/TypeSetTest.java
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ReturnStructureMultilineFieldTypeInferenceTest.java

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
@nixel2007
nixel2007 merged commit b0d3bfc into develop Jun 15, 2026
28 of 29 checks passed
@nixel2007
nixel2007 deleted the feature/bump-bsl-parser-0.36.0 branch June 15, 2026 13:34
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
B Maintainability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

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.

1 participant