diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/testOnly/TestOnlyInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/testOnly/TestOnlyInspection.java index b5e9e368f52c..33bbf9ad63f8 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/testOnly/TestOnlyInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/testOnly/TestOnlyInspection.java @@ -67,7 +67,12 @@ public class TestOnlyInspection extends BaseJavaBatchLocalInspectionTool { PsiAnnotation anno = findVisibleForTestingAnnotation(method); if (anno != null) { - LightModifierList modList = new LightModifierList(method.getManager(), JavaLanguage.INSTANCE, getAccessModifierWithoutTesting(anno)); + String modifier = getAccessModifierWithoutTesting(anno); + if (modifier == null){ + return; + } + + LightModifierList modList = new LightModifierList(method.getManager(), JavaLanguage.INSTANCE, modifier); if (JavaResolveUtil.isAccessible(method, method.getContainingClass(), modList, e, null, null)) { return; } @@ -76,17 +81,17 @@ public class TestOnlyInspection extends BaseJavaBatchLocalInspectionTool { reportProblem(e, h); } + @Nullable private static String getAccessModifierWithoutTesting(PsiAnnotation anno) { - String modifier = PsiModifier.PRIVATE; - PsiAnnotationMemberValue ref = anno.findDeclaredAttributeValue("visibility"); + PsiAnnotationMemberValue ref = anno.findAttributeValue("visibility"); if (ref instanceof PsiReferenceExpression) { PsiElement target = ((PsiReferenceExpression)ref).resolve(); if (target instanceof PsiEnumConstant) { String name = ((PsiEnumConstant)target).getName(); - modifier = "PRIVATE".equals(name) ? PsiModifier.PRIVATE : "PROTECTED".equals(name) ? PsiModifier.PROTECTED : PsiModifier.PACKAGE_LOCAL; + return "PRIVATE".equals(name) ? PsiModifier.PRIVATE : "PROTECTED".equals(name) ? PsiModifier.PROTECTED : PsiModifier.PACKAGE_LOCAL; } } - return modifier; + return null; } @Nullable diff --git a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/A.java b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/A.java index c88fa9e437ba..38f32338ad25 100644 --- a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/A.java +++ b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/A.java @@ -4,13 +4,18 @@ public class A { visibleMethod(1); } - @com.google.common.annotations.VisibleForTesting() + @com.android.annotations.VisibleForTesting void invisibleMethod(int a) { } - @com.google.common.annotations.VisibleForTesting(visibility=com.google.common.annotations.VisibleForTesting.Visibility.PROTECTED) + @com.android.annotations.VisibleForTesting(visibility=com.android.annotations.VisibleForTesting.Visibility.PROTECTED) void visibleMethod(int a) { } + + @com.google.common.annotations.VisibleForTesting + void unknownRealVisibilityMethod(int a) { + + } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/B.java b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/B.java index ec069c893a6c..3d113e15d3cc 100644 --- a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/B.java +++ b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/B.java @@ -2,5 +2,6 @@ public class B { void publicMethod() { new A().invisibleMethod(2); new A().visibleMethod(2); + new A().unknownRealVisibilityMethod(2); } } \ No newline at end of file diff --git a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/com/android/annotations/VisibleForTesting.java b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/com/android/annotations/VisibleForTesting.java new file mode 100644 index 000000000000..abad39a0e1b9 --- /dev/null +++ b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/com/android/annotations/VisibleForTesting.java @@ -0,0 +1,14 @@ +package com.android.annotations; + +public @interface VisibleForTesting { + enum Visibility { + /** The element should be considered protected. */ + PROTECTED, + /** The element should be considered package-private. */ + PACKAGE, + /** The element should be considered private. */ + PRIVATE + } + + Visibility visibility() default Visibility.PRIVATE; +} diff --git a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/com/google/common/annotations/VisibleForTesting.java b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/com/google/common/annotations/VisibleForTesting.java index 50a1589b25f7..06ab6bc2ca6a 100644 --- a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/com/google/common/annotations/VisibleForTesting.java +++ b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/com/google/common/annotations/VisibleForTesting.java @@ -1,14 +1,5 @@ package com.google.common.annotations; public @interface VisibleForTesting { - enum Visibility { - /** The element should be considered protected. */ - PROTECTED, - /** The element should be considered package-private. */ - PACKAGE, - /** The element should be considered private. */ - PRIVATE - } - - Visibility visibility() default Visibility.PRIVATE; + }