lambda: skip conditional condition during inference from return value

This commit is contained in:
Anna Kozlova
2012-09-04 21:05:03 +04:00
parent da28c0d623
commit d83b1f12c7
3 changed files with 30 additions and 1 deletions
@@ -311,6 +311,18 @@ public class LambdaUtil {
if (lambdaParams.length != methodParameters.length) return false;
final boolean [] independent = new boolean[]{true};
expression.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
public void visitConditionalExpression(PsiConditionalExpression expression) {
final PsiExpression thenExpression = expression.getThenExpression();
if (thenExpression != null) {
thenExpression.accept(this);
}
final PsiExpression elseExpression = expression.getElseExpression();
if (elseExpression != null) {
elseExpression.accept(this);
}
}
@Override
public void visitReferenceExpression(PsiReferenceExpression expression) {
super.visitReferenceExpression(expression);
@@ -605,7 +605,12 @@ public class PsiResolveHelperImpl implements PsiResolveHelper {
final List<PsiExpression> expressions = lambdaExpression.getReturnExpressions();
for (final PsiExpression expression : expressions) {
final boolean independent = LambdaUtil.isFreeFromTypeInferenceArgs(methodParameters, lambdaExpression, expression);
if (independent && methodParamsDependOnTypeParams) return FAILED_INFERENCE;
if (independent && methodParamsDependOnTypeParams ) {
if (lowerBound != PsiType.NULL) {
return null;
}
return FAILED_INFERENCE;
}
if (!independent) {
if (lowerBound != PsiType.NULL) {
return null;
@@ -37,3 +37,15 @@ class Test {
}
}
class Test1 {
interface I<T, V> {
V _(T t);
}
static <V> void bar(I<String, V> ii, I<V, String> ik){}
{
bar(s -> s.equals("") ? 0 : 1, i -> "");
}
}