summaryrefslogtreecommitdiff
path: root/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/InferenceSession.java
diff options
context:
space:
mode:
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.java29
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;
+ }
}