diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java index 94014d30a10..ecfadf7e2bc 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java @@ -78,6 +78,11 @@ public List compute() { public ParseTree visitFunction(BSLParser.FunctionContext ctx) { BSLParser.FuncDeclarationContext declaration = ctx.funcDeclaration(); + var firstToken = + declaration.children.stream() + .filter(chld -> !(chld instanceof BSLParser.PreprocessorContext)) + .findFirst().get(); + TerminalNode startNode = declaration.FUNCTION_KEYWORD(); TerminalNode stopNode = ctx.ENDFUNCTION_KEYWORD(); @@ -90,6 +95,7 @@ public ParseTree visitFunction(BSLParser.FunctionContext ctx) { } MethodSymbol methodSymbol = createMethodSymbol( + Trees.getTokens(firstToken).get(0), startNode, stopNode, declaration.subName().getStart(), @@ -108,6 +114,11 @@ public ParseTree visitFunction(BSLParser.FunctionContext ctx) { public ParseTree visitProcedure(BSLParser.ProcedureContext ctx) { BSLParser.ProcDeclarationContext declaration = ctx.procDeclaration(); + var firstToken = + declaration.children.stream() + .filter(chld -> !(chld instanceof BSLParser.PreprocessorContext)) + .findFirst().get(); + TerminalNode startNode = declaration.PROCEDURE_KEYWORD(); TerminalNode stopNode = ctx.ENDPROCEDURE_KEYWORD(); @@ -120,6 +131,7 @@ public ParseTree visitProcedure(BSLParser.ProcedureContext ctx) { } MethodSymbol methodSymbol = createMethodSymbol( + Trees.getTokens(firstToken).get(0), startNode, stopNode, declaration.subName().getStart(), @@ -180,6 +192,7 @@ private static Optional getCompilerDirective( } private MethodSymbol createMethodSymbol( + Token startToken, TerminalNode startNode, TerminalNode stopNode, Token subName, @@ -189,7 +202,7 @@ private MethodSymbol createMethodSymbol( Optional compilerDirective, List annotations ) { - Optional description = createDescription(startNode.getSymbol()); + Optional description = createDescription(startToken); boolean deprecated = description .map(MethodDescription::isDeprecated) .orElse(false); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java index 29fc428fa20..d718498d3e6 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java @@ -21,6 +21,7 @@ */ package com.github._1c_syntax.bsl.languageserver.utils; +import com.github._1c_syntax.bsl.parser.BSLLexer; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; import lombok.experimental.UtilityClass; @@ -49,16 +50,16 @@ public final class Trees { private static final Set VALID_TOKEN_TYPES_FOR_COMMENTS_SEARCH = Set.of( - BSLParser.ANNOTATION_ATCLIENT_SYMBOL, - BSLParser.ANNOTATION_ATSERVERNOCONTEXT_SYMBOL, - BSLParser.ANNOTATION_ATCLIENTATSERVERNOCONTEXT_SYMBOL, - BSLParser.ANNOTATION_ATCLIENTATSERVER_SYMBOL, - BSLParser.ANNOTATION_ATSERVER_SYMBOL, - BSLParser.ANNOTATION_CUSTOM_SYMBOL, - BSLParser.ANNOTATION_UNKNOWN, - BSLParser.LINE_COMMENT, - BSLParser.WHITE_SPACE, - BSLParser.AMPERSAND + BSLLexer.ANNOTATION_ATCLIENT_SYMBOL, + BSLLexer.ANNOTATION_ATSERVERNOCONTEXT_SYMBOL, + BSLLexer.ANNOTATION_ATCLIENTATSERVERNOCONTEXT_SYMBOL, + BSLLexer.ANNOTATION_ATCLIENTATSERVER_SYMBOL, + BSLLexer.ANNOTATION_ATSERVER_SYMBOL, + BSLLexer.ANNOTATION_CUSTOM_SYMBOL, + BSLLexer.ANNOTATION_UNKNOWN, + BSLLexer.LINE_COMMENT, + BSLLexer.WHITE_SPACE, + BSLLexer.AMPERSAND ); /** diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputerTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputerTest.java index fd5b6cf131f..699c7c0ccdc 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputerTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputerTest.java @@ -192,6 +192,7 @@ void testAnnotation() { // AROUND methodSymbol = methods.get(22); assertThat(methodSymbol.getName()).isEqualTo("Р_Вместо"); + assertThat(methodSymbol.getDescription()).isNotEmpty(); assertThat(methodSymbol.getAnnotations().get(0).getName()).isEqualTo("Вместо"); assertThat(methodSymbol.getAnnotations().get(0).getKind()).isEqualTo(AnnotationKind.AROUND); assertThat(methodSymbol.getAnnotations().get(0).getParameters().get(0).getValue()).isEqualTo("Вместо"); diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/MethodDescriptionTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/MethodDescriptionTest.java index 47c7f34cb6b..3239afe3529 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/MethodDescriptionTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/MethodDescriptionTest.java @@ -44,7 +44,7 @@ void prepare() { var documentContext = TestUtils.getDocumentContextFromFile("./src/test/resources/context/symbol/MethodDescription.bsl"); var methods = documentContext.getSymbolTree().getMethods(); - assertThat(methods.size()).isEqualTo(14); + assertThat(methods.size()).isEqualTo(18); methodsWithDescription = methods.stream() .map(MethodSymbol::getDescription) @@ -52,10 +52,39 @@ void prepare() { .map(Optional::get) .collect(Collectors.toList()); - assertThat(methodsWithDescription.size()).isEqualTo(13); + assertThat(methodsWithDescription.size()).isEqualTo(15); } } + @Test + void testMethod15() { + var method = methodsWithDescription.get(14); + assertThat(method.getPurposeDescription()) + .isNotEmpty() + .isEqualTo("См. ОбщийМодуль.ОписаниеСсылкойАсинх"); + assertThat(method.isDeprecated()).isFalse(); + assertThat(method.getDeprecationInfo()).isEmpty(); + assertThat(method.getExamples()).isEmpty(); + assertThat(method.getCallOptions()).isEmpty(); + assertThat(method.getParameters()).isEmpty(); + assertThat(method.getReturnedValue()).isEmpty(); + assertThat(method.getLink()).isNotEmpty(); + } + @Test + void testMethod14() { + var method = methodsWithDescription.get(13); + assertThat(method.getPurposeDescription()) + .isNotEmpty() + .isEqualTo("См. ОбщийМодуль.Метод()"); + assertThat(method.isDeprecated()).isFalse(); + assertThat(method.getDeprecationInfo()).isEmpty(); + assertThat(method.getExamples()).isEmpty(); + assertThat(method.getCallOptions()).isEmpty(); + assertThat(method.getParameters()).isEmpty(); + assertThat(method.getReturnedValue()).isEmpty(); + assertThat(method.getLink()).isNotEmpty(); + } + @Test void testMethod13() { var method = methodsWithDescription.get(12); diff --git a/src/test/resources/context/computer/MethodSymbolComputerTest.bsl b/src/test/resources/context/computer/MethodSymbolComputerTest.bsl index 48e45d7b444..9992e846e94 100644 --- a/src/test/resources/context/computer/MethodSymbolComputerTest.bsl +++ b/src/test/resources/context/computer/MethodSymbolComputerTest.bsl @@ -108,6 +108,7 @@ Процедура Р_После() КонецПроцедуры +// Описание метода &Вместо("Вместо") Функция Р_Вместо() КонецФункции diff --git a/src/test/resources/context/symbol/MethodDescription.bsl b/src/test/resources/context/symbol/MethodDescription.bsl index 1abed2994d4..f494f80c924 100644 --- a/src/test/resources/context/symbol/MethodDescription.bsl +++ b/src/test/resources/context/symbol/MethodDescription.bsl @@ -143,3 +143,15 @@ // Функция BUG_1495(Ссылки, Знач Реквизиты, ВыбратьРазрешенные = Ложь) Экспорт КонецФункции + +// См. ОбщийМодуль.Метод() +&Перед("ОписаниеСсылкойВРасширении") +Функция ОписаниеСсылкойВРасширении(Параметр1, Знач Параметр2 = 3) +КонецФункции +Функция НаписанаБезПробела() +КонецФункции Процедура НаписанаВоднуСтроку() КонецПроцедуры + +// См. ОбщийМодуль.ОписаниеСсылкойАсинх +&НаКлиенте +Асинх Функция ОписаниеСсылкойАсинх() +КонецФункции \ No newline at end of file diff --git a/src/test/resources/diagnostics/PublicMethodsDescriptionDiagnostic.bsl b/src/test/resources/diagnostics/PublicMethodsDescriptionDiagnostic.bsl index 62ad8f9f93b..43cf664b0a9 100644 --- a/src/test/resources/diagnostics/PublicMethodsDescriptionDiagnostic.bsl +++ b/src/test/resources/diagnostics/PublicMethodsDescriptionDiagnostic.bsl @@ -107,4 +107,19 @@ КонецФункции +// см. КакойтоМодуль.Метод +Функция ОписаниеСм() Экспорт + + Возврат Неопределено; + +КонецФункции + +// см. КакойтоМодуль.Метод +&Перед("ОписаниеСмПеред") +Функция ОписаниеСмПеред() Экспорт + + Возврат Неопределено; + +КонецФункции + #КонецОбласти