mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-04-21 14:01:44 +07:00
method refs: do not cache results during parent conflict resolving
This commit is contained in:
@@ -112,7 +112,8 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
|
||||
return JavaResolveResult.EMPTY_ARRAY;
|
||||
}
|
||||
final MethodReferenceResolver resolver = new MethodReferenceResolver();
|
||||
if (getFunctionalInterfaceType() == null) {
|
||||
final Map<PsiMethodReferenceExpression, PsiType> map = LambdaUtil.ourRefs.get();
|
||||
if (map != null && map.containsKey(this)) {
|
||||
return (JavaResolveResult[])resolver.resolve(this, incompleteCode);
|
||||
}
|
||||
ResolveResult[] results = ResolveCache.getInstance(getProject()).resolveWithCaching(this, resolver, true,
|
||||
@@ -239,15 +240,13 @@ public class PsiMethodReferenceExpressionImpl extends PsiReferenceExpressionBase
|
||||
final PsiElement element = getReferenceNameElement();
|
||||
final boolean isConstructor = element instanceof PsiKeyword && PsiKeyword.NEW.equals(element.getText());
|
||||
if (element instanceof PsiIdentifier || isConstructor) {
|
||||
PsiType functionalInterfaceType = getFunctionalInterfaceType();
|
||||
PsiType functionalInterfaceType = null;
|
||||
final Map<PsiMethodReferenceExpression,PsiType> map = LambdaUtil.ourRefs.get();
|
||||
if (map != null) {
|
||||
functionalInterfaceType = map.get(PsiMethodReferenceExpressionImpl.this);
|
||||
}
|
||||
if (functionalInterfaceType == null) {
|
||||
final Map<PsiMethodReferenceExpression,PsiType> map = LambdaUtil.ourRefs.get();
|
||||
if (map != null) {
|
||||
functionalInterfaceType = map.get(PsiMethodReferenceExpressionImpl.this);
|
||||
}
|
||||
else {
|
||||
functionalInterfaceType = null;
|
||||
}
|
||||
functionalInterfaceType = getFunctionalInterfaceType();
|
||||
}
|
||||
final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(functionalInterfaceType);
|
||||
final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(resolveResult);
|
||||
|
||||
@@ -21,7 +21,7 @@ class MyTest {
|
||||
|
||||
static {
|
||||
foo(MyTest::m);
|
||||
foo<error descr="Ambiguous method call: both 'MyTest.foo(I2)' and 'MyTest.foo(I3)' match">(MyTest::m1)</error>;
|
||||
foo<error descr="Ambiguous method call: both 'MyTest.foo(I1)' and 'MyTest.foo(I2)' match">(MyTest::m1)</error>;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -111,5 +111,14 @@ class MyTest2 {
|
||||
<error descr="Incompatible types. Found: '<method reference>', required: 'MyTest2.I2'">I2 s4 = MyTest2 ::m4;</error>
|
||||
call2<error descr="'call2(MyTest2.I2)' in 'MyTest2' cannot be applied to '(<method reference>)'">(MyTest2::m4)</error>;
|
||||
}
|
||||
|
||||
static void call3(I1 s) {}
|
||||
static void call3(I2 s) {}
|
||||
static {
|
||||
call3(MyTest2::m1);
|
||||
call3<error descr="Ambiguous method call: both 'MyTest2.call3(I1)' and 'MyTest2.call3(I2)' match">(MyTest2::m2)</error>;
|
||||
call3(MyTest2::m3);
|
||||
call3<error descr="Cannot resolve method 'call3(<method reference>)'">(MyTest2::m4)</error>;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user