diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java
index 8f9282affd6f..017ec0dea27d 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java
@@ -28,6 +28,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.java.PsiAnnotationImpl;
+import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
import com.intellij.util.IncorrectOperationException;
@@ -247,6 +248,38 @@ public class AnnotationsHighlightUtil {
return highlightInfo;
}
+ public static HighlightInfo checkForeignInnerClassesUsed(final PsiAnnotation annotation) {
+ final HighlightInfo[] infos = new HighlightInfo[1];
+ final PsiAnnotationOwner owner = annotation.getOwner();
+ if (owner instanceof PsiModifierList) {
+ final PsiElement parent = ((PsiModifierList)owner).getParent();
+ if (parent instanceof PsiClass) {
+ annotation.accept(new JavaRecursiveElementWalkingVisitor() {
+ @Override
+ public void visitElement(PsiElement element) {
+ if (infos[0] != null) return;
+ super.visitElement(element);
+ }
+
+ @Override
+ public void visitReferenceExpression(PsiReferenceExpression expression) {
+ super.visitReferenceExpression(expression);
+ final PsiElement resolve = expression.resolve();
+ if (resolve instanceof PsiField &&
+ ((PsiMember)resolve).hasModifierProperty(PsiModifier.PRIVATE) &&
+ PsiTreeUtil.isAncestor(parent, resolve, true)) {
+ String description = JavaErrorMessages.message("private.symbol",
+ HighlightUtil.formatField((PsiField)resolve),
+ HighlightUtil.formatClass((PsiClass)parent));
+ infos[0] = HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, expression, description);
+ }
+ }
+ });
+ }
+ }
+ return infos[0];
+ }
+
private static PsiField[] getFields(final PsiClass elementTypeClass, @NonNls final String... names) {
PsiField[] result = new PsiField[names.length];
for (int i = 0; i < names.length; i++) {
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
index 8703ff06fd77..1c6f41d71759 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
@@ -184,6 +184,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkMissingAttributes(annotation));
if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkTargetAnnotationDuplicates(annotation));
if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkDuplicateAnnotations(annotation));
+ if (!myHolder.hasErrorResults()) myHolder.add(AnnotationsHighlightUtil.checkForeignInnerClassesUsed(annotation));
}
@Override public void visitAnnotationArrayInitializer(PsiArrayInitializerMemberValue initializer) {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/HighlightInaccessibleFromClassModifierList.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/HighlightInaccessibleFromClassModifierList.java
new file mode 100644
index 000000000000..e02db8fb902f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/HighlightInaccessibleFromClassModifierList.java
@@ -0,0 +1,4 @@
+@SuppressWarnings(ThisClass.FOO)
+public class ThisClass {
+ private static final String FOO = "foo";
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
index 7e2951ec1186..55a041c9e77c 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
@@ -176,6 +176,10 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
doTest(false, false);
}
+ public void testHighlightInaccessibleFromClassModifierList() throws Exception {
+ doTest(false, false);
+ }
+
public void testDynamicallyAddIgnoredAnnotations() throws Exception {
ExtensionPoint point = Extensions.getRootArea().getExtensionPoint(ExtensionPoints.DEAD_CODE_TOOL);
EntryPoint extension = new EntryPoint() {