diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt index 159ab4526a9..af4e5ee8bde 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/CollectionStubMethodGenerator.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.checker.KotlinTypeChecker +import org.jetbrains.kotlin.types.checker.KotlinTypeCheckerImpl import org.jetbrains.org.objectweb.asm.Opcodes.ACC_PUBLIC import org.jetbrains.org.objectweb.asm.Opcodes.ACC_SYNTHETIC import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter @@ -296,7 +297,7 @@ class CollectionStubMethodGenerator( } } -private val READ_ONLY_ARE_EQUAL_TO_MUTABLE_TYPE_CHECKER = KotlinTypeChecker.withAxioms { x, y -> +private val READ_ONLY_ARE_EQUAL_TO_MUTABLE_TYPE_CHECKER = KotlinTypeCheckerImpl.withAxioms { x, y -> val firstClass = x.declarationDescriptor as? ClassDescriptor ?: return@withAxioms x == y val secondClass = y.declarationDescriptor as? ClassDescriptor ?: return@withAxioms x == y diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java index 09ce9befb95..577c7ee0a7c 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.types.FlexibleTypesKt; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeConstructor; import org.jetbrains.kotlin.types.checker.KotlinTypeChecker; +import org.jetbrains.kotlin.types.checker.KotlinTypeCheckerImpl; import org.jetbrains.kotlin.utils.SmartSet; import java.util.*; @@ -220,14 +221,14 @@ public class OverridingUtil { ) { assert firstParameters.size() == secondParameters.size() : "Should be the same number of type parameters: " + firstParameters + " vs " + secondParameters; - if (firstParameters.isEmpty()) return KotlinTypeChecker.withAxioms(equalityAxioms); + if (firstParameters.isEmpty()) return KotlinTypeCheckerImpl.withAxioms(equalityAxioms); final Map matchingTypeConstructors = new HashMap(); for (int i = 0; i < firstParameters.size(); i++) { matchingTypeConstructors.put(firstParameters.get(i).getTypeConstructor(), secondParameters.get(i).getTypeConstructor()); } - return KotlinTypeChecker.withAxioms(new KotlinTypeChecker.TypeConstructorEquality() { + return KotlinTypeCheckerImpl.withAxioms(new KotlinTypeChecker.TypeConstructorEquality() { @Override public boolean equals(@NotNull TypeConstructor a, @NotNull TypeConstructor b) { if (equalityAxioms.equals(a, b)) return true; diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeChecker.java b/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeChecker.java index c6139d20cb9..90f37d6f30e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeChecker.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeChecker.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,49 +20,29 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeConstructor; -public class KotlinTypeChecker { +public interface KotlinTypeChecker { - public interface TypeConstructorEquality { + interface TypeConstructorEquality { boolean equals(@NotNull TypeConstructor a, @NotNull TypeConstructor b); } - public static final KotlinTypeChecker DEFAULT = new KotlinTypeChecker(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl())); + KotlinTypeChecker DEFAULT = new KotlinTypeCheckerImpl(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl())); - public static final KotlinTypeChecker ERROR_TYPES_ARE_EQUAL_TO_ANYTHING = new KotlinTypeChecker(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl() { + KotlinTypeChecker ERROR_TYPES_ARE_EQUAL_TO_ANYTHING = new KotlinTypeCheckerImpl(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl() { @Override public boolean assertEqualTypes(@NotNull KotlinType a, @NotNull KotlinType b, @NotNull TypeCheckingProcedure typeCheckingProcedure) { return a.isError() || b.isError() || super.assertEqualTypes(a, b, typeCheckingProcedure); } })); - public static final KotlinTypeChecker FLEXIBLE_UNEQUAL_TO_INFLEXIBLE = new KotlinTypeChecker(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl()) { + KotlinTypeChecker FLEXIBLE_UNEQUAL_TO_INFLEXIBLE = new KotlinTypeCheckerImpl(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl()) { @Override protected boolean heterogeneousEquivalence(KotlinType inflexibleType, KotlinType flexibleType) { return false; } }); - @NotNull - public static KotlinTypeChecker withAxioms(@NotNull final TypeConstructorEquality equalityAxioms) { - return new KotlinTypeChecker(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl() { - @Override - public boolean assertEqualTypeConstructors(@NotNull TypeConstructor constructor1, @NotNull TypeConstructor constructor2) { - return constructor1.equals(constructor2) || equalityAxioms.equals(constructor1, constructor2); - } - })); - } - private final TypeCheckingProcedure procedure; - - private KotlinTypeChecker(@NotNull TypeCheckingProcedure procedure) { - this.procedure = procedure; - } - - public boolean isSubtypeOf(@NotNull KotlinType subtype, @NotNull KotlinType supertype) { - return procedure.isSubtypeOf(subtype, supertype); - } - - public boolean equalTypes(@NotNull KotlinType a, @NotNull KotlinType b) { - return procedure.equalTypes(a, b); - } + boolean isSubtypeOf(@NotNull KotlinType subtype, @NotNull KotlinType supertype); + boolean equalTypes(@NotNull KotlinType a, @NotNull KotlinType b); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeCheckerImpl.java b/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeCheckerImpl.java new file mode 100644 index 00000000000..8aa9e83856f --- /dev/null +++ b/core/descriptors/src/org/jetbrains/kotlin/types/checker/KotlinTypeCheckerImpl.java @@ -0,0 +1,52 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.types.checker; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.types.KotlinType; +import org.jetbrains.kotlin.types.TypeConstructor; + +public class KotlinTypeCheckerImpl implements KotlinTypeChecker { + + + @NotNull + public static KotlinTypeChecker withAxioms(@NotNull final TypeConstructorEquality equalityAxioms) { + return new KotlinTypeCheckerImpl(new TypeCheckingProcedure(new TypeCheckerProcedureCallbacksImpl() { + @Override + public boolean assertEqualTypeConstructors(@NotNull TypeConstructor constructor1, @NotNull TypeConstructor constructor2) { + return constructor1.equals(constructor2) || equalityAxioms.equals(constructor1, constructor2); + } + })); + } + + private final TypeCheckingProcedure procedure; + + protected KotlinTypeCheckerImpl(@NotNull TypeCheckingProcedure procedure) { + this.procedure = procedure; + } + + @Override + public boolean isSubtypeOf(@NotNull KotlinType subtype, @NotNull KotlinType supertype) { + return procedure.isSubtypeOf(subtype, supertype); + } + + @Override + public boolean equalTypes(@NotNull KotlinType a, @NotNull KotlinType b) { + return procedure.equalTypes(a, b); + } + +} diff --git a/idea/ide-common/src/org/jetbrains/kotlin/util/descriptorUtils.kt b/idea/ide-common/src/org/jetbrains/kotlin/util/descriptorUtils.kt index c7cabcdbec6..6bfe3d22295 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/util/descriptorUtils.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/util/descriptorUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. + * Copyright 2010-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.checker.KotlinTypeChecker +import org.jetbrains.kotlin.types.checker.KotlinTypeCheckerImpl import org.jetbrains.kotlin.types.typeUtil.equalTypesOrNulls fun descriptorsEqualWithSubstitution(descriptor1: DeclarationDescriptor?, descriptor2: DeclarationDescriptor?): Boolean { @@ -32,7 +33,7 @@ fun descriptorsEqualWithSubstitution(descriptor1: DeclarationDescriptor?, descri if (descriptor1 !is CallableDescriptor) return true descriptor2 as CallableDescriptor - val typeChecker = KotlinTypeChecker.withAxioms(object: KotlinTypeChecker.TypeConstructorEquality { + val typeChecker = KotlinTypeCheckerImpl.withAxioms(object: KotlinTypeChecker.TypeConstructorEquality { override fun equals(a: TypeConstructor, b: TypeConstructor): Boolean { val typeParam1 = a.declarationDescriptor as? TypeParameterDescriptor val typeParam2 = b.declarationDescriptor as? TypeParameterDescriptor