diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java index bc92c0ed0e6..03ae59179ae 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder.java @@ -24,6 +24,7 @@ import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration; import com.github._1c_syntax.bsl.languageserver.context.symbol.VariableSymbol; import com.github._1c_syntax.bsl.languageserver.context.symbol.variable.VariableDescription; +import com.github._1c_syntax.bsl.languageserver.utils.Resources; import lombok.RequiredArgsConstructor; import org.eclipse.lsp4j.MarkupContent; import org.eclipse.lsp4j.MarkupKind; @@ -41,12 +42,14 @@ public class VariableSymbolMarkupContentBuilder implements MarkupContentBuilder< private final LanguageServerConfiguration configuration; private final DescriptionFormatter descriptionFormatter; + private final Resources resources; @Override public MarkupContent getContent(VariableSymbol symbol) { var markupBuilder = new StringJoiner("\n"); // сигнатура + // информация о переменной // местоположение переменной // описание переменной @@ -54,6 +57,10 @@ public MarkupContent getContent(VariableSymbol symbol) { String signature = descriptionFormatter.getSignature(symbol); descriptionFormatter.addSectionIfNotEmpty(markupBuilder, signature); + // информация о переменной + var variableInfo = getVariableInfo(symbol); + descriptionFormatter.addSectionIfNotEmpty(markupBuilder, variableInfo); + // местоположение переменной var location = descriptionFormatter.getLocation(symbol); descriptionFormatter.addSectionIfNotEmpty(markupBuilder, location); @@ -78,4 +85,20 @@ public SymbolKind getSymbolKind() { return SymbolKind.Variable; } + private String getVariableInfo(VariableSymbol symbol) { + return switch (symbol.getKind()) { + case GLOBAL -> getResourceString("globalVariable"); + case MODULE -> getResourceString("moduleVariable"); + case LOCAL -> getResourceString("localVariable").formatted(symbol.getScope().getName()); + case PARAMETER -> getResourceString("methodParameter").formatted(symbol.getScope().getName()); + case DYNAMIC -> symbol.getScope().getSymbolKind() == SymbolKind.Module + ? getResourceString("dynamicVariableOfModule") + : getResourceString("dynamicVariableOfMethod").formatted(symbol.getScope().getName()); + }; + } + + private String getResourceString(String key) { + return resources.getResourceString(getClass(), key); + } + } diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder_en.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder_en.properties new file mode 100644 index 00000000000..0625f4b7cc3 --- /dev/null +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder_en.properties @@ -0,0 +1,8 @@ +# Variable kinds +globalVariable=Global variable +moduleVariable=Module-level variable +localVariable=Local variable of method %s +methodParameter=Parameter of method %s +dynamicVariableOfModule=Dynamic variable of module +dynamicVariableOfMethod=Dynamic variable of method %s + diff --git a/src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder_ru.properties b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder_ru.properties new file mode 100644 index 00000000000..c6731dfabd7 --- /dev/null +++ b/src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilder_ru.properties @@ -0,0 +1,7 @@ +# Variable kinds +globalVariable=Глобальная переменная +moduleVariable=Переменная уровня модуля +localVariable=Локальная переменная метода %s +methodParameter=Параметр метода %s +dynamicVariableOfModule=Динамическая переменная модуля +dynamicVariableOfMethod=Динамическая переменная метода %s diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java index 35430f60c8a..dc3d568d8c2 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/VariableSymbolMarkupContentBuilderTest.java @@ -68,14 +68,18 @@ void testFileVarContentFromDirectFile_NoComments() { var blocks = Arrays.asList(content.split("---\n?")); - assertThat(blocks).hasSize(2); + assertThat(blocks).hasSize(3); assertThat(blocks.get(0)).isEqualTo(""" ```bsl Перем ИмяБезОписания ``` """); - assertThat(blocks.get(1)).matches(""" + assertThat(blocks.get(1)).isEqualTo(""" + Переменная уровня модуля + + """); + assertThat(blocks.get(2)).matches(""" \\[file://.*/src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl]\\(.*src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl#\\d+\\) """); @@ -95,18 +99,22 @@ void testFileVarContentFromDirectFile_OneCommentsStringFromRight() { var blocks = Arrays.asList(content.split("---\n?")); - assertThat(blocks).hasSize(3); + assertThat(blocks).hasSize(4); assertThat(blocks.get(0)).isEqualTo(""" ```bsl Перем Имя_ОписаниеСправаОднойСтрокой ``` """); - assertThat(blocks.get(1)).matches(""" - \\[file://.*/src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl]\\(.*src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl#\\d+\\) + assertThat(blocks.get(1)).isEqualTo(""" + Переменная уровня модуля """); assertThat(blocks.get(2)).matches(""" + \\[file://.*/src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl]\\(.*src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl#\\d+\\) + + """); + assertThat(blocks.get(3)).matches(""" описание """); @@ -127,19 +135,23 @@ void testMethodVarContentFromDirectFile_2_comments_strings() { var blocks = Arrays.asList(content.split("---\n?")); - assertThat(blocks).hasSize(3); + assertThat(blocks).hasSize(4); assertThat(blocks.get(0)).isEqualTo(""" ```bsl Перем Имя_ОписаниеСверхуДвеСтроки_Функция ``` """); - assertThat(blocks.get(1)).matches(""" + assertThat(blocks.get(1)).isEqualTo(""" + Локальная переменная метода ИмяФункции + + """); + assertThat(blocks.get(2)).matches(""" \\[file://.*/src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl.ИмяФункции]\\(.*src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl#\\d+\\) """); // TODO баг - нет \n для многострочного описания переменной - assertThat(blocks.get(2)).matches(""" + assertThat(blocks.get(3)).matches(""" описание 1 строка 2 строка @@ -161,18 +173,22 @@ void testMethodVarContentFromDirectFile_3_comments_strings() { var blocks = Arrays.asList(content.split("---\n?")); - assertThat(blocks).hasSize(3); + assertThat(blocks).hasSize(4); assertThat(blocks.get(0)).isEqualTo(""" ```bsl Перем Имя_ОписаниеСверхуТриСтрокиПоследняяПустая_Функция ``` """); - assertThat(blocks.get(1)).matches(""" - \\[file://.*/src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl.ИмяФункции]\\(.*src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl#\\d+\\) + assertThat(blocks.get(1)).isEqualTo(""" + Локальная переменная метода ИмяФункции """); assertThat(blocks.get(2)).matches(""" + \\[file://.*/src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl.ИмяФункции]\\(.*src/test/resources/hover/variableSymbolMarkupContentBuilder.bsl#\\d+\\) + + """); + assertThat(blocks.get(3)).matches(""" описание 1 строка 2 строка @@ -195,14 +211,18 @@ void testContentFromObjectModule() { var blocks = Arrays.asList(content.split("---\n?")); - assertThat(blocks).hasSize(2); + assertThat(blocks).hasSize(3); assertThat(blocks.get(0)).isEqualTo(""" ```bsl Перем ВалютаУчета ``` """); - assertThat(blocks.get(1)).matches("\\[Catalog.Справочник1]\\(.*Catalogs/.*/Ext/ObjectModule.bsl#\\d+\\)\n\n"); + assertThat(blocks.get(1)).isEqualTo(""" + Переменная уровня модуля + + """); + assertThat(blocks.get(2)).matches("\\[Catalog.Справочник1]\\(.*Catalogs/.*/Ext/ObjectModule.bsl#\\d+\\)\n\n"); } }