@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);