Skip to content

Commit 47d5840

Browse files
mickaelistriadatho7561
authored andcommitted
Match SingleMemberAnnotation value()
1 parent 09ebc21 commit 47d5840

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/DOMJavaSearchDelegate.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import org.eclipse.jdt.core.dom.ParameterizedType;
6161
import org.eclipse.jdt.core.dom.QualifiedName;
6262
import org.eclipse.jdt.core.dom.SimpleType;
63+
import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
6364
import org.eclipse.jdt.core.dom.SuperConstructorInvocation;
6465
import org.eclipse.jdt.core.dom.SuperMethodInvocation;
6566
import org.eclipse.jdt.core.dom.Type;
@@ -83,6 +84,7 @@
8384
import org.eclipse.jdt.internal.core.search.matching.DOMPatternLocator;
8485
import org.eclipse.jdt.internal.core.search.matching.MatchLocator;
8586
import org.eclipse.jdt.internal.core.search.matching.MatchingNodeSet;
87+
import org.eclipse.jdt.internal.core.search.matching.MethodPattern;
8688
import org.eclipse.jdt.internal.core.search.matching.NodeSetWrapper;
8789
import org.eclipse.jdt.internal.core.search.matching.PossibleMatch;
8890

@@ -232,6 +234,9 @@ private org.eclipse.jdt.core.ICompilationUnit findUnitForPossibleMatch(MatchLoca
232234
}
233235

234236
private SearchMatch toMatch(MatchLocator locator, org.eclipse.jdt.core.dom.ASTNode node, int accuracy, PossibleMatch possibleMatch) {
237+
if (node == null) {
238+
return null;
239+
}
235240
SearchMatch sm = toCoreMatch(locator, node, accuracy, possibleMatch);
236241
if( accuracy == SearchPattern.R_ERASURE_MATCH) {
237242
sm.setRule(SearchPattern.R_ERASURE_MATCH);
@@ -297,6 +302,12 @@ private SearchMatch toCoreMatch(MatchLocator locator, org.eclipse.jdt.core.dom.A
297302
constructorRef.resolveMethodBinding().isSynthetic(), true, insideDocComment(node), getParticipant(locator),
298303
resource);
299304
}
305+
if (node.getLocationInParent() == SingleMemberAnnotation.VALUE_PROPERTY && locator.pattern instanceof MethodPattern) {
306+
return new MethodReferenceMatch(DOMASTNodeUtils.getEnclosingJavaElement(node), accuracy,
307+
node.getStartPosition(), node.getLength(), true,
308+
false, true, insideDocComment(node), getParticipant(locator),
309+
resource);
310+
}
300311
if (node instanceof EnumConstantDeclaration enumConstantDeclaration) {
301312
int start = enumConstantDeclaration.getStartPosition();
302313
int len = enumConstantDeclaration.getLength();
@@ -359,7 +370,7 @@ private SearchMatch toCoreMatch(MatchLocator locator, org.eclipse.jdt.core.dom.A
359370
// more...?
360371
}
361372
if (node.getLocationInParent() == SimpleType.NAME_PROPERTY
362-
|| node.getLocationInParent() == QualifiedName.NAME_PROPERTY) {
373+
|| node.getLocationInParent() == QualifiedName.NAME_PROPERTY) {
363374
// more...?
364375
return toMatch(locator, node.getParent(), accuracy, possibleMatch);
365376
}

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/PatternLocatorVisitor.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration;
2222
import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration;
2323
import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
24+
import org.eclipse.jdt.core.dom.ArrayInitializer;
25+
import org.eclipse.jdt.core.dom.BooleanLiteral;
26+
import org.eclipse.jdt.core.dom.CharacterLiteral;
2427
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
2528
import org.eclipse.jdt.core.dom.ConstructorInvocation;
2629
import org.eclipse.jdt.core.dom.CreationReference;
@@ -35,6 +38,8 @@
3538
import org.eclipse.jdt.core.dom.MethodInvocation;
3639
import org.eclipse.jdt.core.dom.Name;
3740
import org.eclipse.jdt.core.dom.NameQualifiedType;
41+
import org.eclipse.jdt.core.dom.NullLiteral;
42+
import org.eclipse.jdt.core.dom.NumberLiteral;
3843
import org.eclipse.jdt.core.dom.PackageDeclaration;
3944
import org.eclipse.jdt.core.dom.ParameterizedType;
4045
import org.eclipse.jdt.core.dom.QualifiedName;
@@ -49,6 +54,7 @@
4954
import org.eclipse.jdt.core.dom.SuperMethodReference;
5055
import org.eclipse.jdt.core.dom.Type;
5156
import org.eclipse.jdt.core.dom.TypeDeclaration;
57+
import org.eclipse.jdt.core.dom.TypeLiteral;
5258
import org.eclipse.jdt.core.dom.TypeParameter;
5359
import org.eclipse.jdt.core.dom.UnionType;
5460
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
@@ -316,4 +322,35 @@ public boolean visit(MemberValuePair node) {
316322
return true;
317323
}
318324

325+
// following ones are for values in SingleMemberAnnotation
326+
@Override
327+
public boolean visit(NumberLiteral node) {
328+
defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
329+
return true;
330+
}
331+
@Override
332+
public boolean visit(CharacterLiteral node) {
333+
defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
334+
return true;
335+
}
336+
@Override
337+
public boolean visit(BooleanLiteral node) {
338+
defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
339+
return true;
340+
}
341+
@Override
342+
public boolean visit(ArrayInitializer node) {
343+
defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
344+
return true;
345+
}
346+
@Override
347+
public boolean visit(TypeLiteral node) {
348+
defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
349+
return true;
350+
}
351+
@Override
352+
public boolean visit(NullLiteral node) {
353+
defaultVisitImplementation(node, (x,y) -> y.match(node, this.nodeSet, this.locator));
354+
return true;
355+
}
319356
}

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/core/search/matching/DOMMethodLocator.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ public LocatorResponse match(Annotation node, NodeSetWrapper nodeSet, MatchLocat
130130
POSSIBLE_MATCH : IMPOSSIBLE_MATCH);
131131
}
132132

