mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
new inference: take into account site substitutors during additional constraints gathering
This commit is contained in:
+8
-5
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
@@ -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;
|
||||
}
|
||||
}
|
||||
+4
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user