Skip to content

Commit 93b86b3

Browse files
committed
Simplify SCIP range model
1 parent 71691f8 commit 93b86b3

6 files changed

Lines changed: 90 additions & 104 deletions

File tree

‎scip-javac/src/main/java/com/sourcegraph/scip_javac/ScipVisitor.java‎

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22

33
import com.sourcegraph.scip.LocalSymbolsCache;
44
import com.sourcegraph.scip.ScipDocumentBuilder;
5-
import com.sourcegraph.scip.ScipRanges;
6-
import com.sourcegraph.scip.ScipRanges.Range;
5+
import com.sourcegraph.scip.ScipRange;
76
import com.sourcegraph.scip.ScipSymbols;
87
import com.sun.source.tree.AnnotatedTypeTree;
98
import com.sun.source.tree.ClassTree;
@@ -184,7 +183,7 @@ private void resolveMethodTree(MethodTree node, TreePath treePath) {
184183
private void resolveVariableTree(VariableTree node, TreePath treePath) {
185184
Element sym = trees.getElement(treePath);
186185
if (sym == null) return;
187-
Range range =
186+
ScipRange range =
188187
emitDefinition(sym, node, sym.getSimpleName(), CompilerRange.FROM_POINT_WITH_TEXT_SEARCH);
189188
if (sym.getKind() == ElementKind.ENUM_CONSTANT) {
190189
TreePath typeTreePath = nodes.get(node.getInitializer());
@@ -248,8 +247,8 @@ private void resolveNewClassTree(NewClassTree node, TreePath treePath) {
248247
// =======================================
249248
// Occurrence + SymbolInformation emission
250249
// =======================================
251-
private Range emitDefinition(Element sym, Tree tree, Name name, CompilerRange kind) {
252-
Range range = computeRange(tree, kind, sym, name == null ? null : name.toString());
250+
private ScipRange emitDefinition(Element sym, Tree tree, Name name, CompilerRange kind) {
251+
ScipRange range = computeRange(tree, kind, sym, name == null ? null : name.toString());
253252
if (range == null) return null;
254253
emitOccurrence(sym, range, SymbolRole.Definition_VALUE, computeEnclosingRange(tree));
255254
declTrees.put(sym, tree);
@@ -258,12 +257,12 @@ private Range emitDefinition(Element sym, Tree tree, Name name, CompilerRange ki
258257
}
259258

260259
private void emitReference(Element sym, Tree tree, Name name, CompilerRange kind) {
261-
Range range = computeRange(tree, kind, sym, name == null ? null : name.toString());
260+
ScipRange range = computeRange(tree, kind, sym, name == null ? null : name.toString());
262261
if (range == null) return;
263262
emitOccurrence(sym, range, 0 /* reference */, null);
264263
}
265264

266-
private void emitOccurrence(Element sym, Range range, int role, Range enclosingRange) {
265+
private void emitOccurrence(Element sym, ScipRange range, int role, ScipRange enclosingRange) {
267266
String symbol = scipSymbol(sym);
268267
if (symbol.isEmpty()) return;
269268
Occurrence.Builder b = Occurrence.newBuilder().setSymbol(symbol).setSymbolRoles(role);
@@ -370,7 +369,7 @@ private SymbolInformation.Kind scipKind(Element sym) {
370369
// =======================================
371370
// Source position / range computation
372371
// =======================================
373-
private Range computeRange(Tree tree, CompilerRange kind, Element sym, String name) {
372+
private ScipRange computeRange(Tree tree, CompilerRange kind, Element sym, String name) {
374373
if (sym == null) return null;
375374
SourcePositions sourcePositions = trees.getSourcePositions();
376375
int start = (int) sourcePositions.getStartPosition(compUnitTree, tree);
@@ -404,7 +403,7 @@ private Range computeRange(Tree tree, CompilerRange kind, Element sym, String na
404403
return lineMapRange(start, end);
405404
}
406405

407-
private Range computeEnclosingRange(Tree tree) {
406+
private ScipRange computeEnclosingRange(Tree tree) {
408407
if (tree == null) return null;
409408
TreePath path = nodes.get(tree);
410409
if (path == null) return null;
@@ -423,7 +422,7 @@ private Range computeEnclosingRange(Tree tree) {
423422
return lineMapRange(start, end);
424423
}
425424

426-
private Range lineMapRange(int start, int end) {
425+
private ScipRange lineMapRange(int start, int end) {
427426
if (start == Diagnostic.NOPOS || end == Diagnostic.NOPOS || end <= start) return null;
428427
LineMap lineMap = compUnitTree.getLineMap();
429428
int startLine = (int) lineMap.getLineNumber(start) - 1;
@@ -441,8 +440,8 @@ private Range lineMapRange(int start, int end) {
441440
endChar -= count * 7;
442441
}
443442

444-
if (startLine == endLine) return ScipRanges.singleLineRange(startLine, startChar, endChar);
445-
return ScipRanges.range(startLine, startChar, endLine, endChar);
443+
if (startLine == endLine) return ScipRange.singleLine(startLine, startChar, endChar);
444+
return ScipRange.range(startLine, startChar, endLine, endChar);
446445
}
447446

448447
// =======================================

‎scip-kotlinc/src/main/kotlin/com/sourcegraph/scip_kotlinc/ScipTextDocumentBuilder.kt‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.sourcegraph.scip_kotlinc
22

33
import com.sourcegraph.scip.ScipDocumentBuilder
4-
import com.sourcegraph.scip.ScipRanges
5-
import com.sourcegraph.scip.ScipRanges.Range
4+
import com.sourcegraph.scip.ScipRange
65
import com.sourcegraph.scip.ScipShardPaths
76
import java.nio.file.Path
87
import java.nio.file.Paths
@@ -116,19 +115,19 @@ class ScipTextDocumentBuilder(
116115
return builder.build()
117116
}
118117

119-
private fun range(element: KtSourceElement): Range {
118+
private fun range(element: KtSourceElement): ScipRange {
120119
val line = lineMap.lineNumber(element) - 1
121120
val startCol = lineMap.startCharacter(element)
122121
val endCol = lineMap.endCharacter(element)
123-
return ScipRanges.singleLineRange(line, startCol, endCol)
122+
return ScipRange.singleLine(line, startCol, endCol)
124123
}
125124

126-
private fun enclosingRange(element: KtSourceElement): Range {
125+
private fun enclosingRange(element: KtSourceElement): ScipRange {
127126
val startLine = lineMap.lineNumber(element) - 1
128127
val startCol = lineMap.startCharacter(element)
129128
val endLine = lineMap.lineNumberForOffset(element.endOffset) - 1
130129
val endCol = lineMap.columnForOffset(element.endOffset)
131-
return ScipRanges.range(startLine, startCol, endLine, endCol)
130+
return ScipRange.range(startLine, startCol, endLine, endCol)
132131
}
133132

134133
private fun relativePath(): String =

‎scip-kotlinc/src/test/kotlin/com/sourcegraph/scip_kotlinc/test/ScipBuilders.kt‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.sourcegraph.scip_kotlinc.test
22

3-
import com.sourcegraph.scip.ScipRanges
4-
import com.sourcegraph.scip.ScipRanges.Range
3+
import com.sourcegraph.scip.ScipRange
54
import org.scip_code.scip.Occurrence
65
import org.scip_code.scip.SymbolInformation
76
import org.scip_code.scip.SymbolRole
@@ -39,18 +38,18 @@ class ScipRangeBuilder {
3938
var endLine: Int = -1
4039
var endCharacter: Int = 0
4140

42-
internal fun toScipRange(): Range {
41+
internal fun toScipRange(): ScipRange {
4342
val line = if (endLine < 0) startLine else endLine
44-
return ScipRanges.range(startLine, startCharacter, line, endCharacter)
43+
return ScipRange.range(startLine, startCharacter, line, endCharacter)
4544
}
4645
}
4746

4847
@ScipBuilderDsl
4948
class ScipOccurrenceBuilder {
5049
var role: Int = REFERENCE
5150
var symbol: String = ""
52-
private var range: Range? = null
53-
private var enclosingRange: Range? = null
51+
private var range: ScipRange? = null
52+
private var enclosingRange: ScipRange? = null
5453

5554
fun range(block: ScipRangeBuilder.() -> Unit) {
5655
range = ScipRangeBuilder().apply(block).toScipRange()

‎scip-shared/src/main/java/com/sourcegraph/scip/ScipDocumentBuilder.java‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
*/
2121
public final class ScipDocumentBuilder {
2222
private static final Comparator<Occurrence> OCCURRENCE_ORDER =
23-
Comparator.<Occurrence>comparingInt(ScipRanges::rangeStartLine)
24-
.thenComparingInt(ScipRanges::rangeStartCharacter);
23+
Comparator.<Occurrence>comparingInt(o -> ScipRange.from(o).startLine())
24+
.thenComparingInt(o -> ScipRange.from(o).startCharacter());
2525

2626
private final Map<OccurrenceKey, Occurrence> occurrences = new LinkedHashMap<>();
2727
private final Map<String, SymbolInformation> symbols = new LinkedHashMap<>();
@@ -49,12 +49,12 @@ public Document build(String language, String relativePath, String text) {
4949
}
5050

5151
private static final class OccurrenceKey {
52-
private final ScipRanges.Range range;
52+
private final ScipRange range;
5353
private final String symbol;
5454
private final int roles;
5555

5656
OccurrenceKey(Occurrence occurrence) {
57-
this.range = ScipRanges.range(occurrence);
57+
this.range = ScipRange.from(occurrence);
5858
this.symbol = occurrence.getSymbol();
5959
this.roles = occurrence.getSymbolRoles();
6060
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package com.sourcegraph.scip;
2+
3+
import org.scip_code.scip.MultiLineRange;
4+
import org.scip_code.scip.Occurrence;
5+
import org.scip_code.scip.SingleLineRange;
6+
7+
/** A normalized source range that can be serialized to SCIP's typed range oneofs. */
8+
public record ScipRange(int startLine, int startCharacter, int endLine, int endCharacter) {
9+
10+
public static ScipRange singleLine(int line, int startCharacter, int endCharacter) {
11+
return new ScipRange(line, startCharacter, line, endCharacter);
12+
}
13+
14+
public static ScipRange range(int startLine, int startCharacter, int endLine, int endCharacter) {
15+
return new ScipRange(startLine, startCharacter, endLine, endCharacter);
16+
}
17+
18+
public static ScipRange from(Occurrence occurrence) {
19+
switch (occurrence.getTypedRangeCase()) {
20+
case SINGLE_LINE_RANGE:
21+
return from(occurrence.getSingleLineRange());
22+
case MULTI_LINE_RANGE:
23+
return from(occurrence.getMultiLineRange());
24+
case TYPEDRANGE_NOT_SET:
25+
throw new IllegalArgumentException("expected SCIP 0.9 typed occurrence range");
26+
}
27+
throw new IllegalArgumentException("expected SCIP 0.9 typed occurrence range");
28+
}
29+
30+
private static ScipRange from(SingleLineRange range) {
31+
return new ScipRange(
32+
range.getLine(), range.getStartCharacter(), range.getLine(), range.getEndCharacter());
33+
}
34+
35+
private static ScipRange from(MultiLineRange range) {
36+
return new ScipRange(
37+
range.getStartLine(),
38+
range.getStartCharacter(),
39+
range.getEndLine(),
40+
range.getEndCharacter());
41+
}
42+
43+
public boolean isSingleLine() {
44+
return startLine == endLine;
45+
}
46+
47+
public SingleLineRange toSingleLineRange() {
48+
if (!isSingleLine()) throw new IllegalStateException("expected single-line range");
49+
return SingleLineRange.newBuilder()
50+
.setLine(startLine)
51+
.setStartCharacter(startCharacter)
52+
.setEndCharacter(endCharacter)
53+
.build();
54+
}
55+
56+
public MultiLineRange toMultiLineRange() {
57+
if (isSingleLine()) throw new IllegalStateException("expected multi-line range");
58+
return MultiLineRange.newBuilder()
59+
.setStartLine(startLine)
60+
.setStartCharacter(startCharacter)
61+
.setEndLine(endLine)
62+
.setEndCharacter(endCharacter)
63+
.build();
64+
}
65+
}

‎scip-shared/src/main/java/com/sourcegraph/scip/ScipRanges.java‎

Lines changed: 0 additions & 76 deletions
This file was deleted.

0 commit comments

Comments
 (0)