new inference: take into account site substitutors during additional constraints gathering

This commit is contained in:
Anna Kozlova
2014-02-20 20:27:38 +01:00
parent 6a5b57db26
commit 9fc4b68c25
3 changed files with 24 additions and 6 deletions
@@ -205,7 +205,7 @@ public class InferenceSession {
if (parameters != null && args != null) {
final Set<ConstraintFormula> additionalConstraints = new HashSet<ConstraintFormula>();
if (parameters.length > 0) {
collectAdditionalConstraints(parameters, args, parentMethod, additionalConstraints);
collectAdditionalConstraints(parameters, args, parentMethod, PsiSubstitutor.EMPTY, additionalConstraints);
}
if (!additionalConstraints.isEmpty() && !proceedWithAdditionalConstraints(additionalConstraints)) {
@@ -220,10 +220,11 @@ public class InferenceSession {
private static void collectAdditionalConstraints(PsiParameter[] parameters,
PsiExpression[] args,
PsiMethod parentMethod,
PsiSubstitutor siteSubstitutor,
Set<ConstraintFormula> additionalConstraints) {
for (int i = 0; i < args.length; i++) {
if (args[i] != null) {
PsiType parameterType = getParameterType(parameters, args, i, PsiSubstitutor.EMPTY);
PsiType parameterType = getParameterType(parameters, args, i, siteSubstitutor);
if (!isPertinentToApplicability(args[i], parentMethod)) {
additionalConstraints.add(new ExpressionCompatibilityConstraint(args[i], parameterType));
}
@@ -234,11 +235,13 @@ public class InferenceSession {
final PsiCallExpression callExpression = (PsiCallExpression)args[i];
final PsiExpressionList argumentList = callExpression.getArgumentList();
if (argumentList != null) {
final PsiMethod method = callExpression.resolveMethod();
if (method != null) {
final JavaResolveResult result = callExpression.resolveMethodGenerics();
if (result instanceof MethodCandidateInfo) {
final PsiMethod method = ((MethodCandidateInfo)result).getElement();
LOG.assertTrue(method != null);
final PsiExpression[] newArgs = argumentList.getExpressions();
final PsiParameter[] newParams = method.getParameterList().getParameters();
collectAdditionalConstraints(newParams, newArgs, method, additionalConstraints);
collectAdditionalConstraints(newParams, newArgs, method, ((MethodCandidateInfo)result).getSiteSubstitutor(), additionalConstraints);
}
}
}
@@ -0,0 +1,12 @@
import java.util.concurrent.CompletableFuture;
class CompletableFutureTest {
void foo(CompletableFuture<String> future3, CompletableFuture<String> future1) throws Exception {
onFailure(future1.thenApply(v -> future3));
}
private static <T1> CompletableFuture<T1> onFailure(CompletableFuture<T1> future) {
return null;
}
}
@@ -113,7 +113,10 @@ public class NewLambdaHighlightingTest extends LightDaemonAnalyzerTestCase {
public void testFunctionalInterfacesCalculation() throws Exception {
doTest();
}
public void testMissedSiteSubstitutorDuringDeepAdditionalConstraintsGathering() throws Exception {
doTest();
}
private void doTest() {
doTest(false);