error for not accessible types mentioned by inferred functional type (IDEA-143417)

This commit is contained in:
Anna Kozlova
2015-08-18 12:34:31 +02:00
parent 676c477fab
commit 0da30526fd
3 changed files with 45 additions and 11 deletions
@@ -351,11 +351,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (result != null) {
myHolder.add(result);
} else {
final PsiClass samClass = resolveResult.getElement();
if (!PsiUtil.isAccessible(myFile.getProject(), samClass, expression, null)) {
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression)
.descriptionAndTooltip(HighlightUtil.buildProblemWithAccessDescription(expression, resolveResult)).create());
}
checkFunctionalInterfaceTypeAccessible(expression, functionalInterfaceType);
}
}
}
@@ -1291,12 +1287,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
}
}
if (!myHolder.hasErrorResults()) {
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
final PsiClass psiClass = resolveResult.getElement();
if (psiClass != null && !PsiUtil.isAccessible(myFile.getProject(), psiClass, expression, null)) {
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression)
.descriptionAndTooltip(HighlightUtil.buildProblemWithAccessDescription(expression, resolveResult)).create());
}
final PsiClassType.ClassResolveResult resolveResult = checkFunctionalInterfaceTypeAccessible(expression, functionalInterfaceType);
final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult);
if (interfaceMethod != null) {
@@ -1381,6 +1372,27 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
}
}
// 15.13 | 15.27
// It is a compile-time error if any class or interface mentioned by either U or the function type of U
// is not accessible from the class or interface in which the method reference expression appears.
private PsiClassType.ClassResolveResult checkFunctionalInterfaceTypeAccessible(PsiFunctionalExpression expression,
PsiType functionalInterfaceType) {
PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
final PsiClass psiClass = resolveResult.getElement();
if (psiClass != null) {
if (!PsiUtil.isAccessible(myFile.getProject(), psiClass, expression, null)) {
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression)
.descriptionAndTooltip(HighlightUtil.buildProblemWithAccessDescription(expression, resolveResult)).create());
}
else {
for (PsiType type : resolveResult.getSubstitutor().getSubstitutionMap().values()) {
checkFunctionalInterfaceTypeAccessible(expression, type);
}
}
}
return resolveResult;
}
@Override
public void visitReferenceList(PsiReferenceList list) {
if (list.getFirstChild() == null) return;
@@ -0,0 +1,18 @@
import java.util.function.Consumer;
class Test {
{
consume(<error descr="'Outer.A' has private access in 'Outer'">o -> {}</error>, new Outer.B(), new Outer.C());
consume(<error descr="'Outer.A' has private access in 'Outer'">Test::foo</error>, new Outer.B(), new Outer.C());
}
private static void foo(Object o) {}
private static <T> void consume(Consumer<T> c, T... element) {}
}
class Outer {
private static class A {}
public static class B extends A {}
public static class C extends A {}
}
@@ -203,6 +203,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testNonAccessibleFunctionalInterfaceTypeArguments() throws Exception {
doTest();
}
private void doTest() {
doTest(false);
}