From 288342ddfc20d142215258cb8a983e99d111d26e Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 26 Jun 2025 17:52:30 +0200 Subject: [PATCH] Java: fix incorrect "Static member qualifying type may not be annotated" (IDEA-210876) GitOrigin-RevId: 48d08a4d0d3db72fa458d7d67f6ccd72a435b4c8 --- .../highlighting/AnnotationChecker.java | 23 ++++++------------- .../annotations/falseTypeUse.java | 18 ++++++++++++++- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/AnnotationChecker.java b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/AnnotationChecker.java index fc6851ac8409..a3b026d1c397 100644 --- a/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/AnnotationChecker.java +++ b/java/codeserver/highlighting/src/com/intellij/java/codeserver/highlighting/AnnotationChecker.java @@ -461,24 +461,16 @@ final class AnnotationChecker { if (myVisitor.hasErrorResults()) return; } + if (!(annotation.getOwner() instanceof PsiArrayType) && annotation.getParent() instanceof PsiTypeElement typeElement) { + PsiElement element = PsiTreeUtil.skipParentsOfType(typeElement, PsiTypeElement.class); + if (element instanceof PsiModifierListOwner modifierListOwner) { + targets = AnnotationTargetUtil.getTargetsForLocation(modifierListOwner.getModifierList()); + } + } PsiAnnotation.TargetType applicable = AnnotationTargetUtil.findAnnotationTarget(annotation, targets); if (applicable == PsiAnnotation.TargetType.UNKNOWN) return; if (applicable == null) { - if (targets.length == 1 && targets[0] == PsiAnnotation.TargetType.TYPE_USE) { - PsiElement parent = annotation.getParent(); - if (parent instanceof PsiTypeElement && !(annotation.getOwner() instanceof PsiArrayType)) { - PsiElement modifierList = - PsiTreeUtil.skipSiblingsBackward(parent, PsiWhiteSpace.class, PsiComment.class, PsiTypeParameterList.class); - if (modifierList instanceof PsiModifierList psiModifierList) { - targets = AnnotationTargetUtil.getTargetsForLocation(psiModifierList); - if (AnnotationTargetUtil.findAnnotationTarget(annotation, targets) == null) { - myVisitor.report(JavaErrorKinds.ANNOTATION_NOT_APPLICABLE.create(annotation, Arrays.asList(targets))); - } - return; - } - } - } myVisitor.report(JavaErrorKinds.ANNOTATION_NOT_APPLICABLE.create(annotation, Arrays.asList(targets))); return; } @@ -489,8 +481,7 @@ final class AnnotationChecker { return; } if (owner instanceof PsiClassReferenceType referenceType) { - PsiJavaCodeReferenceElement ref = referenceType.getReference(); - checkReferenceTarget(annotation, ref); + checkReferenceTarget(annotation, referenceType.getReference()); } else if (owner instanceof PsiModifierList || owner instanceof PsiTypeElement) { PsiElement nextElement = owner instanceof PsiTypeElement typeElementOwner diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/falseTypeUse.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/falseTypeUse.java index 273b2af1dbc8..49c13a4d84fc 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/falseTypeUse.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/annotations/falseTypeUse.java @@ -1,3 +1,4 @@ +import java.lang.annotation.*; @interface Ann { } @@ -5,4 +6,19 @@ class Foo { @Ann String getFoo() { return null; } -} \ No newline at end of file +} +class Example { + + public static class Foo { + public interface Bar {} + } + + public static @One Foo.Bar test1(T t) { return null; } + public static @Two Foo.Bar test2(T t) { return null; } + +} +@Target(ElementType.METHOD) +@interface One {} + +@Target(ElementType.TYPE_USE) +@interface Two {} \ No newline at end of file