Search in sources :

Example 1 with MethodSymbol

use of com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol in project bsl-language-server by 1c-syntax.

the class MethodSymbolComputer method visitProcedure.

@Override
public ParseTree visitProcedure(BSLParser.ProcedureContext ctx) {
    BSLParser.ProcDeclarationContext declaration = ctx.procDeclaration();
    TerminalNode startNode = declaration.PROCEDURE_KEYWORD();
    TerminalNode stopNode = ctx.ENDPROCEDURE_KEYWORD();
    if (startNode == null || startNode instanceof ErrorNode || stopNode == null || stopNode instanceof ErrorNode) {
        return ctx;
    }
    MethodSymbol methodSymbol = createMethodSymbol(startNode, stopNode, declaration.subName().getStart(), declaration.paramList(), false, declaration.EXPORT_KEYWORD() != null, getCompilerDirective(declaration.compilerDirective()), getAnnotations(declaration.annotation()));
    methods.add(methodSymbol);
    return ctx;
}
Also used : MethodSymbol(com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol) BSLParser(com.github._1c_syntax.bsl.parser.BSLParser) ErrorNode(org.antlr.v4.runtime.tree.ErrorNode) TerminalNode(org.antlr.v4.runtime.tree.TerminalNode)

Example 2 with MethodSymbol

use of com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol in project bsl-language-server by 1c-syntax.

the class MethodSymbolComputer method visitFunction.

@Override
public ParseTree visitFunction(BSLParser.FunctionContext ctx) {
    BSLParser.FuncDeclarationContext declaration = ctx.funcDeclaration();
    TerminalNode startNode = declaration.FUNCTION_KEYWORD();
    TerminalNode stopNode = ctx.ENDFUNCTION_KEYWORD();
    if (startNode == null || startNode instanceof ErrorNode || stopNode == null || stopNode instanceof ErrorNode) {
        return ctx;
    }
    MethodSymbol methodSymbol = createMethodSymbol(startNode, stopNode, declaration.subName().getStart(), declaration.paramList(), true, declaration.EXPORT_KEYWORD() != null, getCompilerDirective(declaration.compilerDirective()), getAnnotations(declaration.annotation()));
    methods.add(methodSymbol);
    return ctx;
}
Also used : MethodSymbol(com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol) BSLParser(com.github._1c_syntax.bsl.parser.BSLParser) ErrorNode(org.antlr.v4.runtime.tree.ErrorNode) TerminalNode(org.antlr.v4.runtime.tree.TerminalNode)

Example 3 with MethodSymbol

use of com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol in project bsl-language-server by 1c-syntax.

the class SymbolTree method getMethodSymbol.

/**
 * Попытка поиска символа метода по узлу дерева разбора.
 * <p>
 * Implementation note - Поиск осуществляется по месту определения метода (declaration).
 *
 * @param ctx узел дерева разбора документа.
 * @return найденный символ метода.
 */
public Optional<MethodSymbol> getMethodSymbol(BSLParserRuleContext ctx) {
    BSLParserRuleContext subNameNode;
    if (Trees.nodeContainsErrors(ctx)) {
        subNameNode = ctx;
    } else if (ctx instanceof BSLParser.SubContext) {
        if (((BSLParser.SubContext) ctx).function() == null) {
            subNameNode = ((BSLParser.SubContext) ctx).procedure().procDeclaration().subName();
        } else {
            subNameNode = ((BSLParser.SubContext) ctx).function().funcDeclaration().subName();
        }
    } else {
        subNameNode = ctx;
    }
    Range subNameRange = Ranges.create(subNameNode);
    return getMethods().stream().filter(methodSymbol -> methodSymbol.getSubNameRange().equals(subNameRange)).findAny();
}
Also used : List(java.util.List) Ranges(com.github._1c_syntax.bsl.languageserver.utils.Ranges) Getter(lombok.Getter) BSLParserRuleContext(com.github._1c_syntax.bsl.parser.BSLParserRuleContext) Optional(java.util.Optional) BSLParser(com.github._1c_syntax.bsl.parser.BSLParser) Range(org.eclipse.lsp4j.Range) Trees(com.github._1c_syntax.bsl.languageserver.utils.Trees) Collectors(java.util.stream.Collectors) Value(lombok.Value) ArrayList(java.util.ArrayList) BSLParserRuleContext(com.github._1c_syntax.bsl.parser.BSLParserRuleContext) BSLParser(com.github._1c_syntax.bsl.parser.BSLParser) Range(org.eclipse.lsp4j.Range)

Example 4 with MethodSymbol

use of com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol in project bsl-language-server by 1c-syntax.

the class MethodSymbolMarkupContentBuilderTest method testContentFromDirectFile.

