From 9544b4c8099f58e95d8f5fe0f207b40280559333 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 14 Dec 2016 17:44:26 +0100 Subject: [PATCH] highlight inaccessible array component type (IDEA-165434) --- .../src/com/intellij/psi/util/PsiUtil.java | 26 +++++++++++++------ ...calClassUsedinArrayTypeOutsidePackage.java | 7 +++++ .../LightAdvHighlightingFixtureTest.java | 7 +++++ 3 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/PackageLocalClassUsedinArrayTypeOutsidePackage.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java index d79299b27445..3120f2e46a23 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java @@ -116,6 +116,19 @@ public final class PsiUtil extends PsiUtilCore { public static JavaResolveResult getAccessObjectClass(@NotNull PsiExpression expression) { if (expression instanceof PsiSuperExpression) return JavaResolveResult.EMPTY; PsiType type = expression.getType(); + final JavaResolveResult accessObject = getAccessObjectClass(type, expression.getProject()); + if (accessObject != null) return accessObject; + + if (type == null && expression instanceof PsiReferenceExpression) { + JavaResolveResult resolveResult = ((PsiReferenceExpression)expression).advancedResolve(false); + if (resolveResult.getElement() instanceof PsiClass) { + return resolveResult; + } + } + return JavaResolveResult.EMPTY; + } + + private static JavaResolveResult getAccessObjectClass(PsiType type, Project project) { if (type instanceof PsiClassType) { return ((PsiClassType)type).resolveGenerics(); } @@ -132,22 +145,19 @@ public final class PsiUtil extends PsiUtilCore { final PsiClass resolved = ((PsiClassType)upperBound).resolve(); final PsiFile containingFile = resolved != null ? resolved.getContainingFile() : null; final String packageName = containingFile instanceof PsiClassOwner ? ((PsiClassOwner)containingFile).getPackageName() : null; - String classText = StringUtil.isEmptyOrSpaces(packageName) ? "" : "package " +packageName + ";\n "; + String classText = StringUtil.isEmptyOrSpaces(packageName) ? "" : "package " + packageName + ";\n "; classText += "class I {}"; final PsiJavaFile file = - (PsiJavaFile)PsiFileFactory.getInstance(expression.getProject()).createFileFromText("inference_dummy.java", JavaLanguage.INSTANCE, classText); + (PsiJavaFile)PsiFileFactory.getInstance(project).createFileFromText("inference_dummy.java", JavaLanguage.INSTANCE, classText); final PsiTypeParameter freshParameter = file.getClasses()[0].getTypeParameters()[0]; return new ClassCandidateInfo(freshParameter, PsiSubstitutor.EMPTY); } } - if (type == null && expression instanceof PsiReferenceExpression) { - JavaResolveResult resolveResult = ((PsiReferenceExpression)expression).advancedResolve(false); - if (resolveResult.getElement() instanceof PsiClass) { - return resolveResult; - } + if (type instanceof PsiArrayType) { + return getAccessObjectClass(((PsiArrayType)type).getComponentType(), project); } - return JavaResolveResult.EMPTY; + return null; } public static boolean isConstantExpression(@Nullable PsiExpression expression) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/PackageLocalClassUsedinArrayTypeOutsidePackage.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/PackageLocalClassUsedinArrayTypeOutsidePackage.java new file mode 100644 index 000000000000..2901de562e1a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/PackageLocalClassUsedinArrayTypeOutsidePackage.java @@ -0,0 +1,7 @@ +package b; +class C { + { + int u = a.B.getAs().length; + a.B.getAs().clone(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingFixtureTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingFixtureTest.java index e08e7e9f8923..5b3ecddbe758 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingFixtureTest.java @@ -92,6 +92,13 @@ public class LightAdvHighlightingFixtureTest extends LightCodeInsightFixtureTest myFixture.checkHighlighting(); } + public void testPackageLocalClassUsedinArrayTypeOutsidePackage() throws Exception { + myFixture.addClass("package a; class A {}"); + myFixture.addClass("package a; public class B {public static A[] getAs() {return null;}}"); + myFixture.configureByFile(getTestName(false) + ".java"); + myFixture.checkHighlighting(); + } + @Override protected String getBasePath() { return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/advFixture";