moved 'checkBoundsAreSatisfied' to ConstraintsUtil

This commit is contained in:
Svetlana Isakova
2012-07-11 17:56:23 +04:00
parent ab0bc60fbd
commit 1632ec07cd
3 changed files with 20 additions and 20 deletions
@@ -123,7 +123,7 @@ public class ConstraintsSystemImpl implements ConstraintsSystem {
addConstraint(ConstraintKind.SUPER_TYPE, subjectType, constrainingType, constraintPosition); addConstraint(ConstraintKind.SUPER_TYPE, subjectType, constrainingType, constraintPosition);
} }
public void addConstraint(@NotNull ConstraintKind constraintKind, @NotNull JetType subjectType, @NotNull JetType constrainingType, private void addConstraint(@NotNull ConstraintKind constraintKind, @NotNull JetType subjectType, @NotNull JetType constrainingType,
@NotNull ConstraintPosition constraintPosition) { @NotNull ConstraintPosition constraintPosition) {
if (subjectType == DONT_CARE || constrainingType == DONT_CARE || subjectType == TypeUtils.NO_EXPECTED_TYPE if (subjectType == DONT_CARE || constrainingType == DONT_CARE || subjectType == TypeUtils.NO_EXPECTED_TYPE
|| constrainingType == TypeUtils.NO_EXPECTED_TYPE) { || constrainingType == TypeUtils.NO_EXPECTED_TYPE) {
@@ -234,19 +234,4 @@ public class ConstraintsSystemImpl implements ConstraintsSystem {
public TypeSubstitutor getResultingSubstitutor() { public TypeSubstitutor getResultingSubstitutor() {
return resultingSubstitutor; return resultingSubstitutor;
} }
public boolean upperBoundsAreSatisfied() {
for (TypeParameterDescriptor typeParameter : typeParameterConstraints.keySet()) {
JetType type = ConstraintsUtil.getValue(getTypeConstraints(typeParameter));
JetType upperBound = typeParameter.getUpperBoundsAsType();
JetType substitute = getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT);
if (type != null) {
if (substitute == null || !JetTypeChecker.INSTANCE.isSubtypeOf(type, substitute)) {
return false;
}
}
}
return true;
}
} }
@@ -150,4 +150,19 @@ public class ConstraintsUtil {
} }
return true; return true;
} }
public static boolean checkBoundsAreSatisfied(ConstraintsSystem constraintsSystem) {
for (TypeParameterDescriptor typeVariable : constraintsSystem.getTypeVariables()) {
JetType type = getValue(constraintsSystem.getTypeConstraints(typeVariable));
JetType upperBound = typeVariable.getUpperBoundsAsType();
JetType substitutedType = constraintsSystem.getResultingSubstitutor().substitute(upperBound, Variance.INVARIANT);
if (type != null) {
if (substitutedType == null || !JetTypeChecker.INSTANCE.isSubtypeOf(type, substitutedType)) {
return false;
}
}
}
return true;
}
} }
@@ -232,20 +232,20 @@ public class ExpressionTypingUtils {
@NotNull JetType receiverType, @NotNull JetType receiverType,
@NotNull CallableDescriptor receiverArgument @NotNull CallableDescriptor receiverArgument
) { ) {
ConstraintsSystemImpl constraintsBuilder = new ConstraintsSystemImpl(); ConstraintsSystem constraintsSystem = new ConstraintsSystemImpl();
for (TypeParameterDescriptor typeParameterDescriptor : receiverArgument.getTypeParameters()) { for (TypeParameterDescriptor typeParameterDescriptor : receiverArgument.getTypeParameters()) {
constraintsBuilder.registerTypeVariable(typeParameterDescriptor, Variance.INVARIANT); constraintsSystem.registerTypeVariable(typeParameterDescriptor, Variance.INVARIANT);
} }
ReceiverDescriptor receiverParameter = receiverArgument.getReceiverParameter(); ReceiverDescriptor receiverParameter = receiverArgument.getReceiverParameter();
if (expectedReceiver.exists() && receiverParameter.exists()) { if (expectedReceiver.exists() && receiverParameter.exists()) {
constraintsBuilder.addSubtypingConstraint(receiverType, receiverParameter.getType(), ConstraintPosition.RECEIVER_POSITION); constraintsSystem.addSubtypingConstraint(receiverType, receiverParameter.getType(), ConstraintPosition.RECEIVER_POSITION);
} }
else if (expectedReceiver.exists() || receiverParameter.exists()) { else if (expectedReceiver.exists() || receiverParameter.exists()) {
// Only one of receivers exist // Only one of receivers exist
return false; return false;
} }
return constraintsBuilder.isSuccessful() && constraintsBuilder.upperBoundsAreSatisfied(); return constraintsSystem.isSuccessful() && ConstraintsUtil.checkBoundsAreSatisfied(constraintsSystem);
} }
} }