method refs: decline constructor refs on array ref with inapplicable substitutor

This commit is contained in:
anna
2013-02-26 18:24:55 +01:00
parent 23056b8d20
commit 7333331a42
2 changed files with 14 additions and 1 deletions

View File

@@ -163,6 +163,13 @@ public class PsiMethodReferenceUtil {
final PsiType interfaceReturnType = LambdaUtil.getFunctionalInterfaceReturnType(left);
if (interfaceReturnType != null) {
if (interfaceReturnType == PsiType.VOID) return true;
if (onArrayType(((PsiClass)resolve), method.getSignature(PsiSubstitutor.EMPTY))) {
final PsiTypeParameter[] parameters = ((PsiClass)resolve).getTypeParameters();
if (parameters.length == 1) {
final PsiType arrayComponentType = result.getSubstitutor().substitute(parameters[0]);
return arrayComponentType != null && TypeConversionUtil.isAssignable(interfaceReturnType, arrayComponentType.createArrayType(), true);
}
}
final PsiClassType classType = JavaPsiFacade.getElementFactory(methodReferenceExpression.getProject()).createType((PsiClass)resolve, result.getSubstitutor());
if (TypeConversionUtil.isAssignable(interfaceReturnType, classType, !((PsiClass)resolve).hasTypeParameters())) {
final PsiParameter[] parameters = method.getParameterList().getParameters();

View File

@@ -21,7 +21,9 @@ class OnArrayTest {
String _(T[] ta);
}
interface ArrayReturnType<T> {
T make(int size);
}
public static void main(String[] args) {
Cln s = int[]::clone;
@@ -29,5 +31,9 @@ class OnArrayTest {
<error descr="Incompatible types. Found: '<method reference>', required: 'OnArrayTest.I'">I i = int[]::new;</error>
<error descr="Incompatible types. Found: '<method reference>', required: 'OnArrayTest.Len<java.lang.String>'">Len<String> strLen = String[]::length;</error>
ToStr<Integer> toStr = Integer[]::toString;
ArrayReturnType<String[]> a1 = String[]::new;
ArrayReturnType<String[][]> a2 = String[][]::new;
<error descr="Incompatible types. Found: '<method reference>', required: 'OnArrayTest.ArrayReturnType<java.lang.String[]>'">ArrayReturnType<String[]> a3 = int[]::new;</error>
}
}