JetTypeChecker refactored: duplicate methods replaced by instance management

This commit is contained in:
Andrey Breslav
2014-06-23 15:39:46 +04:00
parent cd28b216c1
commit 97b7768890
2 changed files with 19 additions and 25 deletions
@@ -165,7 +165,7 @@ public class OverridingUtil {
if (superReturnType != null && subReturnType != null) {
boolean bothErrors = subReturnType.isError() && superReturnType.isError();
if (!bothErrors && !JetTypeChecker.DEFAULT.isSubtypeOf(subReturnType, superReturnType, localEqualityAxioms)) {
if (!bothErrors && !JetTypeChecker.withAxioms(localEqualityAxioms).isSubtypeOf(subReturnType, superReturnType)) {
return OverrideCompatibilityInfo.returnTypeMismatch(superReturnType, subReturnType);
}
}
@@ -203,7 +203,7 @@ public class OverridingUtil {
@NotNull JetTypeChecker.TypeConstructorEquality axioms
) {
boolean bothErrors = typeInSuper.isError() && typeInSub.isError();
if (!bothErrors && !JetTypeChecker.DEFAULT.equalTypes(typeInSuper, typeInSub, axioms)) {
if (!bothErrors && !JetTypeChecker.withAxioms(axioms).equalTypes(typeInSuper, typeInSub)) {
return false;
}
return true;
@@ -22,39 +22,33 @@ import org.jetbrains.jet.lang.types.TypeConstructor;
public class JetTypeChecker {
public static final JetTypeChecker DEFAULT = new JetTypeChecker();
public interface TypeConstructorEquality {
boolean equals(@NotNull TypeConstructor a, @NotNull TypeConstructor b);
}
private JetTypeChecker() {
}
public boolean isSubtypeOf(@NotNull JetType subtype, @NotNull JetType supertype) {
return TYPE_CHECKER.isSubtypeOf(subtype, supertype);
}
public boolean isSubtypeOf(@NotNull JetType subtype, @NotNull JetType supertype, @NotNull TypeConstructorEquality equalityAxioms) {
return createWithAxioms(equalityAxioms).isSubtypeOf(subtype, supertype);
}
public boolean equalTypes(@NotNull JetType a, @NotNull JetType b) {
return TYPE_CHECKER.equalTypes(a, b);
}
public boolean equalTypes(@NotNull JetType a, @NotNull JetType b, @NotNull TypeConstructorEquality equalityAxioms) {
return createWithAxioms(equalityAxioms).equalTypes(a, b);
}
public static final JetTypeChecker DEFAULT = new JetTypeChecker(new TypeCheckingProcedure(new TypeCheckerTypingConstraints()));
@NotNull
private static TypeCheckingProcedure createWithAxioms(@NotNull final TypeConstructorEquality equalityAxioms) {
return new TypeCheckingProcedure(new TypeCheckerTypingConstraints() {
public static JetTypeChecker withAxioms(@NotNull final TypeConstructorEquality equalityAxioms) {
return new JetTypeChecker(new TypeCheckingProcedure(new TypeCheckerTypingConstraints() {
@Override
public boolean assertEqualTypeConstructors(@NotNull TypeConstructor constructor1, @NotNull TypeConstructor constructor2) {
return constructor1.equals(constructor2) || equalityAxioms.equals(constructor1, constructor2);
}
});
}));
}
private static final TypeCheckingProcedure TYPE_CHECKER = new TypeCheckingProcedure(new TypeCheckerTypingConstraints());
private final TypeCheckingProcedure procedure;
private JetTypeChecker(@NotNull TypeCheckingProcedure procedure) {
this.procedure = procedure;
}
public boolean isSubtypeOf(@NotNull JetType subtype, @NotNull JetType supertype) {
return procedure.isSubtypeOf(subtype, supertype);
}
public boolean equalTypes(@NotNull JetType a, @NotNull JetType b) {
return procedure.equalTypes(a, b);
}
}