From 93031c12456fbdf8ed85812345674962468a2331 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 29 May 2014 21:23:08 +0400 Subject: [PATCH] OverridingUtil parameterized with equalityAxioms --- .../jet/lang/resolve/OverridingUtil.java | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java index fd21503bc2c..a27b51a88bb 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/OverridingUtil.java @@ -45,9 +45,22 @@ public class OverridingUtil { ExternalOverridabilityCondition.class.getClassLoader()).iterator() ); - public static final OverridingUtil DEFAULT = new OverridingUtil(); + public static final OverridingUtil DEFAULT = new OverridingUtil(new JetTypeChecker.TypeConstructorEquality() { + @Override + public boolean equals(@NotNull TypeConstructor a, @NotNull TypeConstructor b) { + return a.equals(b); + } + }); - private OverridingUtil() { + @NotNull + public static OverridingUtil createWithEqualityAxioms(@NotNull JetTypeChecker.TypeConstructorEquality equalityAxioms) { + return new OverridingUtil(equalityAxioms); + } + + private final JetTypeChecker.TypeConstructorEquality equalityAxioms; + + private OverridingUtil(JetTypeChecker.TypeConstructorEquality axioms) { + equalityAxioms = axioms; } @NotNull @@ -111,9 +124,10 @@ public class OverridingUtil { matchingTypeConstructors.put(superTypeParameter.getTypeConstructor(), subTypeParameter.getTypeConstructor()); } - JetTypeChecker.TypeConstructorEquality equalityAxioms = new JetTypeChecker.TypeConstructorEquality() { + JetTypeChecker.TypeConstructorEquality localEqualityAxioms = new JetTypeChecker.TypeConstructorEquality() { @Override public boolean equals(@NotNull TypeConstructor a, @NotNull TypeConstructor b) { + if (equalityAxioms.equals(a, b)) return true; TypeConstructor img1 = matchingTypeConstructors.get(a); TypeConstructor img2 = matchingTypeConstructors.get(b); if (!(img1 != null && img1.equals(b)) && @@ -128,7 +142,7 @@ public class OverridingUtil { TypeParameterDescriptor superTypeParameter = superTypeParameters.get(i); TypeParameterDescriptor subTypeParameter = subTypeParameters.get(i); - if (!JetTypeChecker.INSTANCE.equalTypes(superTypeParameter.getUpperBoundsAsType(), subTypeParameter.getUpperBoundsAsType(), equalityAxioms)) { + if (!JetTypeChecker.INSTANCE.equalTypes(superTypeParameter.getUpperBoundsAsType(), subTypeParameter.getUpperBoundsAsType(), localEqualityAxioms)) { return OverrideCompatibilityInfo.boundsMismatch(superTypeParameter, subTypeParameter); } } @@ -138,7 +152,7 @@ public class OverridingUtil { JetType subValueParameter = subValueParameters.get(i); boolean bothErrors = superValueParameter.isError() && subValueParameter.isError(); - if (!bothErrors && !JetTypeChecker.INSTANCE.equalTypes(superValueParameter, subValueParameter, equalityAxioms)) { + if (!bothErrors && !JetTypeChecker.INSTANCE.equalTypes(superValueParameter, subValueParameter, localEqualityAxioms)) { return OverrideCompatibilityInfo.valueParameterTypeMismatch(superValueParameter, subValueParameter, OverrideCompatibilityInfo.Result.INCOMPATIBLE); } }