mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
error for not accessible types mentioned by inferred functional type (IDEA-143417)
This commit is contained in:
+23
-11
@@ -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;
|
||||
|
||||
+18
@@ -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 {}
|
||||
}
|
||||
+4
@@ -203,6 +203,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase {
|
||||
doTest();
|
||||
}
|
||||
|
||||
public void testNonAccessibleFunctionalInterfaceTypeArguments() throws Exception {
|
||||
doTest();
|
||||
}
|
||||
|
||||
private void doTest() {
|
||||
doTest(false);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user