diff options
Diffstat (limited to 'java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java')
-rw-r--r-- | java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java | 29 |
1 files changed, 20 insertions, 9 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 6098199c591c..7d6166a7f95a 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 @@ -349,13 +349,17 @@ public class InferenceSession { } public boolean initBounds(PsiTypeParameter... typeParameters) { + return initBounds(myContext, typeParameters); + } + + public boolean initBounds(PsiElement context, PsiTypeParameter... typeParameters) { boolean sameMethodCall = false; for (PsiTypeParameter parameter : typeParameters) { if (myInferenceVariables.containsKey(parameter)) { sameMethodCall = true; continue; } - InferenceVariable variable = new InferenceVariable(parameter); + InferenceVariable variable = new InferenceVariable(context, parameter); boolean added = false; final PsiClassType[] extendsListTypes = parameter.getExtendsListTypes(); for (PsiType classType : extendsListTypes) { @@ -415,7 +419,7 @@ public class InferenceSession { for (int i = 0; i < typeParameters.length; i++) { PsiTypeParameter typeParameter = typeParameters[i]; copy[i] = elementFactory.createTypeParameterFromText("rCopy" + typeParameter.getName(), null); - initBounds(copy[i]); + initBounds(myContext, copy[i]); subst = subst.put(typeParameter, elementFactory.createType(copy[i])); } final PsiType substitutedCapture = PsiUtil.captureToplevelWildcards(subst.substitute(returnType), myContext); @@ -446,7 +450,7 @@ public class InferenceSession { } private static boolean hasPrimitiveWrapperBound(InferenceVariable inferenceVariable) { - final InferenceBound[] boundTypes = {InferenceBound.UPPER, InferenceBound.LOWER}; + final InferenceBound[] boundTypes = {InferenceBound.UPPER, InferenceBound.LOWER, InferenceBound.EQ}; for (InferenceBound inferenceBound : boundTypes) { final List<PsiType> bounds = inferenceVariable.getBounds(inferenceBound); for (PsiType bound : bounds) { @@ -701,7 +705,7 @@ public class InferenceSession { final PsiTypeParameter copy = elementFactory.createTypeParameterFromText("z" + parameter.getName(), null); final PsiType lub = getLowerBound(var, substitutor); final PsiType glb = getUpperBound(var, substitutor); - final InferenceVariable zVariable = new InferenceVariable(copy); + final InferenceVariable zVariable = new InferenceVariable(var.getCallContext(), copy); zVariable.addBound(glb, InferenceBound.UPPER); if (lub != PsiType.NULL) { if (!TypeConversionUtil.isAssignable(glb, lub)) { @@ -1026,7 +1030,7 @@ public class InferenceSession { boolean varargs) { final InferenceSession session = new InferenceSession(PsiTypeParameter.EMPTY_ARRAY, PsiSubstitutor.EMPTY, m2.getManager(), context); for (PsiTypeParameter param : PsiUtil.typeParametersIterable(m2)) { - session.initBounds(param); + session.initBounds(context, param); } final PsiParameter[] parameters1 = m1.getParameterList().getParameters(); @@ -1250,14 +1254,17 @@ public class InferenceSession { return myIncorporationPhase.hasCaptureConstraints(Arrays.asList(inferenceVariable)); } - public void liftBounds(Collection<InferenceVariable> variables) { + public void liftBounds(PsiElement context, Collection<InferenceVariable> variables) { for (InferenceVariable variable : variables) { final PsiTypeParameter parameter = variable.getParameter(); final InferenceVariable inferenceVariable = getInferenceVariable(parameter); if (inferenceVariable != null) { - for (InferenceBound boundType : InferenceBound.values()) { - for (PsiType bound : variable.getBounds(boundType)) { - inferenceVariable.addBound(bound, boundType); + final PsiElement callContext = inferenceVariable.getCallContext(); + if (context.equals(callContext) || myContext.equals(callContext)) { + for (InferenceBound boundType : InferenceBound.values()) { + for (PsiType bound : variable.getBounds(boundType)) { + inferenceVariable.addBound(bound, boundType); + } } } } else { @@ -1270,4 +1277,8 @@ public class InferenceSession { final Boolean erased = call.getUserData(ERASED); return erased != null && erased.booleanValue(); } + + public PsiElement getContext() { + return myContext; + } } |