new inference: open/close capture when method reference is resolved (IDEA-128712)

This commit is contained in:
Anna Kozlova
2014-08-18 20:56:11 +04:00
parent f39bfa7af0
commit 356c3e7c9e
5 changed files with 46 additions and 17 deletions
@@ -75,20 +75,22 @@ public class PsiMethodReferenceUtil {
return null;
}
public static boolean isCorrectAssignment(PsiType[] signatureParameterTypes2,
PsiType[] parameterTypes,
public static boolean isCorrectAssignment(PsiType[] parameterTypes,
PsiType[] argTypes,
boolean varargs,
int offset) {
final int min = Math.min(signatureParameterTypes2.length, parameterTypes.length - offset);
final int min = Math.min(parameterTypes.length, argTypes.length - offset);
for (int i = 0; i < min; i++) {
final PsiType type1 = parameterTypes[i + offset];
final PsiType type2 = signatureParameterTypes2[i];
if (varargs && i == signatureParameterTypes2.length - 1) {
if (!TypeConversionUtil.isAssignable(type2, type1) && !TypeConversionUtil.isAssignable(((PsiArrayType)type2).getComponentType(), type1)) {
final PsiType argType = argTypes[i + offset];
PsiType parameterType = parameterTypes[i];
parameterType = GenericsUtil.getVariableTypeByExpressionType(parameterType, true);
if (varargs && i == parameterTypes.length - 1) {
if (!TypeConversionUtil.isAssignable(parameterType, argType) &&
!TypeConversionUtil.isAssignable(((PsiArrayType)parameterType).getComponentType(), argType)) {
return false;
}
}
else if (!TypeConversionUtil.isAssignable(type2, type1)) {
else if (!TypeConversionUtil.isAssignable(parameterType, argType)) {
return false;
}
}