From 2e438a4f7c1ca80db538992634419075b4bdadb9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 9 Feb 2015 20:29:26 +0100 Subject: [PATCH] multiple jdks/not exported dependencies: check that declared type of the qualifier doesn't contain unknown types --- .../daemon/impl/analysis/GenericsHighlightUtil.java | 13 +++++++++++-- .../daemon/impl/analysis/HighlightVisitorImpl.java | 9 ++++++++- ...DeclaredTypeOfVariableImplementsUnknownType.java | 6 ++++++ ...DeclaredTypeOfVariableImplementsUnknownType.java | 7 +++++++ .../codeInsight/MultipleJdksHighlightingTest.java | 4 ++++ 5 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/multipleJdks/java7/p/DeclaredTypeOfVariableImplementsUnknownType.java create mode 100644 java/java-tests/testData/codeInsight/multipleJdks/java8/p/DeclaredTypeOfVariableImplementsUnknownType.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 0e35626a89fd..a457768abeac 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -1336,14 +1336,23 @@ public class GenericsHighlightUtil { } public static HighlightInfo areSupersAccessible(@NotNull PsiClass aClass) { + return areSupersAccessible(aClass, aClass.getResolveScope(), HighlightNamesUtil.getClassDeclarationTextRange(aClass)); + } + + public static HighlightInfo areSupersAccessible(@NotNull PsiClass aClass, PsiElement ref) { + return areSupersAccessible(aClass, ref.getResolveScope(), ref.getTextRange()); + } + + private static HighlightInfo areSupersAccessible(@NotNull PsiClass aClass, + GlobalSearchScope resolveScope, + TextRange range) { final JavaPsiFacade factory = JavaPsiFacade.getInstance(aClass.getProject()); - final GlobalSearchScope resolveScope = aClass.getResolveScope(); for (PsiClassType superType : aClass.getSuperTypes()) { final String notAccessibleErrorMessage = isSuperTypeAccessible(superType, new HashSet(), resolveScope, factory); if (notAccessibleErrorMessage != null) { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) .descriptionAndTooltip(notAccessibleErrorMessage) - .range(HighlightNamesUtil.getClassDeclarationTextRange(aClass)) + .range(range) .create(); } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java index 383d6292ecdf..c08d7d988ffa 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java @@ -1221,7 +1221,14 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh } if (!myHolder.hasErrorResults()) myHolder.add(GenericsHighlightUtil.checkAccessStaticFieldFromEnumConstructor(expression, result)); if (!myHolder.hasErrorResults()) myHolder.add(HighlightUtil.checkClassReferenceAfterQualifier(expression, resolved)); - myHolder.add(HighlightUtil.checkUnqualifiedSuperInDefaultMethod(myLanguageLevel, expression, expression.getQualifierExpression())); + final PsiExpression qualifierExpression = expression.getQualifierExpression(); + myHolder.add(HighlightUtil.checkUnqualifiedSuperInDefaultMethod(myLanguageLevel, expression, qualifierExpression)); + if (!myHolder.hasErrorResults() && qualifierExpression != null) { + final PsiClass psiClass = PsiUtil.resolveClassInType(qualifierExpression.getType()); + if (psiClass != null) { + myHolder.add(GenericsHighlightUtil.areSupersAccessible(psiClass, qualifierExpression)); + } + } } @Override diff --git a/java/java-tests/testData/codeInsight/multipleJdks/java7/p/DeclaredTypeOfVariableImplementsUnknownType.java b/java/java-tests/testData/codeInsight/multipleJdks/java7/p/DeclaredTypeOfVariableImplementsUnknownType.java new file mode 100644 index 000000000000..0622320a9c9e --- /dev/null +++ b/java/java-tests/testData/codeInsight/multipleJdks/java7/p/DeclaredTypeOfVariableImplementsUnknownType.java @@ -0,0 +1,6 @@ +package p; +abstract class B { + void f(A a) { + a.foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/multipleJdks/java8/p/DeclaredTypeOfVariableImplementsUnknownType.java b/java/java-tests/testData/codeInsight/multipleJdks/java8/p/DeclaredTypeOfVariableImplementsUnknownType.java new file mode 100644 index 000000000000..07e72962683a --- /dev/null +++ b/java/java-tests/testData/codeInsight/multipleJdks/java8/p/DeclaredTypeOfVariableImplementsUnknownType.java @@ -0,0 +1,7 @@ +package p; +import java.util.stream.Stream; +import java.util.List; + +public abstract class A implements List> { + public void foo() {} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java index 7f8a1b869b16..6d536928038b 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/MultipleJdksHighlightingTest.java @@ -117,6 +117,10 @@ public class MultipleJdksHighlightingTest extends UsefulTestCase { public void testSuperclassImplementsUnknownType() throws Exception { doTestWithoutLibrary(); } + + public void testDeclaredTypeOfVariableImplementsUnknownType() throws Exception { + doTestWithoutLibrary(); + } public void testSuperclassImplementsGenericsOfUnknownType() throws Exception { doTestWithoutLibrary();