From 3012839f499403b085547d6c4a5a403641d3b06a Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Thu, 4 Mar 2021 13:33:58 +0300 Subject: [PATCH] [Commonizer] Encapsulate interning inside of CIR entities: CirAnnotation --- .../commonizer/cir/CirAnnotation.kt | 51 +++++++++++++++++++ .../cir/factory/CirAnnotationFactory.kt | 22 +------- .../commonizer/cir/impl/CirAnnotationImpl.kt | 44 ---------------- .../commonizer/core/AnnotationsCommonizer.kt | 5 +- .../core/AnnotationsCommonizerTest.kt | 3 +- 5 files changed, 56 insertions(+), 69 deletions(-) delete mode 100644 native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt index f7711863c73..691290b948e 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirAnnotation.kt @@ -5,8 +5,59 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir +import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner +import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode +import org.jetbrains.kotlin.descriptors.commonizer.utils.hashCode + interface CirAnnotation { val type: CirClassType val constantValueArguments: Map> val annotationValueArguments: Map + + companion object { + fun createInterned( + type: CirClassType, + constantValueArguments: Map>, + annotationValueArguments: Map + ): CirAnnotation = interner.intern( + CirAnnotationInternedImpl( + type = type, + constantValueArguments = constantValueArguments, + annotationValueArguments = annotationValueArguments + ) + ) + + private val interner = Interner() + } +} + +private data class CirAnnotationInternedImpl( + override val type: CirClassType, + override val constantValueArguments: Map>, + override val annotationValueArguments: Map +) : CirAnnotation { + // See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode + private var cachedHashCode = 0 + + private fun computeHashCode() = hashCode(type) + .appendHashCode(constantValueArguments) + .appendHashCode(annotationValueArguments) + + override fun hashCode(): Int { + var currentHashCode = cachedHashCode + if (currentHashCode != 0) return currentHashCode + + currentHashCode = computeHashCode() + cachedHashCode = currentHashCode + return currentHashCode + } + + override fun equals(other: Any?): Boolean { + if (other === this) return true + + return other is CirAnnotation + && type == other.type + && constantValueArguments == other.constantValueArguments + && annotationValueArguments == other.annotationValueArguments + } } 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 6aa9215f04e..fdf3eb62689 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 @@ -11,15 +11,11 @@ import kotlinx.metadata.Flags import kotlinx.metadata.KmAnnotation import kotlinx.metadata.KmAnnotationArgument import org.jetbrains.kotlin.descriptors.commonizer.cir.* -import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirAnnotationImpl import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirProvided -import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner import org.jetbrains.kotlin.descriptors.commonizer.utils.compact import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap object CirAnnotationFactory { - private val interner = Interner() - fun createAnnotations(flags: Flags, typeResolver: CirTypeResolver, annotations: () -> List): List { return if (!Flag.Common.HAS_ANNOTATIONS(flags)) emptyList() @@ -49,7 +45,7 @@ object CirAnnotationFactory { val allValueArguments: Map> = source.arguments if (allValueArguments.isEmpty()) - return create(type = type, constantValueArguments = emptyMap(), annotationValueArguments = emptyMap()) + return CirAnnotation.createInterned(type = type, constantValueArguments = emptyMap(), annotationValueArguments = emptyMap()) val constantValueArguments: MutableMap> = THashMap(allValueArguments.size) val annotationValueArguments: MutableMap = THashMap(allValueArguments.size) @@ -66,24 +62,10 @@ object CirAnnotationFactory { ) } - return create( + return CirAnnotation.createInterned( type = type, constantValueArguments = constantValueArguments.compact(), annotationValueArguments = annotationValueArguments.compact() ) } - - fun create( - type: CirClassType, - constantValueArguments: Map>, - annotationValueArguments: Map - ): CirAnnotation { - return interner.intern( - CirAnnotationImpl( - type = type, - constantValueArguments = constantValueArguments, - annotationValueArguments = annotationValueArguments - ) - ) - } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt deleted file mode 100644 index 39f028635d8..00000000000 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/impl/CirAnnotationImpl.kt +++ /dev/null @@ -1,44 +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.commonizer.cir.CirAnnotation -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassType -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirConstantValue -import org.jetbrains.kotlin.descriptors.commonizer.cir.CirName -import org.jetbrains.kotlin.descriptors.commonizer.utils.appendHashCode -import org.jetbrains.kotlin.descriptors.commonizer.utils.hashCode - -data class CirAnnotationImpl( - override val type: CirClassType, - override val constantValueArguments: Map>, - override val annotationValueArguments: Map -) : CirAnnotation { - // See also org.jetbrains.kotlin.types.KotlinType.cachedHashCode - private var cachedHashCode = 0 - - private fun computeHashCode() = hashCode(type) - .appendHashCode(constantValueArguments) - .appendHashCode(annotationValueArguments) - - override fun hashCode(): Int { - var currentHashCode = cachedHashCode - if (currentHashCode != 0) return currentHashCode - - currentHashCode = computeHashCode() - cachedHashCode = currentHashCode - return currentHashCode - } - - override fun equals(other: Any?): Boolean { - if (other === this) return true - - return other is CirAnnotation - && type == other.type - && constantValueArguments == other.constantValueArguments - && annotationValueArguments == other.annotationValueArguments - } -} 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 ab879f8e7b0..b3ba3023048 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 @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirConstantValue 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.CirAnnotationFactory 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 @@ -74,7 +73,7 @@ private class DeprecatedAnnotationCommonizer : Commonizer): CirAnnotation = - CirAnnotationFactory.create( + CirAnnotation.createInterned( type = REPLACE_WITH_ANNOTATION_TYPE, constantValueArguments = compactMapOf( PROPERTY_NAME_EXPRESSION, StringValue(expression), diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt index ca761bc03fe..c509be5cabe 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/AnnotationsCommonizerTest.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.cir.CirConstantValue 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.CirAnnotationFactory import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType import org.junit.Test import kotlin.DeprecationLevel.* @@ -284,7 +283,7 @@ private fun mockAnnotation( classId: String, constantValueArguments: Map> = emptyMap(), annotationValueArguments: Map = emptyMap() -): CirAnnotation = CirAnnotationFactory.create( +): CirAnnotation = CirAnnotation.createInterned( type = mockClassType(classId), constantValueArguments = constantValueArguments, annotationValueArguments = annotationValueArguments