2020import org .eclipse .jdt .core .compiler .CharOperation ;
2121import org .eclipse .jdt .core .dom .AST ;
2222import org .eclipse .jdt .core .dom .ASTNode ;
23+ import org .eclipse .jdt .core .dom .Annotation ;
24+ import org .eclipse .jdt .core .dom .AnnotationTypeMemberDeclaration ;
2325import org .eclipse .jdt .core .dom .Expression ;
2426import org .eclipse .jdt .core .dom .IBinding ;
25- import org .eclipse .jdt .core .dom .IMemberValuePairBinding ;
2627import org .eclipse .jdt .core .dom .IMethodBinding ;
2728import org .eclipse .jdt .core .dom .ITypeBinding ;
2829import org .eclipse .jdt .core .dom .IVariableBinding ;
3334import org .eclipse .jdt .core .dom .Modifier ;
3435import org .eclipse .jdt .core .dom .Name ;
3536import org .eclipse .jdt .core .dom .SimpleName ;
37+ import org .eclipse .jdt .core .dom .SingleMemberAnnotation ;
3638import org .eclipse .jdt .core .dom .SingleVariableDeclaration ;
3739import org .eclipse .jdt .core .dom .SuperMethodInvocation ;
3840import org .eclipse .jdt .core .search .SearchPattern ;
@@ -118,7 +120,21 @@ public LocatorResponse match(org.eclipse.jdt.core.dom.MethodDeclaration node, No
118120 int level = nodeSet .addMatch (node , resolve ? POSSIBLE_MATCH : ACCURATE_MATCH );
119121 return toResponse (level , true );
120122 }
121- private int matchReference (SimpleName name , List <?> args , NodeSetWrapper nodeSet ) {
123+
124+ @ Override
125+ public LocatorResponse match (AnnotationTypeMemberDeclaration node , NodeSetWrapper nodeSet , MatchLocator locator ) {
126+ return toResponse (this .locator .pattern .findDeclarations && this .locator .matchesName (this .locator .pattern .selector , node .getName ().getIdentifier ().toCharArray ()) ?
127+ POSSIBLE_MATCH : IMPOSSIBLE_MATCH );
128+ }
129+
130+ @ Override
131+ public LocatorResponse match (Annotation node , NodeSetWrapper nodeSet , MatchLocator locator ) {
132+ return toResponse (this .locator .pattern .findReferences && node instanceof SingleMemberAnnotation singleMemberAnnot ?
133+ POSSIBLE_MATCH : IMPOSSIBLE_MATCH );
134+ }
135+
136+
137+ private int matchReference (SimpleName name , List <?> args ) {
122138 if (!this .locator .pattern .findReferences ) return IMPOSSIBLE_MATCH ;
123139
124140 if (!this .locator .matchesName (this .locator .pattern .selector , name .getIdentifier ().toCharArray ())) return IMPOSSIBLE_MATCH ;
@@ -131,14 +147,14 @@ private int matchReference(SimpleName name, List<?> args, NodeSetWrapper nodeSet
131147 }
132148 @ Override
133149 public LocatorResponse match (MethodInvocation node , NodeSetWrapper nodeSet , MatchLocator locator ) {
134- int level = this .matchReference (node .getName (), node .arguments (), nodeSet );
150+ int level = this .matchReference (node .getName (), node .arguments ());
135151 if ( level == IMPOSSIBLE_MATCH )
136152 return toResponse (IMPOSSIBLE_MATCH );
137153 return toResponse (nodeSet .addMatch (node , level ), true );
138154 }
139155 @ Override
140156 public LocatorResponse match (org .eclipse .jdt .core .dom .Expression expression , NodeSetWrapper nodeSet , MatchLocator locator ) {
141- int level = expression instanceof SuperMethodInvocation node ? this .matchReference (node .getName (), node .arguments (), nodeSet ) :
157+ int level = expression instanceof SuperMethodInvocation node ? this .matchReference (node .getName (), node .arguments ()) :
142158 IMPOSSIBLE_MATCH ;
143159 if ( level == IMPOSSIBLE_MATCH )
144160 return toResponse (IMPOSSIBLE_MATCH );
@@ -156,9 +172,8 @@ public LocatorResponse match(Name node, NodeSetWrapper nodeSet, MatchLocator loc
156172
157173 if (node .getLocationInParent () == MemberValuePair .NAME_PROPERTY
158174 && this .locator .pattern .parameterCount == 0
159- && node instanceof SimpleName simpleName
160- && matchesName (simpleName .getIdentifier ().toCharArray (), this .locator .pattern .selector )) {
161- return toResponse (POSSIBLE_MATCH );
175+ && node instanceof SimpleName simpleName ) {
176+ return toResponse (matchReference (simpleName , null ));
162177 }
163178
164179 String name = node .toString ();
@@ -478,6 +493,12 @@ public LocatorResponse resolveLevel(org.eclipse.jdt.core.dom.ASTNode node, IBind
478493 boolean isErasurePattern = isPatternErasureMatch ();
479494 boolean isEquivPattern = isPatternEquivalentMatch ();
480495
496+ if (node instanceof SingleMemberAnnotation singleMemberAnnotation ) {
497+ var valuePairs = singleMemberAnnotation .resolveAnnotationBinding ().getDeclaredMemberValuePairs ();
498+ if (valuePairs != null && valuePairs .length > 0 ) {
499+ binding = valuePairs [0 ].getMethodBinding ();
500+ }
501+ }
481502 if (binding instanceof IMethodBinding method ) {
482503 boolean skipVerif = this .locator .pattern .findDeclarations && this .locator .mayBeGeneric ;
483504 if (Objects .equals (binding .getJavaElement (), this .locator .pattern .focus )) {
0 commit comments