method reference: include super substitutor into method reference substitutor when referenced method has no type parameters (IDEA-169134)

This commit is contained in:
Anna.Kozlova
2017-03-07 09:12:04 +01:00
parent 8e52e9afad
commit 9c3ebf16aa
4 changed files with 21 additions and 8 deletions

View File

@@ -107,13 +107,6 @@ public class PsiMethodReferenceUtil {
return false;
}
PsiClass qContainingClass = getQualifierResolveResult(expression).getContainingClass();
if (qContainingClass != null && containingClass != null &&
isReceiverType(getFirstParameterType(functionalInterfaceType, expression), qContainingClass, subst)) {
subst = TypeConversionUtil.getClassSubstitutor(containingClass, qContainingClass, subst);
LOG.assertTrue(subst != null);
}
methodReturnType = subst.substitute(methodReturnType);
}
}

View File

@@ -1607,7 +1607,8 @@ public class InferenceSession {
if (receiverSubstitutor != null) {
if (!method.hasTypeParameters()) {
if (signature.getParameterTypes().length == 1 || PsiUtil.isRawSubstitutor(containingClass, receiverSubstitutor)) {
return receiverSubstitutor;
return methodContainingClass != null ? JavaClassSupers.getInstance().getSuperClassSubstitutor(methodContainingClass, containingClass, reference.getResolveScope(), receiverSubstitutor)
: receiverSubstitutor;
}
}
mySiteSubstitutor = mySiteSubstitutor.putAll(receiverSubstitutor);

View File

@@ -0,0 +1,15 @@
import java.util.function.BiFunction;
import java.util.function.Function;
class Test {
interface MyBaseStream<T, S extends MyBaseStream<T, S>> {
<R> MyStream<R> map(Function<? super T, ? extends R> mapper);
}
interface MyStream<T> extends MyBaseStream<T, MyStream<T>> {}
{
BiFunction<MyStream<Integer>, Function<Integer, Integer>, MyStream<Integer>> streamMapper = MyStream::map;
}
}

View File

@@ -537,6 +537,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testMethodInInheritorFoundBySecondSearch() throws Exception {
doTest();
}
public void testNonExactMethodReferenceOnRawClassType() throws Exception {
doTest();
}