From 36294352ef4b69c8d801d81b0444cbf451be7116 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 5 Mar 2021 00:11:36 +0300 Subject: [PATCH] [Commonizer] Encapsulate interning inside of CIR entities: CirClassType --- .../descriptors/commonizer/cir/CirType.kt | 59 +++++++++++++++++++ .../cir/factory/CirAnnotationFactory.kt | 2 +- .../commonizer/cir/factory/CirClassFactory.kt | 2 +- .../cir/factory/CirTypeAliasExpander.kt | 2 +- .../commonizer/cir/factory/CirTypeFactory.kt | 29 ++------- .../commonizer/cir/impl/CirClassTypeImpl.kt | 51 ---------------- .../commonizer/core/AnnotationsCommonizer.kt | 8 +-- .../commonizer/core/TypeCommonizer.kt | 4 +- .../commonizer/core/typeAliasUtils.kt | 2 +- .../descriptors/commonizer/utils/mocks.kt | 2 +- 10 files changed, 72 insertions(+), 89 deletions(-) delete mode 100644 native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassTypeImpl.kt diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt index 77d1223c1bb..f11f8b6aaa0 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirType.kt @@ -6,7 +6,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir import kotlinx.metadata.KmType +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner +import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode +import org.jetbrains.kotlin.descriptors.commonizer.utils.hashCode import org.jetbrains.kotlin.types.Variance typealias CirTypeSignature = String @@ -94,6 +97,26 @@ abstract class CirClassType : CirClassOrTypeAliasType(), CirHasVisibility { } super.appendDescriptionTo(builder, shortNameOnly = outerType != null) } + + companion object { + fun createInterned( + classId: CirEntityId, + outerType: CirClassType?, + visibility: Visibility, + arguments: List, + isMarkedNullable: Boolean + ): CirClassType = interner.intern( + CirClassTypeInternedImpl( + classifierId = classId, + outerType = outerType, + visibility = visibility, + arguments = arguments, + isMarkedNullable = isMarkedNullable + ) + ) + + private val interner = Interner() + } } /** @@ -130,3 +153,39 @@ private data class CirTypeParameterTypeInternedImpl( override val index: Int, override val isMarkedNullable: Boolean ) : CirTypeParameterType() + +private class CirClassTypeInternedImpl( + override val classifierId: CirEntityId, + override val outerType: CirClassType?, + override val visibility: Visibility, // visibility of the class descriptor + override val arguments: List, + override val isMarkedNullable: Boolean, +) : CirClassType() { + // See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode + private var cachedHashCode = 0 + + private fun computeHashCode() = hashCode(classifierId) + .appendHashCode(outerType) + .appendHashCode(visibility) + .appendHashCode(arguments) + .appendHashCode(isMarkedNullable) + + override fun hashCode(): Int { + var currentHashCode = cachedHashCode + if (currentHashCode != 0) return currentHashCode + + currentHashCode = computeHashCode() + cachedHashCode = currentHashCode + return currentHashCode + } + + override fun equals(other: Any?): Boolean = when { + other === this -> true + other is CirClassType -> classifierId == other.classifierId + && isMarkedNullable == other.isMarkedNullable + && visibility == other.visibility + && arguments == other.arguments + && outerType == other.outerType + else -> false + } +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt index 115e056fff2..bac77c889fe 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirAnnotationFactory.kt @@ -27,7 +27,7 @@ object CirAnnotationFactory { val classId = CirEntityId.create(source.className) val clazz: CirProvided.Class = typeResolver.resolveClassifier(classId) - val type = CirTypeFactory.createClassType( + val type = CirClassType.createInterned( classId = classId, outerType = null, // annotation class can't be inner class visibility = clazz.visibility, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt index 61122c57765..2f0b43e320f 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassFactory.kt @@ -59,7 +59,7 @@ object CirClassFactory { isInner = false, isExternal = false ).apply { - val enumClassType = CirTypeFactory.createClassType( + val enumClassType = CirClassType.createInterned( classId = enumClassId, outerType = null, visibility = decodeVisibility(enumClass.flags), diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeAliasExpander.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeAliasExpander.kt index 359ef087dcb..57b84ae3752 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeAliasExpander.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeAliasExpander.kt @@ -141,7 +141,7 @@ object CirTypeAliasExpander { makeNullableTypeIfNecessary(projection, argument) } - return CirTypeFactory.createClassType( + return CirClassType.createInterned( classId = type.classId, outerType = type.outerType?.let { expandClassType(expansion, it) }, visibility = clazz.visibility, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt index cadcfd55798..44367ec37f1 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirTypeFactory.kt @@ -8,9 +8,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.factory import gnu.trove.TIntObjectHashMap import kotlinx.metadata.* import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.commonizer.cir.* -import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirClassTypeImpl import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirTypeAliasTypeImpl import org.jetbrains.kotlin.descriptors.commonizer.core.computeExpandedType import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvided @@ -21,7 +19,7 @@ import org.jetbrains.kotlin.types.Variance object CirTypeFactory { object StandardTypes { - val ANY: CirClassType = createClassType( + val ANY: CirClassType = CirClassType.createInterned( classId = ANY_CLASS_ID, outerType = null, visibility = Visibilities.Public, @@ -30,7 +28,6 @@ object CirTypeFactory { ) } - private val classTypeInterner = Interner() private val typeAliasTypeInterner = Interner() fun create(source: KmType, typeResolver: CirTypeResolver): CirType { @@ -50,7 +47,7 @@ object CirTypeFactory { val clazz: CirProvided.Class = typeResolver.resolveClassifier(classId) - createClassType( + CirClassType.createInterned( classId = classId, outerType = outerType, visibility = clazz.visibility, @@ -83,24 +80,6 @@ object CirTypeFactory { } } - fun createClassType( - classId: CirEntityId, - outerType: CirClassType?, - visibility: Visibility, - arguments: List, - isMarkedNullable: Boolean - ): CirClassType { - return classTypeInterner.intern( - CirClassTypeImpl( - classifierId = classId, - outerType = outerType, - visibility = visibility, - arguments = arguments, - isMarkedNullable = isMarkedNullable - ) - ) - } - fun createTypeAliasType( typeAliasId: CirEntityId, underlyingType: CirClassOrTypeAliasType, @@ -122,7 +101,7 @@ object CirTypeFactory { return type val result = when (type) { - is CirClassType -> createClassType( + is CirClassType -> CirClassType.createInterned( classId = type.classifierId, outerType = type.outerType, visibility = type.visibility, @@ -182,7 +161,7 @@ object CirTypeFactory { if (!hasAbbreviationsInArguments && outerType == unabbreviatedOuterType) type else - createClassType( + CirClassType.createInterned( classId = type.classifierId, outerType = unabbreviatedOuterType, visibility = type.visibility, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassTypeImpl.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassTypeImpl.kt deleted file mode 100644 index 7e76c738269..00000000000 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirClassTypeImpl.kt +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.descriptors.commonizer.cir.impl - -import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassType -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirTypeProjection -import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode -import org.jetbrains.kotlin.descriptors.commonizer.utils.hashCode - -data class CirClassTypeImpl( - override val classifierId: CirEntityId, - override val outerType: CirClassType?, - override val visibility: Visibility, // visibility of the class descriptor - override val arguments: List, - override val isMarkedNullable: Boolean, -) : CirClassType() { - // See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode - private var cachedHashCode = 0 - - private fun computeHashCode() = hashCode(classifierId) - .appendHashCode(outerType) - .appendHashCode(visibility) - .appendHashCode(arguments) - .appendHashCode(isMarkedNullable) - - override fun hashCode(): Int { - var currentHashCode = cachedHashCode - if (currentHashCode != 0) return currentHashCode - - currentHashCode = computeHashCode() - cachedHashCode = currentHashCode - return currentHashCode - } - - override fun equals(other: Any?): Boolean = when { - other === this -> true - other is CirClassType -> { - classifierId == other.classifierId - && isMarkedNullable == other.isMarkedNullable - && visibility == other.visibility - && arguments == other.arguments - && outerType == other.outerType - } - else -> false - } -} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt index b3ba3023048..3209f5bf6af 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizer.kt @@ -6,12 +6,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirAnnotation -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirConstantValue +import org.jetbrains.kotlin.descriptors.commonizer.cir.* import org.jetbrains.kotlin.descriptors.commonizer.cir.CirConstantValue.* -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirEntityId -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName -import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirTypeFactory import org.jetbrains.kotlin.descriptors.commonizer.core.AnnotationsCommonizer.Companion.FALLBACK_MESSAGE import org.jetbrains.kotlin.descriptors.commonizer.utils.DEPRECATED_ANNOTATION_CLASS_ID import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap @@ -154,7 +150,7 @@ private class DeprecatedAnnotationCommonizer : Commonizer, isMarkedNullable: Boolean) = - CirTypeFactory.createClassType( + CirClassType.createInterned( classId = typeAliasId, outerType = null, // there can't be outer type visibility = commonClass.visibility, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/typeAliasUtils.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/typeAliasUtils.kt index 137fe439718..21b5a7d3bb3 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/typeAliasUtils.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/typeAliasUtils.kt @@ -40,7 +40,7 @@ private fun CirClassType.withCommonizedArguments(classifiers: CirKnownClassifier val newOuterType = existingOuterType?.let { it.withCommonizedArguments(classifiers) ?: return null } return if (newArguments !== existingArguments || newOuterType !== existingOuterType) - CirTypeFactory.createClassType( + CirClassType.createInterned( classId = classifierId, outerType = newOuterType, visibility = visibility, diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt index 22556276776..adff0044ab5 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/mocks.kt @@ -38,7 +38,7 @@ internal fun mockTAType( internal fun mockClassType( classId: String, nullable: Boolean = false -): CirClassType = CirTypeFactory.createClassType( +): CirClassType = CirClassType.createInterned( classId = createValidClassifierId(classId), outerType = null, visibility = Visibilities.Public,