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