@Test
void testContentFromDirectFile() {
    // given
    DocumentContext documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE);
    var methodSymbol = documentContext.getSymbolTree().getMethodSymbol("ИмяФункции").orElseThrow();
    // when
    var content = markupContentBuilder.getContent(methodSymbol).getValue();
    assertThat(content).isNotEmpty();
    var blocks = Arrays.asList(content.split("---\n?"));
    assertThat(blocks).hasSize(5);
    assertThat(blocks.get(0)).isEqualTo("```bsl\n" + "Функция ИмяФункции(Знач П1: Дата | Число, П2: Число = -10, П2_5, Знач П3: Структура = \"\", " + "П4: Массив | СписокЗначений, ПДата: См. ОбщийМодуль.СуперМетод() = '20100101', ПДатаВремя = '20110101121212', " + "П6 = Ложь, П7 = Истина, П8 = Неопределено, П9 = NULL) Экспорт: Строка | Структура\n```\n\n");
    assertThat(blocks.get(1)).matches("Метод из file://.*/src/test/resources/hover/methodSymbolMarkupContentBuilder.bsl\n\n");
    assertThat(blocks.get(2)).isEqualTo("Описание функции.\nМногострочное.\n\n");
    assertThat(blocks.get(3)).isEqualTo("**Параметры:**\n\n" + "* **П1**: `Дата` | `Число` - Описание даты/числа  \n" + "* **П2**: `Число` - Описание числа  \n" + "* **П2_5**:   \n" + "* **П3**: `Структура` - Описание строки<br>&nbsp;&nbsp;продолжается на следующей строкке:  \n" + "  * **Поле1**: `Число` - Описание поле1  \n" + "  * **Поле2**: `Строка` - Описание поле2  \n" + "  * **Поле3**: `Структура` :  \n" + "    * **Поле31**: `строка`  \n" + "    * **Поле32**: `Структура` :  \n" + "      * **Поле321**: `Число` - Описание поля 321  \n" + "    * **Поле33**: `строка`  \n" + "  * **Поле4**: `строка`  \n" + "* **П4**:   \n" + "&nbsp;&nbsp;`Массив` - Описание Массива  \n" + "&nbsp;&nbsp;`СписокЗначений` - Описание списка  \n" + "* **ПДата**: [См. ОбщийМодуль.СуперМетод()](ОбщийМодуль.СуперМетод())  \n" + "* **ПДатаВремя**:   \n" + "* **П6**:   \n" + "* **П7**:   \n" + "* **П8**:   \n" + "* **П9**: \n" + "\n");
    assertThat(blocks.get(4)).isEqualTo("**Возвращаемое значение:**\n\n" + "&nbsp;&nbsp;`Строка` - вернувшаяся строка  \n" + "&nbsp;&nbsp;`Структура` - Описание строки<br>&nbsp;&nbsp;продолжается на следующей строкке:  \n" + "  * **Поле1**: `Число` - Описание поле1  \n" + "  * **Поле2**: `Строка` - Описание поле2  \n" + "  * **Поле3**: `Структура` :  \n" + "    * **Поле31**: `строка`  \n" + "    * **Поле32**: `Структура`\n\n");
}
Also used : DocumentContext(com.github._1c_syntax.bsl.languageserver.context.DocumentContext) Test(org.junit.jupiter.api.Test) SpringBootTest(org.springframework.boot.test.context.SpringBootTest)

Example 5 with MethodSymbol

use of com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol in project bsl-language-server by 1c-syntax.

the class VariableSymbolMarkupContentBuilderTest method testMethodVarContentFromDirectFile_2_comments_strings.

@Test
void testMethodVarContentFromDirectFile_2_comments_strings() {
    // given
    DocumentContext documentContext = TestUtils.getDocumentContextFromFile(PATH_TO_FILE);
    final var symbolTree = documentContext.getSymbolTree();
    var methodSymbol = symbolTree.getMethodSymbol("ИмяФункции").orElseThrow();
    var varSymbol = symbolTree.getVariableSymbol("Имя_ОписаниеСверхуДвеСтроки_Функция", methodSymbol).orElseThrow();
    // when
    var content = markupContentBuilder.getContent(varSymbol).getValue();
    assertThat(content).isNotEmpty();
    var blocks = Arrays.asList(content.split("---\n?"));
    assertThat(blocks).hasSize(3);
    assertThat(blocks.get(0)).isEqualTo("```bsl\n" + "Перем Имя_ОписаниеСверхуДвеСтроки_Функция\n" + "```\n" + "\n");
    assertThat(blocks.get(1)).matches("Переменная из file://.*/src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl.ИмяФункции\n" + "\n");
    // TODO баг - нет \n для многострочного описания переменной
    assertThat(blocks.get(2)).matches("описание 1 строка\n2 строка\n" + "\n");
}
Also used : DocumentContext(com.github._1c_syntax.bsl.languageserver.context.DocumentContext) Test(org.junit.jupiter.api.Test) SpringBootTest(org.springframework.boot.test.context.SpringBootTest)

Aggregations

DocumentContext (com.github._1c_syntax.bsl.languageserver.context.DocumentContext)15 Test (org.junit.jupiter.api.Test)14 SpringBootTest (org.springframework.boot.test.context.SpringBootTest)14 MethodSymbol (com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol)13 List (java.util.List)4 BSLParser (com.github._1c_syntax.bsl.parser.BSLParser)3 ArrayList (java.util.ArrayList)3 ParameterDefinition (com.github._1c_syntax.bsl.languageserver.context.symbol.ParameterDefinition)2 Ranges (com.github._1c_syntax.bsl.languageserver.utils.Ranges)2 Optional (java.util.Optional)2 Collectors (java.util.stream.Collectors)2 ErrorNode (org.antlr.v4.runtime.tree.ErrorNode)2 TerminalNode (org.antlr.v4.runtime.tree.TerminalNode)2 DefinitionParams (org.eclipse.lsp4j.DefinitionParams)2 Position (org.eclipse.lsp4j.Position)2 ModuleSymbol (com.github._1c_syntax.bsl.languageserver.context.symbol.ModuleSymbol)1 RegionSymbol (com.github._1c_syntax.bsl.languageserver.context.symbol.RegionSymbol)1 SourceDefinedSymbol (com.github._1c_syntax.bsl.languageserver.context.symbol.SourceDefinedSymbol)1 SymbolTree (com.github._1c_syntax.bsl.languageserver.context.symbol.SymbolTree)1 VariableSymbol (com.github._1c_syntax.bsl.languageserver.context.symbol.VariableSymbol)1