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 d6c4c80abfd4..a4a7cc4b8c4e 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 @@ -100,6 +100,7 @@ public class TestOnlyInspection extends BaseJavaBatchLocalInspectionTool { if (JavaResolveUtil.isAccessible(member, member.getContainingClass(), modList, reference, null, null)) { return; } + int a = 1; } reportProblem(reference, member, h); @@ -121,7 +122,13 @@ public class TestOnlyInspection extends BaseJavaBatchLocalInspectionTool { @Nullable private static PsiAnnotation findVisibleForTestingAnnotation(@NotNull PsiMember member) { PsiAnnotation anno = AnnotationUtil.findAnnotation(member, "com.google.common.annotations.VisibleForTesting"); - return anno != null ? anno : AnnotationUtil.findAnnotation(member, "com.android.annotations.VisibleForTesting"); + if (anno == null) { + anno = AnnotationUtil.findAnnotation(member, "com.android.annotations.VisibleForTesting"); + } + if (anno != null) return anno; + + PsiClass containingClass = member.getContainingClass(); + return containingClass != null ? findVisibleForTestingAnnotation(containingClass) : null; } private static boolean isInsideTestOnlyMethod(PsiElement e) { diff --git a/java/java-tests/testData/inspection/testOnly/visibleForTesting/expected.xml b/java/java-tests/testData/inspection/testOnly/visibleForTesting/expected.xml index bf49e4aca6a2..bb5e50626080 100644 --- a/java/java-tests/testData/inspection/testOnly/visibleForTesting/expected.xml +++ b/java/java-tests/testData/inspection/testOnly/visibleForTesting/expected.xml @@ -10,4 +10,15 @@ 5 Test-only method is called in production code + + B.java + 6 + Test-only class is referenced in production code + + + B.java + 7 + Test-only method is called in production code + + 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 f65ba879eaf1..4f56a174a80d 100644 --- a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/A.java +++ b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/A.java @@ -18,4 +18,16 @@ public class A { void relaxedToPackageLevel(int a) { } + + @com.google.common.annotations.VisibleForTesting + static class FooException extends RuntimeException { + FooException(String message) { + super(message); + } + } + + public static void usingExceptionPrivately(String[] args) { + A.FooException exception = + new A.FooException(""); + } } \ 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 429a154ec49f..ec8595d6f41e 100644 --- a/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/B.java +++ b/java/java-tests/testData/inspection/testOnly/visibleForTesting/src/B.java @@ -3,5 +3,7 @@ public class B { new A().invisibleMethod(2); new A().visibleMethod(2); new A().relaxedToPackageLevel(2); + A.FooException exception = + new A.FooException(""); } } \ No newline at end of file