133-
134133
private int matchReference(SimpleName name, List<?> args) {
135134
if (!this.locator.pattern.findReferences) return IMPOSSIBLE_MATCH;
136135

@@ -151,14 +150,21 @@ public LocatorResponse match(MethodInvocation node, NodeSetWrapper nodeSet, Matc
151150
}
152151
@Override
153152
public LocatorResponse match(org.eclipse.jdt.core.dom.Expression expression, NodeSetWrapper nodeSet, MatchLocator locator) {
154-
int level = expression instanceof SuperMethodInvocation node ? this.matchReference(node.getName(), node.arguments()) :
155-
IMPOSSIBLE_MATCH;
153+
int level = IMPOSSIBLE_MATCH;
154+
if (expression instanceof SuperMethodInvocation node) {
155+
level = this.matchReference(node.getName(), node.arguments());
156+
}
157+
if (expression.getLocationInParent() == SingleMemberAnnotation.VALUE_PROPERTY
158+
&& this.locator.pattern.matchesName(this.locator.pattern.selector, "value".toCharArray())
159+
&& this.locator.pattern.parameterCount == 0) {
160+
// TODO: also check annotation name matches pattern (if available)
161+
level = POSSIBLE_MATCH;
162+
}
156163
if( level == IMPOSSIBLE_MATCH)
157164
return toResponse(IMPOSSIBLE_MATCH);
158165
return toResponse(nodeSet.addMatch(expression, level), true);
159166
}
160167

161-
162168
@Override
163169
public LocatorResponse match(Name node, NodeSetWrapper nodeSet, MatchLocator locator) {
164170
if( node.getParent() instanceof MethodInvocation mi && mi.getName() == node) {
@@ -447,7 +453,8 @@ public LocatorResponse resolveLevel(org.eclipse.jdt.core.dom.ASTNode node, IBind
447453
boolean isErasurePattern = isPatternErasureMatch();
448454
boolean isEquivPattern = isPatternEquivalentMatch();
449455

450-
if (node instanceof SingleMemberAnnotation singleMemberAnnotation) {
456+
if (node.getLocationInParent() == SingleMemberAnnotation.VALUE_PROPERTY
457+
&& node.getParent() instanceof SingleMemberAnnotation singleMemberAnnotation) {
451458
var valuePairs = singleMemberAnnotation.resolveAnnotationBinding().getDeclaredMemberValuePairs();
452459
if (valuePairs != null && valuePairs.length > 0) {
453460
binding = valuePairs[0].getMethodBinding();

0 commit comments

Comments
 (0)