Skip to content

Commit c8d25e2

Browse files
committed
Поддержка многообразия возможных constValue
1 parent 23c3a72 commit c8d25e2

File tree

3 files changed

+83
-6
lines changed

3 files changed

+83
-6
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinder.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@
3737
import com.github._1c_syntax.bsl.parser.BSLParser;
3838
import com.github._1c_syntax.bsl.parser.BSLParserRuleContext;
3939
import lombok.RequiredArgsConstructor;
40-
import org.antlr.v4.runtime.tree.TerminalNode;
4140
import org.apache.commons.lang3.tuple.Pair;
4241
import org.eclipse.lsp4j.Location;
4342
import org.eclipse.lsp4j.Position;
43+
import org.jetbrains.annotations.NotNull;
4444
import org.springframework.context.event.EventListener;
4545
import org.springframework.stereotype.Component;
4646

@@ -122,17 +122,25 @@ public Optional<Reference> findReference(URI uri, Position position) {
122122
.map(BSLParserRuleContext::getParent) // BSLParser.AnnotationParamContext
123123
.map(BSLParser.AnnotationParamContext.class::cast)
124124
.flatMap(annotationParamContext -> getReferenceToAnnotationParam(documentContext, Optional.of(annotationParamContext)));
125+
} else if (parent instanceof BSLParser.ConstValueContext constValue) {
126+
return getReferenceToAnnotationParamSymbol(constValue, documentContext);
125127
} else if (parent.getParent() instanceof BSLParser.ConstValueContext constValue) {
126-
return Optional.of(constValue)
127-
.map(BSLParserRuleContext::getParent) // BSLParser.AnnotationParamContext
128-
.filter(BSLParser.AnnotationParamContext.class::isInstance)
129-
.map(BSLParser.AnnotationParamContext.class::cast)
130-
.flatMap(annotationParamContext -> getReferenceToAnnotationParam(documentContext, Optional.of(annotationParamContext)));
128+
return getReferenceToAnnotationParamSymbol(constValue, documentContext);
129+
} else if (parent.getParent().getParent() instanceof BSLParser.ConstValueContext constValue) {
130+
return getReferenceToAnnotationParamSymbol(constValue, documentContext);
131131
}
132132

133133
return Optional.empty();
134134
}
135135

136+
private @NotNull Optional<Reference> getReferenceToAnnotationParamSymbol(BSLParser.ConstValueContext constValue, DocumentContext documentContext) {
137+
return Optional.of(constValue)
138+
.map(BSLParserRuleContext::getParent) // BSLParser.AnnotationParamContext
139+
.filter(BSLParser.AnnotationParamContext.class::isInstance)
140+
.map(BSLParser.AnnotationParamContext.class::cast)
141+
.flatMap(annotationParamContext -> getReferenceToAnnotationParam(documentContext, Optional.of(annotationParamContext)));
142+
}
143+
136144
private Optional<AnnotationSymbol> getAnnotationSymbol(BSLParser.AnnotationNameContext annotationNode) {
137145
var annotationName = annotationNode.getText();
138146
return Optional.ofNullable(registeredAnnotations.get(annotationName));

src/test/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinderTest.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
import org.eclipse.lsp4j.Position;
2929
import org.eclipse.lsp4j.SymbolKind;
3030
import org.junit.jupiter.api.Test;
31+
import org.junit.jupiter.params.ParameterizedTest;
32+
import org.junit.jupiter.params.provider.CsvSource;
3133
import org.springframework.beans.factory.annotation.Autowired;
3234
import org.springframework.boot.test.context.SpringBootTest;
3335

@@ -105,4 +107,47 @@ void findReferenceOfAnnotationParameterValue() {
105107
.hasValueSatisfying(reference -> assertThat(reference.getSourceDefinedSymbol().orElseThrow().getSelectionRange()).isEqualTo(Ranges.create(7, 10, 28)))
106108
;
107109
}
110+
111+
@ParameterizedTest
112+
@CsvSource(textBlock = """
113+
6, 24, 6, 19, 6, 27
114+
8, 10, 8, 4, 9, 12
115+
9, 10, 8, 4, 9, 12
116+
11, 20, 11, 19, 11, 21
117+
12, 20, 12, 19, 12, 22
118+
13, 20, 13, 19, 13, 25
119+
14, 20, 14, 19, 14, 29
120+
15, 20, 15, 19, 15, 31
121+
16, 20, 16, 19, 16, 23
122+
18, 5, 18, 4, 18, 6
123+
19, 5, 19, 4, 19, 7
124+
20, 5, 20, 4, 20, 12
125+
21, 5, 21, 4, 22, 12
126+
22, 5, 21, 4, 22, 12
127+
23, 5, 23, 4, 23, 10
128+
24, 5, 24, 4, 24, 14
129+
25, 5, 25, 4, 25, 16
130+
26, 5, 26, 4, 26, 8
131+
"""
132+
)
133+
void findReferenceOfAnnotationParameterValue_allLiterals(int positionLine, int positionCharacter, int selectionRangeStartLine, int selectionRangeStartCharacter, int selectionRangeEndLine, int selectionRangeEndCharacter) {
134+
// given
135+
initServerContext("./src/test/resources/references/annotations");
136+
var documentContext = TestUtils.getDocumentContextFromFile("./src/test/resources/references/AnnotationReferenceFinder.os");
137+
138+
var module = documentContext.getSymbolTree().getModule();
139+
140+
// when
141+
var optionalReference = referenceFinder.findReference(documentContext.getUri(), new Position(positionLine, positionCharacter));
142+
143+
// then
144+
assertThat(optionalReference)
145+
.isPresent()
146+
.hasValueSatisfying(reference -> assertThat(reference.getFrom()).isEqualTo(module))
147+
.hasValueSatisfying(reference -> assertThat(reference.getSymbol().getName()).isEqualTo("Значение"))
148+
.hasValueSatisfying(reference -> assertThat(reference.getSymbol().getSymbolKind()).isEqualTo(SymbolKind.TypeParameter))
149+
.hasValueSatisfying(reference -> assertThat(reference.getSelectionRange()).isEqualTo(Ranges.create(selectionRangeStartLine, selectionRangeStartCharacter, selectionRangeEndLine, selectionRangeEndCharacter)))
150+
.hasValueSatisfying(reference -> assertThat(reference.getSourceDefinedSymbol().orElseThrow().getSelectionRange()).isEqualTo(Ranges.create(7, 10, 28)))
151+
;
152+
}
108153
}

src/test/resources/references/AnnotationReferenceFinder.os

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,29 @@
44
&ТестоваяАннотация2
55
Перем ТестоваяПеременная2;
66

7+
&ТестоваяАннотация("Строка")
8+
&ТестоваяАннотация(
9+
"Многострочная
10+
|Строка"
11+
)
12+
&ТестоваяАннотация(32)
13+
&ТестоваяАннотация(-32)
14+
&ТестоваяАннотация(Истина)
15+
&ТестоваяАннотация('20200101')
16+
&ТестоваяАннотация(Неопределено)
17+
&ТестоваяАннотация(NULL)
18+
&ТестоваяАннотация(
19+
42,
20+
-42,
21+
"Строка",
22+
"Многострочная
23+
|Строка",
24+
Истина,
25+
'20200101',
26+
Неопределено,
27+
NULL
28+
)
29+
Перем ТестоваяПеременная3;
30+
731
Процедура ПриСозданииОбъекта()
832
КонецПроцедуры

0 commit comments

Comments
 (0)