Skip to content

Commit c1bd87d

Browse files
authored
fix range emitted for member references to only include the reference (#309)
1 parent e825792 commit c1bd87d

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/CompilerRange.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,21 @@ public enum CompilerRange {
3232

3333
/**
3434
* Use text search to find the start of the symbol name and use (found start + symbol name length)
35-
* for the SemanticDB end position;
35+
* for the SemanticDB end position.
3636
*/
3737
FROM_TEXT_SEARCH,
3838

3939
/**
4040
* Use text search to find the start of the symbol name, using the point position as the starting
41-
* search offset and using (found start + symbol name length) for the SemanticDB end position;
41+
* search offset and using (found start + symbol name length) for the SemanticDB end position.
4242
*/
43-
FROM_POINT_WITH_TEXT_SEARCH;
43+
FROM_POINT_WITH_TEXT_SEARCH,
44+
45+
/**
46+
* Use text search to find the start of the symbol name, searching from the end instead of the
47+
* start.
48+
*/
49+
FROM_END_WITH_TEXT_SEARCH;
4450

4551
public boolean isFromPoint() {
4652
switch (this) {
@@ -56,10 +62,15 @@ public boolean isFromPoint() {
5662
public boolean isFromTextSearch() {
5763
switch (this) {
5864
case FROM_TEXT_SEARCH:
65+
case FROM_END_WITH_TEXT_SEARCH:
5966
case FROM_POINT_WITH_TEXT_SEARCH:
6067
return true;
6168
default:
6269
return false;
6370
}
6471
}
72+
73+
public boolean isFromEnd() {
74+
return this == CompilerRange.FROM_END_WITH_TEXT_SEARCH;
75+
}
6576
}

semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/RangeFinder.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,16 @@ public static Optional<Semanticdb.Range> findRange(
2222
CompilationUnitTree root,
2323
Element element,
2424
int startPos,
25-
String source) {
25+
String source,
26+
boolean fromEnd) {
2627
LineMap lineMap = root.getLineMap();
2728
Name name = element.getSimpleName();
2829
if (name.contentEquals("<init>")) name = element.getEnclosingElement().getSimpleName();
2930

3031
int endPos = (int) trees.getSourcePositions().getEndPosition(root, path.getLeaf());
3132
// false for anonymous classes
3233
if (name.length() != 0) {
33-
startPos = findNameIn(name, startPos, source);
34+
startPos = findNameIn(name, fromEnd ? endPos : startPos, source, fromEnd);
3435
endPos = startPos + name.length();
3536
}
3637

@@ -48,10 +49,12 @@ public static Optional<Semanticdb.Range> findRange(
4849
return Optional.of(range);
4950
}
5051

51-
private static int findNameIn(CharSequence name, int start, String source) {
52+
private static int findNameIn(CharSequence name, int start, String source, boolean fromEnd) {
5253
if (source.equals("")) return -1;
5354

54-
int offset = source.indexOf(name.toString(), start);
55+
int offset;
56+
if (fromEnd) offset = source.lastIndexOf(name.toString(), start);
57+
else offset = source.indexOf(name.toString(), start);
5558
if (offset > -1) {
5659
return offset;
5760
}

semanticdb-javac/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbVisitor.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public Void visitIdentifier(IdentifierTree node, Void unused) {
216216
public Void visitMemberReference(MemberReferenceTree node, Void unused) {
217217
if (node instanceof JCTree.JCMemberReference) {
218218
JCTree.JCMemberReference ref = (JCTree.JCMemberReference) node;
219-
emitSymbolOccurrence(ref.sym, ref, Role.REFERENCE, CompilerRange.FROM_START_TO_END);
219+
emitSymbolOccurrence(ref.sym, ref, Role.REFERENCE, CompilerRange.FROM_END_WITH_TEXT_SEARCH);
220220
}
221221
return super.visitMemberReference(node, unused);
222222
}
@@ -284,7 +284,8 @@ private Optional<Semanticdb.Range> semanticdbRange(
284284
getCurrentPath().getCompilationUnit(),
285285
sym,
286286
start,
287-
this.source);
287+
this.source,
288+
kind.isFromEnd());
288289
if (range.isPresent()) return Optional.of(correctForTabs(range.get(), lineMap, start));
289290
else return range;
290291
} else if (start != Position.NOPOS && end != Position.NOPOS && end > start) {

tests/snapshots/src/main/generated/minimized/Enums.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public static String app() {
4646
// ^^^^^ reference minimized/Enums#value.
4747
// ^^^ reference java/util/stream/Stream#map().
4848
// ^^^^^ reference minimized/Enums#
49-
// ^^^^^^^^^^^^^^ reference minimized/Enums#valueOf().
49+
// ^^^^^^^ reference minimized/Enums#valueOf().
5050
// ^^^^^^^^ reference java/lang/Object#toString().
5151
return all + A.value + B.value + C.value;
5252
// ^^^ reference local2

0 commit comments

Comments
 (0)