multiple jdks/not exported dependencies: check that declared type of the qualifier doesn't contain unknown types

This commit is contained in:
Anna Kozlova
2015-02-09 20:33:09 +01:00
parent 241b81e354
commit 2e438a4f7c
5 changed files with 36 additions and 3 deletions
@@ -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<PsiClass>(), resolveScope, factory);
if (notAccessibleErrorMessage != null) {
return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR)
.descriptionAndTooltip(notAccessibleErrorMessage)
.range(HighlightNamesUtil.getClassDeclarationTextRange(aClass))
.range(range)
.create();
}
}
@@ -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
@@ -0,0 +1,6 @@
package p;
abstract class B {
void f(A a) {
<error descr="Cannot access java.util.stream.Stream">a</error>.foo();
}
}
@@ -0,0 +1,7 @@
package p;
import java.util.stream.Stream;
import java.util.List;
public abstract class A implements List<Stream<String>> {
public void foo() {}
}
@@ -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();