Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,21 @@ public enum CompilerRange {

/**
* Use text search to find the start of the symbol name and use (found start + symbol name length)
* for the SemanticDB end position;
* for the SemanticDB end position.
*/
FROM_TEXT_SEARCH,

/**
* Use text search to find the start of the symbol name, using the point position as the starting
* search offset and using (found start + symbol name length) for the SemanticDB end position;
* search offset and using (found start + symbol name length) for the SemanticDB end position.
*/
FROM_POINT_WITH_TEXT_SEARCH;
FROM_POINT_WITH_TEXT_SEARCH,

/**
* Use text search to find the start of the symbol name, searching from the end instead of the
* start.
*/
FROM_END_WITH_TEXT_SEARCH;

public boolean isFromPoint() {
switch (this) {
Expand All @@ -56,10 +62,15 @@ public boolean isFromPoint() {
public boolean isFromTextSearch() {
switch (this) {
case FROM_TEXT_SEARCH:
case FROM_END_WITH_TEXT_SEARCH:
case FROM_POINT_WITH_TEXT_SEARCH:
return true;
default:
return false;
}
}

public boolean isFromEnd() {
return this == CompilerRange.FROM_END_WITH_TEXT_SEARCH;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,15 +22,16 @@ public static Optional<Semanticdb.Range> findRange(
CompilationUnitTree root,
Element element,
int startPos,
String source) {
String source,
boolean fromEnd) {
LineMap lineMap = root.getLineMap();
Name name = element.getSimpleName();
if (name.contentEquals("<init>")) name = element.getEnclosingElement().getSimpleName();

int endPos = (int) trees.getSourcePositions().getEndPosition(root, path.getLeaf());
// false for anonymous classes
if (name.length() != 0) {
startPos = findNameIn(name, startPos, source);
startPos = findNameIn(name, fromEnd ? endPos : startPos, source, fromEnd);
endPos = startPos + name.length();
}

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

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

int offset = source.indexOf(name.toString(), start);
int offset;
if (fromEnd) offset = source.lastIndexOf(name.toString(), start);
else offset = source.indexOf(name.toString(), start);
if (offset > -1) {
return offset;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ public Void visitIdentifier(IdentifierTree node, Void unused) {
public Void visitMemberReference(MemberReferenceTree node, Void unused) {
if (node instanceof JCTree.JCMemberReference) {
JCTree.JCMemberReference ref = (JCTree.JCMemberReference) node;
emitSymbolOccurrence(ref.sym, ref, Role.REFERENCE, CompilerRange.FROM_START_TO_END);
emitSymbolOccurrence(ref.sym, ref, Role.REFERENCE, CompilerRange.FROM_END_WITH_TEXT_SEARCH);
}
return super.visitMemberReference(node, unused);
}
Expand Down Expand Up @@ -284,7 +284,8 @@ private Optional<Semanticdb.Range> semanticdbRange(
getCurrentPath().getCompilationUnit(),
sym,
start,
this.source);
this.source,
kind.isFromEnd());
if (range.isPresent()) return Optional.of(correctForTabs(range.get(), lineMap, start));
else return range;
} else if (start != Position.NOPOS && end != Position.NOPOS && end > start) {
Expand Down
2 changes: 1 addition & 1 deletion tests/snapshots/src/main/generated/minimized/Enums.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ public static String app() {
// ^^^^^ reference minimized/Enums#value.
// ^^^ reference java/util/stream/Stream#map().
// ^^^^^ reference minimized/Enums#
// ^^^^^^^^^^^^^^ reference minimized/Enums#valueOf().
// ^^^^^^^ reference minimized/Enums#valueOf().
// ^^^^^^^^ reference java/lang/Object#toString().
return all + A.value + B.value + C.value;
// ^^^ reference local2
Expand Down