diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9NonAccessibleTypeExposedInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9NonAccessibleTypeExposedInspection.java
index b46e4b46d0b8..9034c6a13b8a 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9NonAccessibleTypeExposedInspection.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInspection/java19modules/Java9NonAccessibleTypeExposedInspection.java
@@ -80,30 +80,24 @@ public class Java9NonAccessibleTypeExposedInspection extends BaseJavaLocalInspec
}
@Override
- public void visitMethod(PsiMethod method) {
- super.visitMethod(method);
- if (isModulePublicApi(method)) {
- if (!method.isConstructor()) {
- checkType(method.getReturnType(), method.getReturnTypeElement());
- }
- checkTypeParameters(method.getTypeParameterList());
- for (PsiParameter parameter : method.getParameterList().getParameters()) {
- checkType(parameter.getType(), parameter.getTypeElement());
- }
- for (PsiJavaCodeReferenceElement referenceElement : method.getThrowsList().getReferenceElements()) {
- PsiElement resolved = referenceElement.resolve();
- if (resolved instanceof PsiClass) {
- checkType((PsiClass)resolved, referenceElement);
- }
- }
+ public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
+ super.visitReferenceElement(reference);
+ PsiElement parent = reference.getParent();
+ PsiElement grandParent = null;
+ if (parent instanceof PsiTypeElement) {
+ grandParent = PsiTreeUtil.skipParentsOfType(reference, PsiTypeElement.class,
+ PsiParameter.class, PsiParameterList.class,
+ PsiReferenceParameterList.class, PsiJavaCodeReferenceElement.class);
}
- }
-
- @Override
- public void visitField(PsiField field) {
- super.visitField(field);
- if (isModulePublicApi(field)) {
- checkType(field.getType(), field.getTypeElement());
+ else if (parent instanceof PsiReferenceList) {
+ grandParent = PsiTreeUtil.skipParentsOfType(reference, PsiReferenceList.class,
+ PsiTypeParameter.class, PsiTypeParameterList.class);
+ }
+ if ((grandParent instanceof PsiField || grandParent instanceof PsiMethod) && isModulePublicApi((PsiMember)grandParent)) {
+ PsiElement resolved = reference.resolve();
+ if (resolved instanceof PsiClass) {
+ checkType((PsiClass)resolved, reference);
+ }
}
}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/Java9NonAccessibleTypeExposedTest.kt b/java/java-tests/testSrc/com/intellij/codeInspection/Java9NonAccessibleTypeExposedTest.kt
index 0b93c6b7e656..ea47c819d947 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/Java9NonAccessibleTypeExposedTest.kt
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/Java9NonAccessibleTypeExposedTest.kt
@@ -60,7 +60,9 @@ import m2Pkg.Exported;
public class Highlighted {
public Exported myVar;
protected Highlighted() {}
- public Highlighted(Exported var) {setVar(var);}
+ public Highlighted(Exported var) {
+ Exported tmp = new Exported(); myVar = var!= null ? var : tmp;
+ }
public Exported getVar() {return myVar;}
protected void setVar(Exported var) {myVar = var;}
}""")
@@ -71,7 +73,9 @@ public class Highlighted {
public class Highlighted {
public PackageLocal myVar;
protected Highlighted() {}
- public Highlighted(PackageLocal var) {setVar(var);}
+ public Highlighted(PackageLocal var) {
+ PackageLocal tmp = new PackageLocal(); myVar = var!= null ? var : tmp;
+ }
public PackageLocal getVar() {return myVar;}
protected void setVar(PackageLocal var) {myVar = var;}
}
@@ -83,7 +87,9 @@ public class Highlighted {
public class Highlighted {
private PackageLocal myVar;
private Highlighted() {}
- Highlighted(PackageLocal var) {setVar(var);}
+ Highlighted(PackageLocal var) {
+ PackageLocal tmp = new PackageLocal(); myVar = var!= null ? var : tmp;
+ }
PackageLocal getVar() {return myVar;}
private void setVar(PackageLocal var) {myVar = var;}
}
@@ -95,7 +101,9 @@ public class Highlighted {
class Highlighted {
public PackageLocal myVar;
protected Highlighted() {}
- public Highlighted(PackageLocal var) {setVar(var);}
+ public Highlighted(PackageLocal var) {
+ PackageLocal tmp = new PackageLocal(); myVar = var!= null ? var : tmp;
+ }
public PackageLocal getVar() {return myVar;}
protected void setVar(PackageLocal var) {myVar = var;}
}
@@ -107,7 +115,9 @@ class Highlighted {
public class Highlighted {
public PublicApi myVar;
protected Highlighted() {}
- public Highlighted(PublicApi var) {setVar(var);}
+ public Highlighted(PublicApi var) {
+ PublicApi tmp = new PublicApi(); myVar = var!= null ? var : tmp;
+ }
public PublicApi getVar() {return myVar;}
protected void setVar(PublicApi var) {myVar = var;}
}
@@ -120,7 +130,9 @@ import otherPkg.PublicOther;
public class Highlighted {
public PublicOther myVar;
protected Highlighted() {}
- public Highlighted(PublicOther var) {setVar(var);}
+ public Highlighted(PublicOther var) {
+ PublicOther tmp = new PublicOther(); myVar = var!= null ? var : tmp;
+ }
public PublicOther getVar() {return myVar;}
protected void setVar(PublicOther var) {myVar = var;}
}
@@ -133,7 +145,9 @@ public class Highlighted {
public class PublicNested {}
public PublicNested myVar;
protected Highlighted() {}
- public Highlighted(PublicNested var) {setVar(var);}
+ public Highlighted(PublicNested var) {
+ PublicNested tmp = new PublicNested(); myVar = var!= null ? var : tmp;
+ }
public PublicNested getVar() {return myVar;}
protected void setVar(PublicNested var) {myVar = var;}
}
@@ -146,7 +160,9 @@ public class Highlighted {
class PackageLocalNested {}
public PackageLocalNested myVar;
protected Highlighted() {}
- public Highlighted(PackageLocalNested var) {setVar(var);}
+ public Highlighted(PackageLocalNested var) {
+ PackageLocalNested tmp = new PackageLocalNested(); myVar = var!= null ? var : tmp;
+ }
public PackageLocalNested getVar() {return myVar;}
protected void setVar(PackageLocalNested var) {myVar = var;}
}
@@ -203,6 +219,34 @@ public class Highlighted {
""")
}
+ fun testExportedArray() {
+ addFile("m2Pkg/Exported.java", "package m2Pkg; public class Exported {}", M2)
+ highlight("""package apiPkg;
+import m2Pkg.Exported;
+import java.util.*;
+public class Highlighted {
+ public Exported[] myVar;
+ protected Highlighted(List list) {Iterator it = list.iterator(); myVar = it.next();}
+ public Highlighted(Exported[] var) {myVar = var;}
+ public Exported[] getVar() {return myVar;}
+ protected void setVar(Exported[][] var) {myVar = var[0];}
+}""")
+ }
+
+ fun testNotExportedArray() {
+ add("implPkg", "NotExported", "public class NotExported {}")
+ highlight("""package apiPkg;
+import implPkg.NotExported;
+import java.util.*;
+public class Highlighted {
+ public NotExported[] myVar;
+ protected Highlighted(List<NotExported[]> list) {Iterator it = list.iterator(); myVar = it.next();}
+ public Highlighted(NotExported[] var) {myVar = var;}
+ public NotExported[] getVar() {return myVar;}
+ protected void setVar(NotExported[][] var) {myVar = var[0];}
+}""")
+ }
+
fun testThrows() {
add("apiPkg", "PublicException", "public class PublicException extends Exception {}")
add("apiPkg", "PackageLocalException", "class PackageLocalException extends Exception {}")