feat(types/oscript): ConstructorSymbol — отдельный тип для конструктора OScript-класса#3945
Conversation
…ра OScript-класса `Новый <ИмяКласса>()` теперь резолвится единообразно: для класса с явным `ПриСозданииОбъекта`/`OnObjectCreate` go-to-def ведёт в тело конструктора, а hover показывает constructor-стилевой блок с сигнатурой; для класса без конструктора — ссылка в `ModuleSymbol` .os-файла, hover тот же constructor-стиля. Symbol tree: - `MethodSymbol` стал интерфейсом, `RegularMethodSymbol` — обычные методы/функции, `ConstructorSymbol` — `ПриСозданииОбъекта`/`OnObjectCreate` в OScript-классе. - Общая структура полей вынесена в `AbstractMethodSymbol` (`@SuperBuilder`). - `SymbolTreeVisitor`: `visitMethod` → `visitRegularMethod`, добавлен `visitConstructor`. В `AbstractSymbolTreeDiagnostic` оба override'а делегируют в общий `visitMethod(MethodSymbol)`-helper — существующие диагностики не переписываются. - `SymbolTree.getConstructor(): Optional<ConstructorSymbol>` — типизированный аксессор. - `MethodSymbolComputer` строит `ConstructorSymbol` для имени-конструктора в файле с `ModuleType.OScriptClass`; имена вынесены в `Methods.isOscriptClassConstructorName`. Резолв ссылок: - `ReferenceIndexFiller.tryRegisterLibraryClassReference`: при наличии `ConstructorSymbol` регистрируется `addMethodCall` на конструктор, иначе — старая `addModuleReference`. - `ReferenceIndex.isReferenceAccessible`: конструктор OScript-класса всегда accessible (по convention объявляется без `Экспорт`, но фактически доступен извне через `Новый`). - `AnnotationReferenceFinder` использует `symbolTree.getConstructor()`; для фикстуры `references/annotations/` добавлен `lib.config`, чтобы аннотации регистрировались как `OScriptClass`. Hover: - `OScriptClassConstructorRenderer` — общий рендер constructor-стиля (`Новый ИмяКласса(...)` + location + сигнатура/описание). - `ConstructorSymbolMarkupContentBuilder` — hover для `ConstructorSymbol`. - `ModuleSymbolMarkupContentBuilder` для `ModuleType.OScriptClass` делегирует в renderer (богатый hover для класса без явного конструктора). Outline / workspace symbols: - `SymbolProvider.isSupported` принимает `SymbolKind.Constructor`. - `DocumentSymbolProvider` отдаёт `SymbolKind.Constructor` через `symbol.getSymbolKind()`. Тесты: - `MethodsTest`, `MethodSymbolComputerConstructorTest`, `ImplicitLibraryClassNewExpressionReferenceTest` (фикстура `oscript-libraries/internal-classes-test/`, autumn-mock), `HoverProviderOScriptLibraryTest` (+2 кейса с защитой от регресса hover-дубликата), `SymbolProviderOScriptConstructorTest`.
📝 WalkthroughWalkthroughThis PR refactors method symbol handling to distinguish OneScript class constructors from regular methods through a new type hierarchy. ChangesOneScript Constructor Symbol Refactoring
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Warning Review ran into problems🔥 ProblemsStopped waiting for pipeline failures after 30000ms. One of your pipelines takes longer than our 30000ms fetch window to run, so review may not consider pipeline-failure results for inline comments if any failures occurred after the fetch window. Increase the timeout if you want to wait longer or run a Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/MethodSymbol.java (1)
39-55: ⚡ Quick winAdd JavaDoc to the newly exposed interface methods.
Several public API methods are declared without JavaDoc, which makes the new interface contract harder to consume and maintain.
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/context/symbol/MethodSymbol.java` around lines 39 - 55, The MethodSymbol interface exposes several public methods without JavaDoc; add concise JavaDoc comments for each public API method in MethodSymbol (getName, isFunction, isExport, isDeprecated, getParameters, getDescription, getCompilerDirectiveKind, getAnnotations) describing purpose, return values and any nullable/optional semantics; ensure `@return` tags for each method, mention when Optional is empty, and note any side-effects or contract expectations (e.g., immutability of returned lists) to satisfy project Javadoc guidelines.
🤖 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/context/symbol/MethodSymbol.java`:
- Around line 39-55: The MethodSymbol interface exposes several public methods
without JavaDoc; add concise JavaDoc comments for each public API method in
MethodSymbol (getName, isFunction, isExport, isDeprecated, getParameters,
getDescription, getCompilerDirectiveKind, getAnnotations) describing purpose,
return values and any nullable/optional semantics; ensure `@return` tags for each
method, mention when Optional is empty, and note any side-effects or contract
expectations (e.g., immutability of returned lists) to satisfy project Javadoc
guidelines.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 47ea5885-7856-4d57-a3c2-3e3a0af3a857
⛔ Files ignored due to path filters (7)
src/test/resources/oscript-libraries/internal-classes-test/oscript_modules/internal-classes-lib/lib.configis excluded by!src/test/resources/**src/test/resources/oscript-libraries/internal-classes-test/oscript_modules/internal-classes-lib/src/internal/Классы/InternalEntity.osis excluded by!src/test/resources/**src/test/resources/oscript-libraries/internal-classes-test/oscript_modules/internal-classes-lib/src/internal/Классы/ВнутренняяСущность.osis excluded by!src/test/resources/**src/test/resources/oscript-libraries/internal-classes-test/oscript_modules/internal-classes-lib/src/Классы/ClassWithoutCtor.osis excluded by!src/test/resources/**src/test/resources/oscript-libraries/internal-classes-test/oscript_modules/internal-classes-lib/src/Классы/PublicEntity.osis excluded by!src/test/resources/**src/test/resources/oscript-libraries/internal-classes-test/src/Классы/Caller.osis excluded by!src/test/resources/**src/test/resources/references/annotations/lib.configis excluded by!src/test/resources/**
📒 Files selected for processing (23)
src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/VariableSymbolComputer.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/AbstractMethodSymbol.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/ConstructorSymbol.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/MethodSymbol.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/RegularMethodSymbol.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/SymbolTree.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/SymbolTreeVisitor.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractSymbolTreeDiagnostic.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ConstructorSymbolMarkupContentBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/hover/OScriptClassConstructorRenderer.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SymbolProvider.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinder.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndex.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/types/oscript/OScriptModuleMembersProvider.javasrc/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Methods.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputerConstructorTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/providers/HoverProviderOScriptLibraryTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/providers/SymbolProviderOScriptConstructorTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/references/ImplicitLibraryClassNewExpressionReferenceTest.javasrc/test/java/com/github/_1c_syntax/bsl/languageserver/utils/MethodsTest.java
|



Summary
Новый <ИмяКласса>()теперь резолвится единообразно для manifest- и implicit-классов OneScript-библиотек:ПриСозданииОбъекта/OnObjectCreate→ ссылка на конструктор-метод, go-to-def ведёт в тело конструктора, hover показывает constructor-стилевой блок с сигнатурой;ModuleSymbol.os-файла, hover всё равно constructor-стиля (Новый ИмяКласса());ConstructorSymbolс собственнымSymbolKind.Constructor, отдельным hover-builder'ом и иконкой в DocumentSymbol/WorkspaceSymbol.Что внутри
Symbol tree
MethodSymbol→ интерфейс. Конкретный класс переименован вRegularMethodSymbol. Общая структура вынесена вAbstractMethodSymbol(@SuperBuilder). НовыйConstructorSymbol.SymbolTreeVisitor:visitMethod→visitRegularMethod+ добавленvisitConstructor.AbstractSymbolTreeDiagnosticделегирует оба override'а в общийvisitMethod(MethodSymbol)— существующие 6 диагностик не переписываются.SymbolTree.getConstructor(): Optional<ConstructorSymbol>— типизированный аксессор.MethodSymbolComputerстроитConstructorSymbolдля процедуры с именем конструктора вModuleType.OScriptClass. Имена вMethods.isOscriptClassConstructorName.Резолв ссылок
ReferenceIndexFiller.tryRegisterLibraryClassReference: при наличии конструктора регистрируетaddMethodCall, иначе —addModuleReference.ReferenceIndex.isReferenceAccessible:ConstructorSymbolвсегда accessible (по convention объявляется безЭкспорт, но фактически доступен извне черезНовый).AnnotationReferenceFinderиспользуетsymbolTree.getConstructor(). Для фикстурыreferences/annotations/добавленlib.config, чтобы файлы регистрировались какOScriptClass.Hover
OScriptClassConstructorRenderer— общий рендер constructor-стиля.ConstructorSymbolMarkupContentBuilder— hover дляConstructorSymbol.ModuleSymbolMarkupContentBuilderдляModuleType.OScriptClassделегирует в renderer.Outline / workspace symbols
SymbolProvider.isSupportedпринимаетSymbolKind.Constructor.DocumentSymbolProviderотдаётSymbolKind.Constructorчерезsymbol.getSymbolKind().Test plan
./gradlew compileJava compileTestJava— ОК./gradlew javadoc— ОК (новые файлы без warnings)MethodsTest,MethodSymbolComputerConstructorTest,MethodSymbolComputerTest,ImplicitLibraryClassNewExpressionReferenceTest,HoverProviderOScriptLibraryTest,DocumentSymbolProviderTest,SymbolProviderOScriptConstructorTest,AnnotationReferenceFinderTest,SymbolProviderTest) — зелёные./gradlew test(известны спорадические сбои 3 semantictokens-тестов по исчерпанию inotify-лимита — инфраструктурное)Новый Поделка()иНовый ФабрикаЖелудей()— оба подробные, go-to-def ведёт наПриСозданииОбъекта; иконка конструктора в outlineSummary by CodeRabbit
Новый ClassName(...)).