check annotation params accessibility (IDEA-108584)

This commit is contained in:
Anna Kozlova
2013-06-10 18:21:06 +04:00
parent 9fe9f66af3
commit 6c6a56bc8b
3 changed files with 28 additions and 5 deletions
@@ -412,19 +412,33 @@ public class AnnotationsHighlightUtil {
super.visitElement(element);
}
@Override
public void visitClassObjectAccessExpression(PsiClassObjectAccessExpression expression) {
super.visitClassObjectAccessExpression(expression);
final PsiTypeElement operand = expression.getOperand();
final PsiClass classType = PsiUtil.resolveClassInType(operand.getType());
if (classType != null) {
checkAccessibility(expression, classType, HighlightUtil.formatClass(classType));
}
}
@Override
public void visitReferenceExpression(PsiReferenceExpression expression) {
super.visitReferenceExpression(expression);
final PsiElement resolve = expression.resolve();
if (resolve instanceof PsiField &&
((PsiMember)resolve).hasModifierProperty(PsiModifier.PRIVATE) &&
if (resolve instanceof PsiField) {
checkAccessibility(expression, (PsiMember)resolve, HighlightUtil.formatField((PsiField)resolve));
}
}
private void checkAccessibility(PsiExpression expression, PsiMember resolve, String memberString) {
if (resolve.hasModifierProperty(PsiModifier.PRIVATE) &&
PsiTreeUtil.isAncestor(parent, resolve, true)) {
String description = JavaErrorMessages.message("private.symbol",
HighlightUtil.formatField((PsiField)resolve),
memberString,
HighlightUtil.formatClass((PsiClass)parent));
HighlightInfo result =
infos[0] =
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(description).create();
infos[0] = result;
}
}
});
@@ -0,0 +1,8 @@
@SomeAnnotation(<error descr="'Foo.Bar' has private access in 'Foo'">Foo.Bar.class</error>)
public class Foo{
private static class Bar {
}
}
@interface SomeAnnotation {
Class value();
}
@@ -56,4 +56,5 @@ public class LightAdvHighlightingJdk6Test extends LightDaemonAnalyzerTestCase {
public void testMethodReturnTypeSubstitutability() { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
public void testIDEADEV11877() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(false, false); }
public void testIDEA108285() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(false, false); }
public void testClassObjectAccessibility() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(false, false); }
}