From 64afe806a981f46fc5f7f27d138ac682826de524 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Fri, 18 Nov 2016 17:15:15 +0300 Subject: [PATCH] Java: Handle fields and methods in the inspection "Non-accessible type is exposed", added arrays test (IDEA-162768) --- ...va9NonAccessibleTypeExposedInspection.java | 40 ++++++------- .../Java9NonAccessibleTypeExposedTest.kt | 60 ++++++++++++++++--- 2 files changed, 69 insertions(+), 31 deletions(-) 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 {}")