From 530d047004b9bc010264ae663249ec93c6a94ac1 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 14 Nov 2013 19:48:41 +0100 Subject: [PATCH] new inference: merge equals constraints before rejection (cherry picked from commit 3a660f4b84a23f42f1355bc7702c6d9904984ee2) --- .../resolve/graphInference/InferenceSession.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java index 5871ce1f638a..10003ab5b4a9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java @@ -16,6 +16,7 @@ package com.intellij.psi.impl.source.resolve.graphInference; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Pair; import com.intellij.psi.*; @@ -480,16 +481,19 @@ public class InferenceSession { inferenceVariable.setInstantiation(null); continue; } + PsiType bound = null; if (eqBounds.size() > 1) { for (Iterator iterator = eqBounds.iterator(); iterator.hasNext(); ) { - PsiType eqBound = iterator.next(); - if (PsiUtil.resolveClassInType(eqBound) == typeParameter) { + PsiType eqBound = acceptBoundsWithRecursiveDependencies(inferenceVariable, iterator.next(), substitutor); + if (PsiUtil.resolveClassInType(eqBound) == typeParameter || Comparing.equal(bound, eqBound)) { iterator.remove(); + } else if (bound == null) { + bound = eqBound; } } if (eqBounds.size() > 1) continue; } - PsiType bound = eqBounds.isEmpty() ? null : acceptBoundsWithRecursiveDependencies(inferenceVariable, eqBounds.get(0), substitutor); + bound = eqBounds.isEmpty() ? null : acceptBoundsWithRecursiveDependencies(inferenceVariable, eqBounds.get(0), substitutor); if (bound != null) { inferenceVariable.setInstantiation(bound); } else {