diff options
-rw-r--r-- | org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.java | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.java b/org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.java index d04d127a4..750e3cbc7 100644 --- a/org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.java +++ b/org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.java @@ -200,35 +200,35 @@ public class SignaturePattern extends PatternNode implements ISignaturePattern { @Override public Object visit(ExactAnnotationTypePattern node, Object data) { ResolvedType resolvedType = node.getAnnotationType().resolve(scope.getWorld()); + AnnotationTargetKind[] targetKinds = resolvedType.getAnnotationTargetKinds(); + if (targetKinds == null) + return data; + boolean isMetaAnnotation = data instanceof AnnotationTypePattern || data instanceof AnyWithAnnotationTypePattern; if (targetsOtherThanTypeAllowed) { - AnnotationTargetKind[] targetKinds = resolvedType.getAnnotationTargetKinds(); - if (targetKinds == null) { - return data; - } List<AnnotationTargetKind> incorrectTargets = new ArrayList<>(); for (AnnotationTargetKind targetKind : targetKinds) { - if (targetKind.getName().equals(kind.getName()) - || (targetKind.getName().equals("PARAMETER") && node.isForParameterAnnotationMatch())) { + if ( + isMetaAnnotation && targetKind.equals(AnnotationTargetKind.ANNOTATION_TYPE) || + targetKind.getName().equals(kind.getName()) || + targetKind.equals(AnnotationTargetKind.PARAMETER) && node.isForParameterAnnotationMatch() + ) { return data; } incorrectTargets.add(targetKind); } - if (incorrectTargets.isEmpty()) { + if (incorrectTargets.isEmpty()) return data; - } AnnotationTargetKind[] kinds = new AnnotationTargetKind[incorrectTargets.size()]; incorrectTargetKinds.put(node, incorrectTargets.toArray(kinds)); - } else if (!targetsOtherThanTypeAllowed && !resolvedType.canAnnotationTargetType()) { - AnnotationTargetKind[] targetKinds = resolvedType.getAnnotationTargetKinds(); - if (targetKinds == null) { - return data; - } - // exception here is if parameter annotations are allowed - if (parameterTargettingAnnotationsAllowed) { - for (AnnotationTargetKind annotationTargetKind : targetKinds) { - if (annotationTargetKind.getName().equals("PARAMETER") && node.isForParameterAnnotationMatch()) { - return data; - } + } + else if (!resolvedType.canAnnotationTargetType()) { + for (AnnotationTargetKind targetKind : targetKinds) { + if ( + isMetaAnnotation && targetKind.equals(AnnotationTargetKind.ANNOTATION_TYPE) || + parameterTargettingAnnotationsAllowed && + targetKind.equals(AnnotationTargetKind.PARAMETER) && node.isForParameterAnnotationMatch() + ) { + return data; } } incorrectTargetKinds.put(node, targetKinds); |