22
33import javax .tools .Diagnostic ;
44
5- import javax .lang .model .element .Element ;
65import java .util .Optional ;
76
87public class RangeFinder {
@@ -16,81 +15,30 @@ public static class StartEndRange {
1615 }
1716 }
1817
18+ /**
19+ * Searches {@code source} for {@code name} starting at {@code start}. If the name cannot be found
20+ * and {@code fallback} is not {@link Diagnostic#NOPOS}, returns a range anchored at {@code
21+ * fallback}; otherwise returns {@link Optional#empty()}.
22+ */
1923 public static Optional <StartEndRange > findRange (
20- Element element ,
21- String name ,
22- int originalStartPos ,
23- int originalEndPos ,
24- String source ,
25- boolean fromEnd ) {
26- int startPos = findNameIn (name , originalStartPos , originalEndPos , element , source , fromEnd );
27- int endPos = startPos + name .length ();
28-
29- if (endPos == -1 || startPos == -1 ) {
30- return Optional .empty ();
31- }
32-
33- return Optional .of (new StartEndRange (startPos , endPos ));
34- }
35-
36- private static int findNameFromEnd (
37- String name ,
38- int originalStartPos ,
39- int originalEndPos ,
40- int end ,
41- Element element ,
42- String source ) {
43- if (end < 0 ) return -1 ;
44- int offset = source .lastIndexOf (name , end );
45- if (offset == -1 && originalStartPos != Diagnostic .NOPOS && originalEndPos != Diagnostic .NOPOS )
46- return originalStartPos ;
47- if (offset == -1 ) {
48- return -1 ;
49- }
50- int endOfWord = offset + name .length ();
51- // found name in wrong word? e.g. finding `"A"` in `A("A")`
52- if (offset > 0 && Character .isJavaIdentifierPart (source .charAt (offset - 1 )))
53- return findNameFromEnd (name , originalStartPos , originalEndPos , offset - 1 , element , source );
54- if (endOfWord < source .length () && Character .isJavaIdentifierPart (source .charAt (endOfWord )))
55- return findNameFromEnd (name , originalStartPos , originalEndPos , offset - 1 , element , source );
56-
57- return offset ;
24+ String name , int start , int fallback , String source ) {
25+ if (source .length () == 0 ) return Optional .empty ();
26+ int startPos = findNameFromStart (name , start , fallback , source );
27+ if (startPos == -1 ) return Optional .empty ();
28+ return Optional .of (new StartEndRange (startPos , startPos + name .length ()));
5829 }
5930
60- private static int findNameFromStart (
61- String name ,
62- int start ,
63- int originalStartPos ,
64- int originalEndPos ,
65- Element element ,
66- String source ) {
31+ private static int findNameFromStart (String name , int start , int fallback , String source ) {
6732 if (start >= source .length ()) return -1 ;
6833 int offset = source .indexOf (name , start );
69- if (offset == -1 && originalStartPos != Diagnostic .NOPOS && originalEndPos != Diagnostic .NOPOS )
70- return originalStartPos ;
71- if (offset == -1 ) {
72- return -1 ;
73- }
34+ if (offset == -1 && fallback != Diagnostic .NOPOS ) return fallback ;
35+ if (offset == -1 ) return -1 ;
7436 int end = offset + name .length ();
7537 // found name in wrong word? e.g. finding `"A"` in `A("A")`
7638 if (offset > 0 && Character .isJavaIdentifierPart (source .charAt (offset - 1 )))
77- return findNameFromStart (name , end + 1 , originalStartPos , originalEndPos , element , source );
39+ return findNameFromStart (name , end + 1 , fallback , source );
7840 if (end < source .length () && Character .isJavaIdentifierPart (source .charAt (end )))
79- return findNameFromStart (name , end + 1 , originalStartPos , originalEndPos , element , source );
80-
41+ return findNameFromStart (name , end + 1 , fallback , source );
8142 return offset ;
8243 }
83-
84- private static int findNameIn (
85- String name , int start , int end , Element element , String source , boolean fromEnd ) {
86- if (source .length () == 0 ) return -1 ;
87-
88- int offset ;
89- if (fromEnd ) offset = findNameFromEnd (name , start , start , end , element , source );
90- else offset = findNameFromStart (name , start , end , end , element , source );
91- if (offset > -1 ) {
92- return offset ;
93- }
94- return -1 ;
95- }
9644}
0 commit comments