Skip to content

Резолв типа ресивера-модуля и позиционный API TypeService (#3991)#3993

Merged
nixel2007 merged 4 commits into
developfrom
refactor/typeservice-positional-api
Jun 2, 2026
Merged

Резолв типа ресивера-модуля и позиционный API TypeService (#3991)#3993
nixel2007 merged 4 commits into
developfrom
refactor/typeservice-positional-api

Conversation

@nixel2007
Copy link
Copy Markdown
Member

@nixel2007 nixel2007 commented Jun 2, 2026

Стек из трёх логически связанных изменений (фикс → рефакторинг), все в области вывода типов по позиции.

1. Фикс #3991 — автодополнение/signature help на члене общего модуля

ОбщегоНазначения.Метод() не резолвил тип ресивера. Root cause: голое имя общего модуля резолвится в ModuleSymbol, а inferSymbol(ModuleSymbol) знал только OneScript-library-модули и для BSL-модуля конфигурации возвращал пусто. Фикс: inferModuleAsType берёт зарегистрированный конфигурационный тип модуля. Чинит и completion, и signature help через штатный findTypes.

2. Единый источник типа модуля-значения

inferModuleAsType лазил в два URI-ключевых подсистемных индекса (oScriptLibraryIndex + ConfigurationModuleMembersProvider). Введён обратный индекс URI → тип в GlobalScopeProvider (единый авторитет), наполняемый провайдерами регистрации модулей синхронно. Инференсер теряет 2 зависимости. Обновления race-safe (синхронные листенеры, ConcurrentHashMap), удаление library — в unregister(uri).

3. Реархитектура позиционного API TypeService

Поверхность для консьюмеров сведена к двум самодостаточным точкам входа — typesAt(...) (тип значения в позиции; перегрузка по Reference) и receiverTypesAt(...) (тип ресивера доступа к члену: именованный/mid-call/висячая точка — без оркестрации в провайдерах). Удалён некогерентный findTypes(SourceDefinedSymbol). Ховер переведён на reference-ориентированный контракт MarkupContentBuilder.getContent(Reference) (без дублирующего symbol-параметра, дженерик убран). findMemberAt/findMembersAtmemberAt/membersAt.

Все тесты зелёные (142 сьюта по затронутым областям: types/providers/hover/inlay/semantictokens/diagnostics).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • More accurate hover content, diagnostics and inlay hints across symbol kinds.
    • Improved completion for members inside mid-call expressions.
    • More reliable signature help for common-module and receiver-based calls.
    • Enhanced expression/argument type inference, reducing incorrect suggestions.
  • New Features

    • Hover/content builders are now reference-aware for richer, context-correct information.
    • Module-to-type indexing keeps module types in sync for cross-module features.
  • Tests

    • Added/updated tests for hover, completion, signature help and type inference.

nixel2007 and others added 2 commits June 2, 2026 13:11
Автодополнение/signature help на вызове метода общего модуля
(ОбщегоНазначения.Метод()) не работали: тип ресивера не выводился.

Root cause: ссылка на голое имя общего модуля резолвится
ReferenceIndexReferenceFinder'ом в ModuleSymbol, а inferSymbol(ModuleSymbol)
→ inferModuleAsType знал только OneScript-library-модули (по URI в
oScriptLibraryIndex) и для BSL-модуля конфигурации возвращал EMPTY.
Поэтому findTypes на ресивере давал пусто, и члены/сигнатура не находились.

Фикс точечный: inferModuleAsType дополнительно берёт зарегистрированный
конфигурационный тип модуля по URI документа из
ConfigurationModuleMembersProvider (там общий модуль уже зарегистрирован
как CONFIGURATION-тип). Этого достаточно — completion и signature help
чинятся через штатный findTypes, без правок в провайдерах.

Помечен арх. долг (TODO + задачи): оба типа модулей уже лежат в
GlobalScopeProvider по имени, и резолв стоит свести к одному источнику
вместо двух URI-индексов.

Тесты: findTypes на ресивере-модуле (root-cause), completion mid-call,
signature help на методе общего модуля.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…vider

Рефактор (задача #1): инференсер больше не обращается к двум URI-ключевым
подсистемным индексам (oScriptLibraryIndex + ConfigurationModuleMembersProvider)
ради восстановления типа ресивера-модуля. Тип теперь берётся из единого
обратного индекса URI→TypeRef в GlobalScopeProvider.

Почему так: GlobalScopeProvider уже владеет обоими типами модулей по ИМЕНИ
(общий модуль — PLATFORM_GLOBAL_PROPERTY, library — LIBRARY_MODULE), но у
inferSymbol(ModuleSymbol) на руках URI, а не имя — не хватало обратного
lookup'а у самого авторитета, и его обходили через чужие индексы.

- GlobalScopeProvider: indexModuleType/removeModuleType/moduleTypeByUri(URI).
- Писатели — те же провайдеры регистрации модулей, синхронно рядом с
  регистрацией имени (URI у них на руках): общий/менеджер/объектный модуль
  (ConfigurationModuleMembersProvider) и library-модуль (OScriptModuleMembersProvider);
  снятие library — в его unregister(uri).
- ExpressionTypeInferencer.inferModuleAsType — один вызов moduleTypeByUri;
  удалены зависимости OScriptLibraryIndex и ConfigurationModuleMembersProvider
  (минус 2 коллаборатора, задача #2), снят мёртвый typeForUri (#3991).

Race-safety: обновления синхронные (event-листенеры не @async), в тех же
хендлерах, ConcurrentHashMap; переименование — перезапись по URI; удаление
library — remove(uri). Общий модуль без листенера удаления и reindex
библиотек протекают ровно как существующий name-индекс (паритет, не регресс).

Тест: lifecycle обратного индекса (register→present, unregister→cleared).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Jun 2, 2026

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

Renames member lookup APIs to memberAt/membersAt, adds Reference-driven type entry points (typesAt, expressionTypesAt), changes hover builders to accept Reference, indexes module types by URI in GlobalScopeProvider, updates provider/diagnostic/inlay flows, and migrates many tests.

Changes

Type Resolution and Hover Markup Refactoring

Layer / File(s) Summary
TypeService API refactor
src/main/java/.../types/TypeService.java
Adds typesAt(Reference) and expressionTypesAt(DocumentContext, Position); renames findMemberAt/findMembersAtmemberAt/membersAt; expands receiverTypesAt for dangling-dot scenarios.
Module URI indexing & inferencer
src/main/java/.../types/registry/GlobalScopeProvider.java, src/main/java/.../types/oscript/OScriptModuleMembersProvider.java, src/main/java/.../types/registry/ConfigurationModuleMembersProvider.java, src/main/java/.../types/inferencer/ExpressionTypeInferencer.java
Adds URI→TypeRef reverse index APIs (indexModuleType, removeModuleType, moduleTypeByUri); providers index/remove module types; inferencer resolves module types via GlobalScopeProvider.
MarkupContentBuilder contract change
src/main/java/.../hover/MarkupContentBuilder.java, src/main/java/.../hover/MarkupContentBuilderConfiguration.java
Converts generic MarkupContentBuilder<T extends Symbol> → non-generic MarkupContentBuilder with getContent(Reference), and updates Spring bean registry typing.
Hover builder implementations
src/main/java/.../hover/*
All hover builders now accept Reference and cast reference.symbol() to their symbol type; Variable hover uses typeService.typesAt(reference) and formatted inferred-type helper now accepts a TypeSet.
Providers and diagnostics
src/main/java/.../providers/*, src/main/java/.../diagnostics/*, src/main/java/.../inlayhints/*, src/main/java/.../references/*, src/main/java/.../semantictokens/*
HoverProvider passes Reference to builders; Completion/SignatureHelp use receiverTypesAt and expressionTypesAt; diagnostics, inlay hints, platform-member reference finding, and semantic tokens use memberAt/membersAt and expression-based type queries where applicable.
Tests updated
src/test/java/.../*
Updated tests to construct/pass Reference instances and to call typesAt/expressionTypesAt instead of findTypes/inferAtPosition; added common-module completion and signature-help regression tests and a filesystem watcher test for module-type indexing lifecycle.

Sequence Diagram(s)

sequenceDiagram
  participant Editor
  participant CompletionProvider
  participant SignatureHelpProvider
  participant TypeService
  participant GlobalScopeProvider
  Editor->>CompletionProvider: request completion at dot
  CompletionProvider->>TypeService: receiverTypesAt(documentContext, position)
  Editor->>SignatureHelpProvider: request signature help inside call
  SignatureHelpProvider->>TypeService: expressionTypesAt(documentContext, argStart)
  SignatureHelpProvider->>TypeService: receiverTypesAt(documentContext, memberPos)
  TypeService->>GlobalScopeProvider: moduleTypeByUri(uri) (when needed)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

hacktoberfest-accepted

Suggested reviewers

  • theshadowco
  • sfaqer

Poem

"A rabbit nibbled through the code at night,
Typed members, indexed URIs, made resolution bright,
References snug, hover and hints in tow,
Tests hopped along — now everything flows,
🐇 — hop, build, and go."

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/typeservice-positional-api

@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch 2 times, most recently from 6acc243 to d80c81a Compare June 2, 2026 13:44
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilder.java (1)

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

Fix the JavaDoc target type.

The class and getSymbolClass() handle AnnotationParamSymbol, but the JavaDoc still says AnnotationSymbol. That leaves the public contract misleading right where this API was changed.

📝 Proposed fix
-/**
- * Построитель контента для всплывающего окна для {`@link` AnnotationSymbol}.
- */
+/**
+ * Построитель контента для всплывающего окна для {`@link` AnnotationParamSymbol}.
+ */

As per coding guidelines, "Write JavaDoc for public APIs, include comments for complex logic, and keep documentation up to date with code changes".

🤖 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/AnnotationParamSymbolMarkupContentBuilder.java`
around lines 36 - 41, Update the class JavaDoc to reference the correct target
type: replace the incorrect {`@link` AnnotationSymbol} with {`@link`
AnnotationParamSymbol} (the class AnnotationParamSymbolMarkupContentBuilder and
its getSymbolClass() already operate on AnnotationParamSymbol) so the public
documentation matches the actual API and implementation.
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeService.java (1)

108-112: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Preserve the legacy returnType() fallback for platform-member references.

Lines 108-112 only read descriptor.returnTypes(). ExpressionTypeInferencer#inferDereference still falls back to descriptor.returnType() for members that have not been migrated yet, so typesAt(reference) now returns empty for those same references. That makes the new reference-based path weaker than the existing AST path and can drop hover/type info for legacy platform members.

Proposed fix
     if (reference.symbol() instanceof PlatformMemberSymbol platformMember) {
-      var returnTypes = platformMember.getDescriptor().returnTypes();
+      var descriptor = platformMember.getDescriptor();
+      var returnTypes = descriptor.returnTypes();
       if (returnTypes != null && !returnTypes.isEmpty()) {
         return returnTypes;
       }
+      var returnType = descriptor.returnType();
+      if (returnType != null && !returnType.equals(TypeRef.UNKNOWN)) {
+        return TypeSet.of(returnType);
+      }
     }
🤖 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/types/TypeService.java`
around lines 108 - 112, The platform-member branch only uses
platformMember.getDescriptor().returnTypes() and drops legacy single
returnType(), so restore the fallback: when reference.symbol() is a
PlatformMemberSymbol and descriptor.returnTypes() is null or empty, call
platformMember.getDescriptor().returnType(), convert it into the expected
collection (if non-null/non-empty) and return that instead; update the code
around the PlatformMemberSymbol check in TypeService (the reference.symbol()
instanceof PlatformMemberSymbol platformMember block) to prefer returnTypes()
but fall back to returnType() to match ExpressionTypeInferencer#inferDereference
behavior.
🤖 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/types/oscript/OScriptModuleMembersProvider.java`:
- Around line 130-135: The code currently calls
globalScopeProvider.indexModuleType(uri, ref) unconditionally causing CLASS
entries to overwrite MODULE refs; change OScriptModuleMembersProvider so you
only call indexModuleType for module entries (e.g., check libraryEntry.kind() ==
OScriptLibraryIndex.EntryKind.MODULE or libraryEntry.kind() !=
OScriptLibraryIndex.EntryKind.CLASS) before invoking indexModuleType(uri, ref),
leaving the existing CLASS-specific handling (the subsequent if
(libraryEntry.kind() == OScriptLibraryIndex.EntryKind.CLASS) block) unchanged.

In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java`:
- Around line 333-336: The helper referenceTo currently builds a Reference using
symbol.getSelectionRange(), causing tests to exercise declaration-site hover;
change tests to use a usage-site Reference when asserting inference by
constructing the Reference from the actual hovered occurrence range (the
read/write occurrence) instead of symbol.getSelectionRange(). Add a second
helper (e.g., referenceToUsage or referenceTo(DocumentContext, Range)) or
overload referenceTo to accept the occurrence Range and use
Reference.of(documentContext.getSymbolTree().getModule(), symbol, new
Location(documentContext.getUri().toString(), occurrenceRange)); update
inference-focused assertions to call that usage-site helper so
VariableSymbolMarkupContentBuilder and typeService.typesAt(reference) are
exercised with the position-sensitive reference.

---

Outside diff comments:
In
`@src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilder.java`:
- Around line 36-41: Update the class JavaDoc to reference the correct target
type: replace the incorrect {`@link` AnnotationSymbol} with {`@link`
AnnotationParamSymbol} (the class AnnotationParamSymbolMarkupContentBuilder and
its getSymbolClass() already operate on AnnotationParamSymbol) so the public
documentation matches the actual API and implementation.

In
`@src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeService.java`:
- Around line 108-112: The platform-member branch only uses
platformMember.getDescriptor().returnTypes() and drops legacy single
returnType(), so restore the fallback: when reference.symbol() is a
PlatformMemberSymbol and descriptor.returnTypes() is null or empty, call
platformMember.getDescriptor().returnType(), convert it into the expected
collection (if non-null/non-empty) and return that instead; update the code
around the PlatformMemberSymbol check in TypeService (the reference.symbol()
instanceof PlatformMemberSymbol platformMember block) to prefer returnTypes()
but fall back to returnType() to match ExpressionTypeInferencer#inferDereference
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: 2f3087f3-3416-41c7-bd28-51bad13a31e3

📥 Commits

Reviewing files that changed from the base of the PR and between 1e5d9e4 and a0f6245.

⛔ Files ignored due to path filters (2)
  • src/test/resources/types/CommonModuleMidCallCompletion.bsl is excluded by !src/test/resources/**
  • src/test/resources/types/CommonModuleSignatureHelp.bsl is excluded by !src/test/resources/**
📒 Files selected for processing (41)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AssignToReadOnlyPropertyDiagnostic.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/platform/PlatformMemberCalls.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorCallMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/KeywordSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilderConfiguration.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/PlatformMethodCallInlayHintSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/references/PlatformMemberReferenceFinder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/semantictokens/PlatformMemberMethodCallSemanticTokensSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeService.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/ExpressionTypeInferencer.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/oscript/OScriptModuleMembersProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationModuleMembersProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/GlobalScopeProvider.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProviderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpCommonModuleTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainedAccessorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceBenchmarkTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceDelegationTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/autumn/AutumnDependencyInjectionInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/oscript/OScriptLibraryFileSystemWatcherTest.java

Comment on lines +333 to +336
private static Reference referenceTo(DocumentContext documentContext, SourceDefinedSymbol symbol) {
return Reference.of(documentContext.getSymbolTree().getModule(), symbol,
new Location(documentContext.getUri().toString(), symbol.getSelectionRange()));
}
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.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use a usage-site Reference in the inference-focused tests.

Line 334 always builds the Reference from symbol.getSelectionRange(), so the updated tests still exercise hover from the declaration site. That misses the main contract change here: VariableSymbolMarkupContentBuilder now delegates inferred content to typeService.typesAt(reference), which is position-sensitive. A regression in hover for an actual read/write occurrence could slip through while these tests stay green. Please build the Reference from the concrete hovered occurrence in the inference assertions, or add a second helper for usage-site references.

🤖 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/VariableSymbolMarkupContentBuilderTest.java`
around lines 333 - 336, The helper referenceTo currently builds a Reference
using symbol.getSelectionRange(), causing tests to exercise declaration-site
hover; change tests to use a usage-site Reference when asserting inference by
constructing the Reference from the actual hovered occurrence range (the
read/write occurrence) instead of symbol.getSelectionRange(). Add a second
helper (e.g., referenceToUsage or referenceTo(DocumentContext, Range)) or
overload referenceTo to accept the occurrence Range and use
Reference.of(documentContext.getSymbolTree().getModule(), symbol, new
Location(documentContext.getUri().toString(), occurrenceRange)); update
inference-focused assertions to call that usage-site helper so
VariableSymbolMarkupContentBuilder and typeService.typesAt(reference) are
exercised with the position-sensitive reference.

@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch 2 times, most recently from 2d9a813 to 7adb999 Compare June 2, 2026 14:03
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Test Results

 2 964 files  +12   2 964 suites  +12   1h 17m 2s ⏱️ +13s
 2 694 tests  -  1   2 694 ✅  -  1  0 💤 ±0  0 ❌ ±0 
16 164 runs   -  6  16 164 ✅  -  6  0 💤 ±0  0 ❌ ±0 

Results for commit 3f25f28. ± Comparison against base commit 1e5d9e4.

This pull request removes 10 and adds 9 tests. Note that renamed tests count towards both.
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ findGlobalContextDelegates()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ findGlobalContextNoArgUsesNullFileType()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ findTypesByUriDelegatesToReferenceFindTypes()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ findTypesByUriReturnsEmptyWhenNoReferenceResolves()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ getConstructorsDelegatesToRegistry()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ getDescriptionDelegatesToRegistry()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ getGlobalContextNamesByFileTypeDelegates()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ getGlobalContextNamesDelegatesAndBootstrapsTypeRegistry()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ getMembersDelegatesToRegistry()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ resolveDelegatesToRegistry()
com.github._1c_syntax.bsl.languageserver.hover.KeywordSymbolMarkupContentBuilderTest ‑ getContentRendersKeywordLabelAndDescription()
com.github._1c_syntax.bsl.languageserver.hover.KeywordSymbolMarkupContentBuilderTest ‑ getSymbolClassReturnsKeywordSymbol()
com.github._1c_syntax.bsl.languageserver.providers.CompletionProviderTest ‑ dotCompletionOnMidCallDotOfCommonModuleReturnsModuleMembers()
com.github._1c_syntax.bsl.languageserver.providers.SignatureHelpCommonModuleTest ‑ signatureHelpResolvesCommonModuleMethodReceiver()
com.github._1c_syntax.bsl.languageserver.types.CommonModuleCallInferenceTest ‑ receiverTypesAtCommonModuleMemberYieldsModuleType()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ receiverTypesAtBeyondContentIsEmpty()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ receiverTypesAtDotInFirstColumnIsEmpty()
com.github._1c_syntax.bsl.languageserver.types.TypeServiceDelegationTest ‑ receiverTypesAtWithoutPrecedingDotIsEmpty()
com.github._1c_syntax.bsl.languageserver.types.oscript.OScriptLibraryFileSystemWatcherTest ‑ moduleTypeByUriIndexedOnRegisterAndClearedOnUnregister()

♻️ This comment has been updated with latest results.

@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch from 7adb999 to decf892 Compare June 2, 2026 15:45
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/test/java/com/github/_1c_syntax/bsl/languageserver/types/KeyValueIndexAccessInferenceTest.java (1)

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

Stale JavaDoc reference to removed inferAtPosition.

The class JavaDoc still links {@link TypeService#inferAtPosition}, but the test now exercises expressionTypesAt and that API was renamed/removed in this PR. This is now a broken javadoc link.

📝 Proposed doc fix
- * результат {`@link` TypeService#inferAtPosition} напрямую — на уровне TypeSet,
+ * результат {`@link` TypeService#expressionTypesAt} напрямую — на уровне TypeSet,
As per coding guidelines: "keep documentation up to date with code changes".
🤖 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/types/KeyValueIndexAccessInferenceTest.java`
around lines 38 - 44, The class JavaDoc in KeyValueIndexAccessInferenceTest
references the removed method TypeService#inferAtPosition, causing a broken
link; update the doc to reference the current API (e.g.
TypeService#expressionTypesAt) or remove the {`@link`} entirely and adjust the
narrative to state that the test exercises expressionTypesAt (or the actual
current method name) directly at the TypeSet level so the javadoc matches the
code under test.
🧹 Nitpick comments (1)
src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainAndIndexAccessInferenceTest.java (1)

89-89: ⚡ Quick win

TypeService still exposes the old positional API.

TypeService declares public TypeSet expressionTypesAt(DocumentContext documentContext, Position position), so the tests’ continued use of expressionTypesAt(...) shouldn’t break compilation. If the intent was to standardize on the consolidated typesAt(...) / receiverTypesAt(...) APIs, consider updating the test helpers for consistency.

🤖 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/types/ChainAndIndexAccessInferenceTest.java`
at line 89, Tests are calling the legacy
TypeService.expressionTypesAt(DocumentContext, Position) API while the project
aims to standardize on the consolidated typesAt(...) / receiverTypesAt(...)
APIs; update the test helper in ChainAndIndexAccessInferenceTest to call the new
TypeService.typesAt(...) or TypeService.receiverTypesAt(...) (whichever matches
the test intent) instead of expressionTypesAt, passing the same DocumentContext
and adjusted positional arguments, and update any helper wrapper method that
currently delegates to expressionTypesAt to delegate to the new API so tests and
TypeService usage are consistent.
🤖 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/providers/SignatureHelpProvider.java`:
- Around line 140-142: Update the JavaDoc link to point to the actual method
used: replace the incorrect {`@link` TypeService#typesAt(DocumentContext,
org.eclipse.lsp4j.Position)} with the correct {`@link`
TypeService#expressionTypesAt(DocumentContext, org.eclipse.lsp4j.Position)} (or
{`@link` TypeService#expressionTypesAt(DocumentContext, Position)}) so the JavaDoc
references the expressionTypesAt method that is invoked by
SignatureHelpProvider.

In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CollectionMethodReturnsTest.java`:
- Line 113: The test calls TypeService.expressionTypesAt(DocumentContext,
Position) but TypeService still exposes that method and it’s used internally by
receiverSegmentTypes(...), so either update the test to use the intended public
API (typesAt(...) or receiverTypesAt(...)) or keep expressionTypesAt(...)
documented as an internal API; specifically, decide whether expressionTypesAt
should remain public or be made package-private/removed, then update the test in
CollectionMethodReturnsTest to call the appropriate method
(TypeService.typesAt(...) or TypeService.receiverTypesAt(...)) or adjust
TypeService (change visibility of expressionTypesAt or delegate
typesAt/receiverTypesAt to it) and update the PR description/docs to reflect the
chosen public surface (TypeService.expressionTypesAt, TypeService.typesAt,
TypeService.receiverTypesAt, and receiverSegmentTypes).

In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceTest.java`:
- Line 143: The test currently calls typeRegistry.getMembers(arrayRef) directly,
bypassing FileType-aware filtering; update the test in TypeServiceTest to use
the public API TypeService.getMembers(TypeRef, FileType) instead (e.g., replace
the direct call to typeRegistry.getMembers(arrayRef) with a call to
typeService.getMembers(arrayRef, <appropriate FileType>)), ensuring you pass the
correct FileType used by the test so member filtering behavior is exercised via
TypeService rather than TypeRegistry.

---

Outside diff comments:
In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/types/KeyValueIndexAccessInferenceTest.java`:
- Around line 38-44: The class JavaDoc in KeyValueIndexAccessInferenceTest
references the removed method TypeService#inferAtPosition, causing a broken
link; update the doc to reference the current API (e.g.
TypeService#expressionTypesAt) or remove the {`@link`} entirely and adjust the
narrative to state that the test exercises expressionTypesAt (or the actual
current method name) directly at the TypeSet level so the javadoc matches the
code under test.

---

Nitpick comments:
In
`@src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainAndIndexAccessInferenceTest.java`:
- Line 89: Tests are calling the legacy
TypeService.expressionTypesAt(DocumentContext, Position) API while the project
aims to standardize on the consolidated typesAt(...) / receiverTypesAt(...)
APIs; update the test helper in ChainAndIndexAccessInferenceTest to call the new
TypeService.typesAt(...) or TypeService.receiverTypesAt(...) (whichever matches
the test intent) instead of expressionTypesAt, passing the same DocumentContext
and adjusted positional arguments, and update any helper wrapper method that
currently delegates to expressionTypesAt to delegate to the new API so tests and
TypeService usage are consistent.
🪄 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: ff27aebb-158d-4f46-bef3-3391c1cbd9ed

📥 Commits

Reviewing files that changed from the base of the PR and between d80c81a and decf892.

📒 Files selected for processing (95)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AssignToReadOnlyPropertyDiagnostic.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/platform/PlatformMemberCalls.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorCallMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/KeywordSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilderConfiguration.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/PlatformMethodCallInlayHintSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/references/PlatformMemberReferenceFinder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/semantictokens/PlatformMemberMethodCallSemanticTokensSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeService.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/AccessChainOnUnionTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/AccumulatePatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ArrayChainAccessTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BigBslFixtureTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BinaryOperatorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BooleanExpressionsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CatalogAttributeMembersTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainAndIndexAccessInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainedAccessorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CircularVariableInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CollectionMethodReturnsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonBslPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ComprehensiveInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ConfigurationManagerChainInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ConstructorVariantsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ControlFlowPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CrossModuleCallsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/DereferenceVariationsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/DynamicConstructorTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ElementTypesInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ExpressionTreePatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ForEachPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/GlobalEnumPropertyInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/GlobalScopeInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InferEdgeCasesTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InlineTypeCommentInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InlineTypeCommentsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/JsDocVariantsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/KeyValueIndexAccessInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/LiteralInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MapAndFixedStructureInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MethodCallPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MixedAssignmentsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MoreBinaryOpsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MorePlatformInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/OScriptDirectivesTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/OScriptPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ParameterJsDocInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PeremTypeCommentInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PlatformCollectionsChainTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PrimitiveConversionTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/QueryAndDateLiteralsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ReturnTypeInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeCrossModuleRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeLocalMethodRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeMetadataRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SignatureInheritanceInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SkippedArgAndChainDereferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StreamingApiPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureConstructorEdgeTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureConstructorKeysInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureInsertFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureLocalFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeDescriptionConstructorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeDescriptionPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceBenchmarkTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceDelegationTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/UnaryExpressionPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ValueTableColumnsFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ValueTableTypedColumnsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/VariableTrackingPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/autumn/AutumnDependencyInjectionInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationModuleMembersProviderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProviderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/MultiWorkspaceTypeRegistryTest.java
🚧 Files skipped from review as they are similar to previous changes (29)
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceBenchmarkTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/references/PlatformMemberReferenceFinder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainedAccessorInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilderTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilderTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/platform/PlatformMemberCalls.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorCallMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/KeywordSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AssignToReadOnlyPropertyDiagnostic.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/PlatformMethodCallInlayHintSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/semantictokens/PlatformMemberMethodCallSemanticTokensSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilderConfiguration.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/autumn/AutumnDependencyInjectionInferenceTest.java

Comment thread src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceTest.java Outdated
@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch from decf892 to aa6eac7 Compare June 2, 2026 16:14
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeService.java (2)

397-420: 💤 Low value

Consider narrowing the exception handler or logging suppressed exceptions.

The broad catch (Exception e) at line 417 silently swallows all exceptions. While this provides robustness, it could mask unexpected bugs (e.g., NullPointerException from an unexpected null in getContentList()). Consider catching only IndexOutOfBoundsException or at minimum logging the exception at DEBUG level for diagnostics.

🤖 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/types/TypeService.java`
around lines 397 - 420, In receiverEndBeforeDot, replace the broad catch
(Exception e) with a narrower handler (e.g., catch IndexOutOfBoundsException
and/or NullPointerException) or rethrow unexpected exceptions, and/or log the
caught exception at DEBUG using the existing logger so unexpected nulls from
documentContext.getContentList() or similar issues are visible; update the catch
to only handle the specific bounds/null cases and include a debug log of the
exception and context (position) before returning Optional.empty().

117-122: 💤 Low value

Clarify the purpose of the empty-string resolve call.

Line 118 calls typeRegistry.resolve("") with an empty string, which appears to be a side-effect-only bootstrap trigger. This pattern is unclear and could confuse future maintainers. Consider extracting this into a named method like ensureTypeRegistryBootstrapped() or adding a comment explaining why this call is necessary here.

🤖 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/types/TypeService.java`
around lines 117 - 122, Replace the unclear side-effect call
typeRegistry.resolve("") in TypeService.expressionTypesAt with a
self-documenting helper (e.g. ensureTypeRegistryBootstrapped()) or add an inline
comment explaining the bootstrap side-effect; implement
ensureTypeRegistryBootstrapped() as a private method on TypeService that
performs the resolve call (and any future initialization) so callers clearly
show intent and maintenance becomes easier, then call that helper from
expressionTypesAt before invoking ExpressionAtPosition.findExpressionTree.
🤖 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/types/TypeService.java`:
- Around line 397-420: In receiverEndBeforeDot, replace the broad catch
(Exception e) with a narrower handler (e.g., catch IndexOutOfBoundsException
and/or NullPointerException) or rethrow unexpected exceptions, and/or log the
caught exception at DEBUG using the existing logger so unexpected nulls from
documentContext.getContentList() or similar issues are visible; update the catch
to only handle the specific bounds/null cases and include a debug log of the
exception and context (position) before returning Optional.empty().
- Around line 117-122: Replace the unclear side-effect call
typeRegistry.resolve("") in TypeService.expressionTypesAt with a
self-documenting helper (e.g. ensureTypeRegistryBootstrapped()) or add an inline
comment explaining the bootstrap side-effect; implement
ensureTypeRegistryBootstrapped() as a private method on TypeService that
performs the resolve call (and any future initialization) so callers clearly
show intent and maintenance becomes easier, then call that helper from
expressionTypesAt before invoking ExpressionAtPosition.findExpressionTree.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 5abce692-3f46-4b85-be7f-e895052ee0f6

📥 Commits

Reviewing files that changed from the base of the PR and between decf892 and aa6eac7.

📒 Files selected for processing (96)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AssignToReadOnlyPropertyDiagnostic.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/platform/PlatformMemberCalls.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorCallMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/KeywordSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilderConfiguration.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/PlatformMethodCallInlayHintSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/references/PlatformMemberReferenceFinder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/semantictokens/PlatformMemberMethodCallSemanticTokensSupplier.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/TypeService.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/GlobalScopeProvider.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/AccessChainOnUnionTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/AccumulatePatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ArrayChainAccessTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BigBslFixtureTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BinaryOperatorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BooleanExpressionsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CatalogAttributeMembersTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainAndIndexAccessInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainedAccessorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CircularVariableInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CollectionMethodReturnsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonBslPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ComprehensiveInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ConfigurationManagerChainInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ConstructorVariantsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ControlFlowPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CrossModuleCallsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/DereferenceVariationsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/DynamicConstructorTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ElementTypesInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ExpressionTreePatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ForEachPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/GlobalEnumPropertyInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/GlobalScopeInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InferEdgeCasesTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InlineTypeCommentInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InlineTypeCommentsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/JsDocVariantsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/KeyValueIndexAccessInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/LiteralInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MapAndFixedStructureInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MethodCallPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MixedAssignmentsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MoreBinaryOpsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MorePlatformInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/OScriptDirectivesTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/OScriptPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ParameterJsDocInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PeremTypeCommentInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PlatformCollectionsChainTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PrimitiveConversionTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/QueryAndDateLiteralsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ReturnTypeInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeCrossModuleRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeLocalMethodRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeMetadataRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SignatureInheritanceInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SkippedArgAndChainDereferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StreamingApiPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureConstructorEdgeTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureConstructorKeysInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureInsertFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureLocalFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeDescriptionConstructorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeDescriptionPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceBenchmarkTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceDelegationTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/UnaryExpressionPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ValueTableColumnsFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ValueTableTypedColumnsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/VariableTrackingPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/autumn/AutumnDependencyInjectionInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationModuleMembersProviderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProviderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/MultiWorkspaceTypeRegistryTest.java
💤 Files with no reviewable changes (1)
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/types/registry/GlobalScopeProvider.java
✅ Files skipped from review due to trivial changes (3)
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeCrossModuleRefInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProvider.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationTypesProviderTest.java
🚧 Files skipped from review as they are similar to previous changes (78)
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ControlFlowPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeDescriptionPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ParameterJsDocInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ReturnTypeInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeMetadataRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ValueTableTypedColumnsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StreamingApiPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InlineTypeCommentsTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/references/PlatformMemberReferenceFinder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/OScriptDirectivesTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/DynamicConstructorTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InferEdgeCasesTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PrimitiveConversionTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/AccessChainOnUnionTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ConstructorVariantsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceBenchmarkTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/VariableTrackingPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ArrayChainAccessTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MapAndFixedStructureInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BigBslFixtureTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorCallMarkupContentBuilder.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/AccumulatePatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/JsDocVariantsTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/platform/PlatformMemberCalls.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CollectionMethodReturnsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CrossModuleCallsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/SeeLocalMethodRefInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MorePlatformInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/UnaryExpressionPatternsTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ChainedAccessorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ExpressionTreePatternsTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/PlatformMemberSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MethodCallPatternsTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/inlayhints/PlatformMethodCallInlayHintSupplier.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ElementTypesInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/QueryAndDateLiteralsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonModuleCallInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/KeywordSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/InlineTypeCommentInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MixedAssignmentsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/OScriptPatternsTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PeremTypeCommentInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/MoreBinaryOpsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ValueTableColumnsFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/SyntheticSymbolMarkupContentBuilderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilderTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/semantictokens/PlatformMemberMethodCallSemanticTokensSupplier.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureLocalFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ComprehensiveInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MethodSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/KeyValueIndexAccessInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/BinaryOperatorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/CommonBslPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/PlatformCollectionsChainTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/ConfigurationModuleMembersProviderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeDescriptionConstructorInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/MarkupContentBuilderConfiguration.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/StructureInsertFieldsInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/GlobalEnumPropertyInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationSymbolMarkupContentBuilderTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CompletionProvider.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/inferencer/autumn/AutumnDependencyInjectionInferenceTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/registry/MultiWorkspaceTypeRegistryTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ForEachPatternsTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/TypeServiceDelegationTest.java
  • src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SignatureHelpProvider.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolStructureRenderTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/types/ConfigurationManagerChainInferenceTest.java
  • src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/AnnotationParamSymbolMarkupContentBuilderTest.java

@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch from aa6eac7 to 9c77ab9 Compare June 2, 2026 16:33
Позиционная поверхность TypeService для консьюмеров сведена к трём явным
операциям с чёткой семантикой:
- receiverTypesAt(DC, Position) — тип ресивера доступа к члену (именованный
  символ / mid-call / висячая точка разбираются внутри);
- expressionTypesAt(DC, Position) — тип ВСЕГО охватывающего выражения в позиции
  (для типов аргументов вызова и инференс-тестов; позиционно нечувствителен
  внутри выражения — для `Г + А.Б.В` это тип суммы);
- typesAt(Reference) — тип значения по ссылке (hover).

Консьюмеры: CompletionProvider.dotCompletion и SignatureHelpProvider — на
receiverTypesAt; типы аргументов (SignatureHelp, InlayHint) — на expressionTypesAt.

Удалён несвязный findTypes(SourceDefinedSymbol) («тип символа» — некогерентное
понятие). Ховер reference-ориентирован: контракт билдера getContent(Reference)
(без дублирующего symbol-параметра), дженерик MarkupContentBuilder<T> убран.
Удалены методы-делегаты, использовавшиеся только тестами (findGlobalContext,
getGlobalContextNames, одно-арг getMembers/getDescription/getConstructors/resolve);
тесты переведены на TypeRegistry/GlobalScopeProvider напрямую. findMemberAt →
memberAt, findMembersAt → membersAt. В SignatureHelpProvider удалён мёртвый
fallback на голое имя OneScript-модуля (receiverTypesAt его покрывает).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch from 9c77ab9 to 3f25f28 Compare June 2, 2026 16:47
@nixel2007
Copy link
Copy Markdown
Member Author

@claude review pls

@claude
Copy link
Copy Markdown

claude Bot commented Jun 2, 2026

Claude finished @nixel2007's task in 2m 25s —— View job


Code Review

Общий вывод: стек хорошо структурирован, чистый API, тесты покрывают новые сценарии. Ниже — одна реальная ошибка и несколько мелких проблем.


Баг: indexModuleType перезаписывается CLASS-записью

OScriptModuleMembersProvider.java:134[Fix this →]

// Сейчас (134):
globalScopeProvider.indexModuleType(uri, ref);  // ← вызов до ветки CLASS/MODULE
if (libraryEntry.kind() == OScriptLibraryIndex.EntryKind.CLASS) {
    ...
    globalScopeProvider.registerLibraryClass(qualifiedName, ref);
} else if (libraryEntry.kind() == OScriptLibraryIndex.EntryKind.MODULE) {
    globalScopeProvider.registerLibraryModule(qualifiedName, ref);
}

Если .os-файл одновременно является MODULE и CLASS (две записи в lib.config), то итерация в register() вызывает registerOne дважды. Порядок не гарантирован, и CLASS-запись перезапишет MODULE-ref в moduleTypeByUri. После этого inferModuleAsType будет возвращать тип класса вместо типа модуля при hover/completion по переменной-модулю.

Фикс: переместить вызов indexModuleType внутрь MODULE-ветки:

if (libraryEntry.kind() == OScriptLibraryIndex.EntryKind.CLASS) {
    typeRegistry.registerConstructorSource(...);
    globalScopeProvider.registerLibraryClass(qualifiedName, ref);
} else if (libraryEntry.kind() == OScriptLibraryIndex.EntryKind.MODULE) {
    globalScopeProvider.indexModuleType(uri, ref);  // ← сюда
    globalScopeProvider.registerLibraryModule(qualifiedName, ref);
}

Потенциальная регрессия: отсутствует fallback returnType() для PlatformMember

TypeService.java:97-102[Fix this →]

if (reference.symbol() instanceof PlatformMemberSymbol platformMember) {
    var returnTypes = platformMember.getDescriptor().returnTypes();
    if (returnTypes != null && !returnTypes.isEmpty()) {
        return returnTypes;
    }
    // ← нет fallback на descriptor.returnType()
}

ExpressionTypeInferencer#inferDereference по-прежнему делает fallback на descriptor.returnType() для платформенных членов, у которых returnTypes() не заполнен (не мигрированный JSON). В результате typesAt(reference) через hover слабее expressionTypesAt через AST — для таких членов hover будет пустым, хотя completion/signature работают. Это тихая регрессия именно для hover по platform-member'ам со старым returnType().


Сломанная JavaDoc-ссылка

SignatureHelpProvider.java:139

// {@link TypeService#typesAt(DocumentContext, org.eclipse.lsp4j.Position)}

Такой перегрузки в TypeService нет. Вызывается expressionTypesAt(documentContext, position). Сборка JavaDoc даст предупреждение/ошибку.


Нарушение слоёв в тесте

TypeServiceTest.java:143

var members = typeRegistry.getMembers(arrayRef);  // прямой вызов TypeRegistry

Обходит TypeService.getMembers(TypeRef, FileType) с FileType-фильтрацией. Для этого теста разница несущественна, но паттерн задаёт неправильный пример — следующий автор напишет тест так же.


Мелкие замечания

  • AnnotationParamSymbolMarkupContentBuilder.java:36 — JavaDoc класса упоминает AnnotationSymbol вместо AnnotationParamSymbol.
  • KeyValueIndexAccessInferenceTest.java:40 — JavaDoc класса ссылается на удалённый TypeService#inferAtPosition; нужно обновить на expressionTypesAt.
  • expressionTypesAt публичность — метод объявлен public, но из продуктового кода используется только внутри TypeService (через receiverSegmentTypes). Используется напрямую в нескольких тестах. Если это внутренний метод — стоит сделать package-private или явно задокументировать как часть API.
  • typeRegistry.resolve("") (TypeService.java:118) — bootstrap через пустую строку неочевиден; стоит выделить в ensureTypeRegistryBootstrapped() или добавить однострочный комментарий.

Что хорошо

  • Единый URI→тип индекс в GlobalScopeProvider — правильное решение, убирает дублирование логики из инференсера.
  • receiverTypesAt покрывает все три сценария (именованный ресивер / mid-call / висячая точка) без оркестрации на стороне провайдеров.
  • Удаление findTypes(SourceDefinedSymbol) и переименование findMemberAt/findMembersAt → правильная чистка API.
  • unregister(uri) в OScriptModuleMembersProvider чистит moduleTypeByUri — lifecycle учтён.
  • Тесты на новые сценарии (CommonModuleCallInferenceTest, OScriptLibraryFileSystemWatcherTest, SignatureHelpCommonModuleTest) — именно то, что нужно для регрессионного покрытия.

  • Получить контекст PR
  • Читать ключевые изменённые файлы
  • Опубликовать review

@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch from 895ae8b to ce5ea63 Compare June 2, 2026 21:54
@nixel2007
Copy link
Copy Markdown
Member Author

Ответ по ревью (CodeRabbit + Claude)

Спасибо за разбор. Изменения — в коммите ce5ea6378a. Локально прогнаны javadoc (без unresolved-ссылок), пакеты types.*, hover/providers/inlayhints и OScript-интеграция — зелёные.

Исправлено

  • OScriptModuleMembersProviderindexModuleType для CLASS перетирал MODULE. Вызов перенесён внутрь ветки EntryKind.MODULE: у dual-role .os-файла роль CLASS больше не затирает тип модуля в moduleTypeByUri. Добавлен точечный red-тест OScriptModuleMembersProviderTest (на старом коде падал на verify(never()).indexModuleType(uri, classRef)).
  • SignatureHelpProvider — битая {@link}. typesAt(DocumentContext, Position)expressionTypesAt(...).
  • AnnotationParamSymbolMarkupContentBuilder — javadoc. {@link AnnotationSymbol}AnnotationParamSymbol (+ убран ставший лишним импорт).
  • TypeServiceTest — нарушение слоёв. typeRegistry.getMembers(arrayRef)typeService.getMembers(arrayRef, documentContext.getFileType()).
  • Устаревшие упоминания удалённых/переименованных методов в комментариях и javadoc (inferAtPositionexpressionTypesAt, findMemberAt/findMembersAtmemberAt/membersAt), включая битую {@link TypeService#inferAtPosition} в KeyValueIndexAccessInferenceTest.
  • typeRegistry.resolve("") — добавлен поясняющий комментарий: это материализация workspace-scoped прокси TypeRegistry (+ его @PostConstruct bootstrap) до обхода типов инференсером; "" выбран как самый дешёвый безвредный вызов.

Отклонено (с обоснованием)

  • Fallback returnType() для PlatformMember в typesAt(Reference) (отметили оба бота). Невалидно: MemberDescriptorrecord, а returnType() — производный аксессор returnTypes.refs().stream().findFirst().orElse(UNKNOWN). При пустом returnTypes он всегда возвращает UNKNOWN, поэтому предложенный fallback недостижим и типа не добавит. Более того, зеркальная else if (...returnType()...)-ветка в ExpressionTypeInferencer#inferDereference, на которую ссылались, по той же причине была мёртвым legacy-кодом — я её удалил, а не продублировал.
  • Публичность expressionTypesAt. Оставлен public намеренно: метод — часть API, используется из SignatureHelpProvider и PlatformMethodCallInlayHintSupplier (пакет providers) для вычисления типа выражения-аргумента; семантика задокументирована в javadoc.

- OScriptModuleMembersProvider: indexModuleType только для роли MODULE —
  у dual-role .os-файла роль CLASS больше не перетирает тип модуля
  в moduleTypeByUri (+ red-тест OScriptModuleMembersProviderTest)
- ExpressionTypeInferencer.inferDereference: удалена недостижимая ветка
  returnType()-fallback (returnType() производный от returnTypes(): при
  пустом returnTypes всегда UNKNOWN), заодно убраны лишние null/isEmpty
- SignatureHelpProvider: javadoc-ссылка typesAt → expressionTypesAt
- AnnotationParamSymbolMarkupContentBuilder: javadoc AnnotationSymbol →
  AnnotationParamSymbol (+ убран ставший лишним импорт)
- TypeServiceTest: члены через публичный typeService.getMembers(ref, fileType)
  вместо прямого typeRegistry.getMembers
- актуализированы устаревшие упоминания inferAtPosition/findMemberAt/
  findMembersAt в комментариях и javadoc → expressionTypesAt/memberAt/membersAt

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@nixel2007 nixel2007 force-pushed the refactor/typeservice-positional-api branch from ce5ea63 to c4aab4f Compare June 2, 2026 21:57
@nixel2007 nixel2007 merged commit 71c4b4e into develop Jun 2, 2026
32 of 33 checks passed
@nixel2007 nixel2007 deleted the refactor/typeservice-positional-api branch June 2, 2026 22:07
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented Jun 2, 2026

sfaqer added a commit that referenced this pull request Jun 3, 2026
…зиты.<имя>

Проверяет наружный эффект MetadataCollectionSpecializer через TypeService —
именно тот API, который видят consumer'ы после реархитектуры #3993
(expressionTypesAt(DC, Position) для типа охватывающего выражения).

Регистрация специализаций уже покрыта unit-тестами в registry, здесь — резолв
выражения целиком на каждом шаге цепочки, на тестовой metadata-фикстуре
(Документ1 с реквизитами и табчастью).

Тип Метаданные приходит из платформенного bsl-context, поэтому тест требует
HBK — включается переменной BSL_LANGUAGE_SERVER_RUN_HBK_TESTS.
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