Skip to content

Commit

Permalink
SignaturePattern: Add exception for meta annotations
Browse files Browse the repository at this point in the history
Upon meta annotation usage in signature patterns, lint warnings like the
following were issued during type parameter traversal:

  does not match because annotation @java.lang.annotation.Inherited
  has @target{ElementType.ANNOTATION_TYPE} [Xlint:unmatchedTargetKind]

To avoid this, we now heuristically check if we are in a meta annotation
situation and, if so, permit it.

Signed-off-by: Alexander Kriegisch <[email protected]>
  • Loading branch information
kriegaex committed Apr 12, 2024
1 parent b5ff094 commit c2acbdf
Showing 1 changed file with 19 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -200,35 +200,35 @@ public Object visit(WildAnnotationTypePattern node, Object data) {
@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);
Expand Down

0 comments on commit c2acbdf

Please sign in to comment.