Skip to content

Commit 57fb106

Browse files
committed
Улучшение ховера по модулю
1 parent 7ccc3fd commit 57fb106

File tree

5 files changed

+48
-120
lines changed

5 files changed

+48
-120
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import com.github._1c_syntax.bsl.languageserver.context.symbol.AnnotationSymbol;
2525
import com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol;
26+
import com.github._1c_syntax.bsl.languageserver.context.symbol.ModuleSymbol;
2627
import com.github._1c_syntax.bsl.languageserver.context.symbol.ParameterDefinition;
2728
import com.github._1c_syntax.bsl.languageserver.context.symbol.VariableSymbol;
2829
import com.github._1c_syntax.bsl.languageserver.context.symbol.description.MethodDescription;
@@ -137,6 +138,23 @@ public String getSectionWithCodeFences(Collection<String> codeBlocks, String res
137138
return codeFences;
138139
}
139140

141+
public String getLocation(ModuleSymbol symbol) {
142+
var documentContext = symbol.getOwner();
143+
var uri = documentContext.getUri();
144+
145+
var mdObject = documentContext.getMdObject();
146+
String mdoRefLocal = mdObject.map(md -> documentContext.getServerContext()
147+
.getConfiguration()
148+
.getMdoRefLocal(md)
149+
).orElseGet(documentContext::getMdoRef);
150+
151+
return String.format(
152+
"[%s](%s)",
153+
mdoRefLocal,
154+
uri
155+
);
156+
}
157+
140158
public String getLocation(MethodSymbol symbol) {
141159
var documentContext = symbol.getOwner();
142160
var startPosition = symbol.getSelectionRange().getStart();

src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java

Lines changed: 21 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@
2424
import com.github._1c_syntax.bsl.languageserver.context.symbol.ModuleSymbol;
2525
import com.github._1c_syntax.bsl.languageserver.utils.Resources;
2626
import com.github._1c_syntax.bsl.mdo.CommonModule;
27-
import com.github._1c_syntax.bsl.mdo.support.ReturnValueReuse;
28-
import com.github._1c_syntax.bsl.types.ModuleType;
2927
import lombok.RequiredArgsConstructor;
3028
import org.eclipse.lsp4j.MarkupContent;
3129
import org.eclipse.lsp4j.MarkupKind;
@@ -43,22 +41,19 @@
4341
public class ModuleSymbolMarkupContentBuilder implements MarkupContentBuilder<ModuleSymbol> {
4442

4543
private final Resources resources;
44+
private final DescriptionFormatter descriptionFormatter;
4645

4746
@Override
4847
public MarkupContent getContent(ModuleSymbol symbol) {
4948
var markupBuilder = new StringJoiner("\n");
5049

51-
// Сигнатура модуля
52-
String signature = buildSignature(symbol);
53-
addSectionIfNotEmpty(markupBuilder, signature);
54-
5550
// Местоположение модуля
56-
String location = buildLocation(symbol);
57-
addSectionIfNotEmpty(markupBuilder, location);
51+
String moduleLocation = descriptionFormatter.getLocation(symbol);
52+
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, moduleLocation);
5853

5954
// Информация о модуле из метаданных
60-
String moduleInfo = buildModuleInfo(symbol);
61-
addSectionIfNotEmpty(markupBuilder, moduleInfo);
55+
String moduleInfo = getModuleInfo(symbol);
56+
descriptionFormatter.addSectionIfNotEmpty(markupBuilder, moduleInfo);
6257

6358
String content = markupBuilder.toString();
6459
return new MarkupContent(MarkupKind.MARKDOWN, content);
@@ -69,48 +64,7 @@ public SymbolKind getSymbolKind() {
6964
return SymbolKind.Module;
7065
}
7166

72-
private String buildSignature(ModuleSymbol symbol) {
73-
var documentContext = symbol.getOwner();
74-
var moduleType = documentContext.getModuleType();
75-
var moduleName = symbol.getName();
76-
77-
// Для CommonModule показываем только имя модуля
78-
if (moduleType == ModuleType.CommonModule) {
79-
return String.format("```bsl\n%s\n```", moduleName);
80-
}
81-
82-
// Для остальных типов используем mdoRef в зависимости от локали
83-
var mdObject = documentContext.getMdObject();
84-
if (mdObject.isPresent()) {
85-
var mdoRefLocal = documentContext.getServerContext()
86-
.getConfiguration()
87-
.getMdoRefLocal(mdObject.get());
88-
return String.format("```bsl\n%s\n```", mdoRefLocal);
89-
}
90-
91-
var mdoRef = documentContext.getMdoRef();
92-
return String.format("```bsl\n%s\n```", mdoRef);
93-
}
94-
95-
private String buildLocation(ModuleSymbol symbol) {
96-
var documentContext = symbol.getOwner();
97-
var uri = documentContext.getUri();
98-
99-
// Используем локализованный mdoRef
100-
var mdObject = documentContext.getMdObject();
101-
String mdoRefLocal;
102-
if (mdObject.isPresent()) {
103-
mdoRefLocal = documentContext.getServerContext()
104-
.getConfiguration()
105-
.getMdoRefLocal(mdObject.get());
106-
} else {
107-
mdoRefLocal = documentContext.getMdoRef();
108-
}
109-
110-
return String.format("[%s](%s)", mdoRefLocal, uri);
111-
}
112-
113-
private String buildModuleInfo(ModuleSymbol symbol) {
67+
private String getModuleInfo(ModuleSymbol symbol) {
11468
var documentContext = symbol.getOwner();
11569
var mdObject = documentContext.getMdObject();
11670

@@ -123,13 +77,13 @@ private String buildModuleInfo(ModuleSymbol symbol) {
12377
return "";
12478
}
12579

126-
var infoBuilder = new StringJoiner("\n");
80+
var moduleInfoBuilder = new StringJoiner("\n");
12781

12882
// Комментарий
12983
var comment = commonModule.getComment();
13084
if (!comment.isBlank()) {
131-
infoBuilder.add(comment);
132-
infoBuilder.add("");
85+
moduleInfoBuilder.add(comment);
86+
moduleInfoBuilder.add("");
13387
}
13488

13589
// Флаги доступности
@@ -159,33 +113,24 @@ private String buildModuleInfo(ModuleSymbol symbol) {
159113

160114
if (!flags.isEmpty()) {
161115
var flagsHeader = "**" + getResourceString("availability") + ":** ";
162-
infoBuilder.add(flagsHeader + String.join(", ", flags));
163-
infoBuilder.add("");
116+
moduleInfoBuilder.add(flagsHeader + String.join(", ", flags));
117+
moduleInfoBuilder.add("");
164118
}
165119

166120
// Режим повторного использования
167121
var returnValueReuse = commonModule.getReturnValuesReuse();
168-
if (returnValueReuse != ReturnValueReuse.DONT_USE) {
169-
var reuseKey = switch (returnValueReuse) {
170-
case DURING_REQUEST -> "duringRequest";
171-
case DURING_SESSION -> "duringSession";
172-
default -> "";
173-
};
174-
if (!reuseKey.isEmpty()) {
175-
var reuseHeader = "**" + getResourceString("returnValuesReuse") + ":** ";
176-
infoBuilder.add(reuseHeader + getResourceString(reuseKey));
177-
}
178-
}
122+
var reuseKey = switch (returnValueReuse) {
123+
case DURING_REQUEST -> "duringRequest";
124+
case DURING_SESSION -> "duringSession";
125+
case DONT_USE, UNKNOWN -> "";
126+
};
179127

180-
return infoBuilder.toString();
181-
}
182-
183-
private void addSectionIfNotEmpty(StringJoiner markupBuilder, String newContent) {
184-
if (!newContent.isEmpty()) {
185-
markupBuilder.add(newContent);
186-
markupBuilder.add("");
187-
markupBuilder.add("---");
128+
if (!reuseKey.isEmpty()) {
129+
var reuseHeader = "**" + getResourceString("returnValuesReuse") + ":** ";
130+
moduleInfoBuilder.add(reuseHeader + getResourceString(reuseKey));
188131
}
132+
133+
return moduleInfoBuilder.toString();
189134
}
190135

191136
private String getResourceString(String key) {

src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder_en.properties

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,8 @@
1-
# Module types
2-
commonModule=Common Module
3-
managerModule=Manager Module
4-
objectModule=Object Module
5-
formModule=Form Module
6-
commandModule=Command Module
7-
recordSetModule=Record Set Module
8-
valueManagerModule=Value Manager Module
9-
sessionModule=Session Module
10-
externalConnectionModule=External Connection Module
11-
managedApplicationModule=Managed Application Module
12-
ordinaryApplicationModule=Ordinary Application Module
13-
httpServiceModule=HTTP Service Module
14-
webServiceModule=Web Service Module
15-
integrationServiceModule=Integration Service Module
16-
module=Module
17-
181
# Availability flags
192
availability=Availability
203
server=Server
21-
clientManagedApplication=Managed Application
22-
clientOrdinaryApplication=Ordinary Application
4+
clientManagedApplication=Client (Managed Application)
5+
clientOrdinaryApplication=Client (Ordinary Application)
236
externalConnection=External Connection
247
serverCall=Server Call
258
privilegedMode=Privileged Mode

src/main/resources/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder_ru.properties

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,8 @@
1-
# Module types
2-
commonModule=Общий модуль
3-
managerModule=Модуль менеджера
4-
objectModule=Модуль объекта
5-
formModule=Модуль формы
6-
commandModule=Модуль команды
7-
recordSetModule=Модуль набора записей
8-
valueManagerModule=Модуль менеджера значения
9-
sessionModule=Модуль сеанса
10-
externalConnectionModule=Модуль внешнего соединения
11-
managedApplicationModule=Модуль управляемого приложения
12-
ordinaryApplicationModule=Модуль обычного приложения
13-
httpServiceModule=Модуль HTTP-сервиса
14-
webServiceModule=Модуль Web-сервиса
15-
integrationServiceModule=Модуль сервиса интеграции
16-
module=Модуль
17-
181
# Availability flags
192
availability=Доступность
203
server=Сервер
21-
clientManagedApplication=Управляемое приложение
22-
clientOrdinaryApplication=Обычное приложение
4+
clientManagedApplication=Клиент (Управляемое приложение)
5+
clientOrdinaryApplication=Клиент (Обычное приложение)
236
externalConnection=Внешнее соединение
247
serverCall=Вызов сервера
258
privilegedMode=Привилегированный режим

src/test/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilderTest.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,14 @@ void testContentFromCommonModule() {
6565

6666
var blocks = Arrays.asList(content.split("---\n?"));
6767

68-
// Должны быть: сигнатура, местоположение, информация о модуле
68+
// Должны быть: местоположение, информация о модуле
6969
assertThat(blocks).hasSizeGreaterThanOrEqualTo(2);
7070

7171
// Сигнатура - для CommonModule показывается только имя модуля
72-
assertThat(blocks.get(0)).contains("ПервыйОбщийМодуль");
73-
assertThat(blocks.get(0)).doesNotContain("Общий модуль:");
72+
assertThat(blocks.get(0)).contains("ОбщийМодуль.ПервыйОбщийМодуль");
7473

7574
// Местоположение - используется локализованный mdoRef
76-
assertThat(blocks.get(1)).contains("ОбщийМодуль.ПервыйОбщийМодуль");
75+
assertThat(blocks.get(1)).contains("Доступность:");
7776
}
7877

7978
@Test
@@ -90,7 +89,7 @@ void testContentFromManagerModule() {
9089

9190
var blocks = Arrays.asList(content.split("---\n?"));
9291

93-
assertThat(blocks).hasSizeGreaterThanOrEqualTo(2);
92+
assertThat(blocks).hasSizeGreaterThanOrEqualTo(1);
9493

9594
// Для ManagerModule используется локализованный mdoRef
9695
assertThat(blocks.get(0)).contains("Справочник.Справочник1");
@@ -110,7 +109,7 @@ void testContentFromObjectModule() {
110109

111110
var blocks = Arrays.asList(content.split("---\n?"));
112111

113-
assertThat(blocks).hasSizeGreaterThanOrEqualTo(2);
112+
assertThat(blocks).hasSizeGreaterThanOrEqualTo(1);
114113

115114
// Для ObjectModule используется локализованный mdoRef
116115
assertThat(blocks.get(0)).contains("Справочник.Справочник1");

0 commit comments

Comments
 (0)