Extensible specificity expressed as a type capability

This commit is contained in:
Andrey Breslav
2014-09-28 08:48:48 +04:00
parent 4b24c96cca
commit 013dd7261e
7 changed files with 89 additions and 19 deletions
@@ -25,9 +25,7 @@ import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.calls.model.MutableResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall;
import org.jetbrains.jet.lang.types.BoundsSubstitutor;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
@@ -240,21 +238,15 @@ public class OverloadingConflictResolver {
private boolean typeMoreSpecific(@NotNull JetType specific, @NotNull JetType general) {
boolean isSubtype = JetTypeChecker.DEFAULT.isSubtypeOf(specific, general) ||
numericTypeMoreSpecific(specific, general);
numericTypeMoreSpecific(specific, general);
if (!isSubtype) return false;
boolean specificIsFlexible = specific.isFlexible();
boolean generalIsFlexible = general.isFlexible();
if (specificIsFlexible && !generalIsFlexible) {
// Int! lessSpecific Int
// Int! >< Int?
Specificity.Relation sThanG = TypesPackage.getSpecificityRelationTo(specific, general);
Specificity.Relation gThanS = TypesPackage.getSpecificityRelationTo(general, specific);
if (sThanG == Specificity.Relation.LESS_SPECIFIC && gThanS != Specificity.Relation.LESS_SPECIFIC) {
return false;
}
else if (!specificIsFlexible && generalIsFlexible) {
// Int? >< Int!
if (specific.isNullable()) return false;
}
return true;
}