method ref constrain (IDEA-119552)

This commit is contained in:
Anna Kozlova
2014-01-24 15:53:44 +04:00
parent bd80c200a7
commit b00014b47e
3 changed files with 48 additions and 10 deletions
@@ -17,16 +17,16 @@ package com.intellij.psi.impl.source.resolve.graphInference.constraints;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiImplUtil;
import com.intellij.psi.impl.source.resolve.graphInference.InferenceSession;
import com.intellij.psi.impl.source.resolve.graphInference.PsiPolyExpressionUtil;
import com.intellij.psi.impl.source.tree.java.PsiMethodCallExpressionImpl;
import com.intellij.psi.impl.source.tree.java.PsiMethodReferenceExpressionImpl;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
* User: anna
@@ -55,7 +55,11 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
final PsiSubstitutor substitutor = LambdaUtil.getSubstitutor(interfaceMethod, classResolveResult);
final PsiParameter[] targetParameters = interfaceMethod.getParameterList().getParameters();
final PsiType returnType = substitutor.substitute(interfaceMethod.getReturnType());
final PsiType interfaceMethodReturnType = interfaceMethod.getReturnType();
PsiType returnType = substitutor.substitute(interfaceMethodReturnType);
if (myExpression.getTypeParameters().length == 0) {
returnType = PsiImplUtil.normalizeWildcardTypeByPosition(returnType, myExpression);
}
final PsiType[] typeParameters = myExpression.getTypeParameters();
if (!myExpression.isExact()) {
for (PsiParameter parameter : targetParameters) {
@@ -161,11 +165,17 @@ public class PsiMethodReferenceCompatibilityConstraint implements ConstraintForm
}
LOG.assertTrue(referencedMethodReturnType != null, method);
if (typeParameters.length == 0 &&
((PsiMethod)resolve).getTypeParameters().length > 0 &&
PsiPolyExpressionUtil.mentionsTypeParameters(returnType, new HashSet<PsiTypeParameter>(Arrays.asList(interfaceMethod.getTypeParameters())))) {
//todo target type constraint
return true;
if (typeParameters.length == 0 && ((PsiMethod)resolve).getTypeParameters().length > 0) {
final PsiClass interfaceClass = classResolveResult.getElement();
LOG.assertTrue(interfaceClass != null);
if (PsiPolyExpressionUtil.mentionsTypeParameters(interfaceMethodReturnType,
ContainerUtil.newHashSet(interfaceClass.getTypeParameters()))) {
LOG.assertTrue(interfaceMethodReturnType != null);
constraints.add(new TypeCompatibilityConstraint(referencedMethodReturnType, interfaceMethodReturnType));
return true;
}
}
if (PsiType.VOID.equals(referencedMethodReturnType)) {
@@ -0,0 +1,18 @@
import java.util.*;
import java.util.stream.Stream;
import static java.util.stream.Collectors.toList;
class Test {
final List<String> wordList = new ArrayList<>();
public void upperCaseWords() {
wordList.stream().map(String::toUpperCase);
List<String> output =
wordList.stream()
.map(String::toUpperCase)
.collect(toList());
}
}
@@ -20,6 +20,7 @@ import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.uncheckedWarnings.UncheckedWarningLocalInspection;
import com.intellij.codeInspection.unusedSymbol.UnusedSymbolLocalInspection;
import com.intellij.openapi.projectRoots.JavaSdkVersion;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.testFramework.IdeaTestUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -124,6 +125,10 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testCapturingReturnValue() throws Exception {
doTest();
}
private void doTest() {
doTest(false);
}
@@ -132,4 +137,9 @@ public class NewMethodRefHighlightingTest extends LightDaemonAnalyzerTestCase {
IdeaTestUtil.setTestVersion(JavaSdkVersion.JDK_1_8, getModule(), getTestRootDisposable());
doTestNewInference(BASE_PATH + "/" + getTestName(false) + ".java", warnings, false);
}
@Override
protected Sdk getProjectJDK() {
return IdeaTestUtil.getMockJdk18();
}
}