From 39125a75e7f3e4fab18277a0c305e8b509395bb8 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Tue, 18 Feb 2020 12:41:26 +0700 Subject: [PATCH] [Commonizer] Apply interner to avoid duplicated CirAnnotation objects --- .../commonizer/mergedtree/ir/CirAnnotation.kt | 9 ++++++++- .../descriptors/commonizer/mergedtree/ir/CirClass.kt | 4 ++-- .../commonizer/mergedtree/ir/CirFunction.kt | 2 +- .../commonizer/mergedtree/ir/CirFunctionOrProperty.kt | 4 ++-- .../commonizer/mergedtree/ir/CirProperty.kt | 10 +++++----- .../descriptors/commonizer/mergedtree/ir/CirType.kt | 2 +- .../commonizer/mergedtree/ir/CirTypeAlias.kt | 2 +- .../commonizer/mergedtree/ir/CirTypeParameter.kt | 2 +- 8 files changed, 21 insertions(+), 14 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt index 2248d32287f..8a266468b82 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirAnnotation.kt @@ -6,12 +6,13 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.descriptors.commonizer.utils.NonThreadSafeInterner import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.* -class CirAnnotation(original: AnnotationDescriptor) { +class CirAnnotation private constructor(original: AnnotationDescriptor) { val fqName: FqName = original.fqName?.intern() ?: error("Annotation with no FQ name: ${original::class.java}, $original") val allValueArguments: Map> = original.allValueArguments.mapKeys { it.key.intern() } @@ -40,6 +41,12 @@ class CirAnnotation(original: AnnotationDescriptor) { fqName == other.fqName && allValueArguments == other.allValueArguments } else false + + companion object { + private val interner = NonThreadSafeInterner() + + fun create(original: AnnotationDescriptor): CirAnnotation = interner.intern(CirAnnotation(original)) + } } internal fun checkSupportedInCommonization(constantValue: ConstantValue<*>, location: () -> String) { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt index 7e08a068c0c..c565c3fe5b9 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirClass.kt @@ -63,7 +63,7 @@ data class CirCommonClassConstructor( } class CirClassImpl(original: ClassDescriptor) : CirClass { - override val annotations = original.annotations.map(::CirAnnotation) + override val annotations = original.annotations.map(CirAnnotation.Companion::create) override val name = original.name.intern() override val typeParameters = original.declaredTypeParameters.map(::CirTypeParameterImpl) override val companion = original.companionObjectDescriptor?.fqNameSafe?.intern() @@ -84,7 +84,7 @@ class CirClassConstructorImpl(original: ClassConstructorDescriptor) : CirClassCo override val containingClassKind = original.containingDeclaration.kind override val containingClassModality = original.containingDeclaration.modality override val containingClassIsData = original.containingDeclaration.isData - override val annotations = original.annotations.map(::CirAnnotation) + override val annotations = original.annotations.map(CirAnnotation.Companion::create) override val visibility = original.visibility override val typeParameters = original.typeParameters.mapNotNull { typeParameter -> // save only type parameters that are contributed by the constructor itself diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunction.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunction.kt index 29ffb185254..44b7aab704c 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunction.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunction.kt @@ -74,7 +74,7 @@ data class CirCommonValueParameter( class CirValueParameterImpl(original: ValueParameterDescriptor) : CirValueParameter { override val name = original.name.intern() - override val annotations = original.annotations.map(::CirAnnotation) + override val annotations = original.annotations.map(CirAnnotation.Companion::create) override val returnType = CirType.create(original.returnType!!) override val varargElementType = original.varargElementType?.let(CirType.Companion::create) override val declaresDefaultValue = original.declaresDefaultValue() diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunctionOrProperty.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunctionOrProperty.kt index 002a0950031..ecc872fef57 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunctionOrProperty.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirFunctionOrProperty.kt @@ -24,7 +24,7 @@ abstract class CirCommonFunctionOrProperty : CirFunctionOrProperty { } abstract class CirFunctionOrPropertyImpl(original: T) : CirFunctionOrProperty { - final override val annotations = original.annotations.map(::CirAnnotation) + final override val annotations = original.annotations.map(CirAnnotation.Companion::create) final override val name = original.name.intern() final override val modality = original.modality final override val visibility = original.visibility @@ -51,7 +51,7 @@ data class CirExtensionReceiver( ) { companion object { fun CirType.toReceiverNoAnnotations() = CirExtensionReceiver( /* TODO: commonize annotations, KT-34234 */ emptyList(), this) - fun ReceiverParameterDescriptor.toReceiver() = CirExtensionReceiver(annotations.map(::CirAnnotation), CirType.create(type)) + fun ReceiverParameterDescriptor.toReceiver() = CirExtensionReceiver(annotations.map(CirAnnotation.Companion::create), CirType.create(type)) } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirProperty.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirProperty.kt index b17c8bb39f2..426b870ebf4 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirProperty.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirProperty.kt @@ -51,8 +51,8 @@ class CirPropertyImpl(original: PropertyDescriptor) : CirFunctionOrPropertyImpl< override val isDelegate = @Suppress("DEPRECATION") original.isDelegated override val getter = original.getter?.toGetter() override val setter = original.setter?.toSetter() - override val backingFieldAnnotations = original.backingField?.annotations?.map(::CirAnnotation) - override val delegateFieldAnnotations = original.delegateField?.annotations?.map(::CirAnnotation) + override val backingFieldAnnotations = original.backingField?.annotations?.map(CirAnnotation.Companion::create) + override val delegateFieldAnnotations = original.delegateField?.annotations?.map(CirAnnotation.Companion::create) override val compileTimeInitializer = original.compileTimeInitializer init { @@ -82,7 +82,7 @@ data class CirGetter( if (isDefault && annotations.isEmpty()) DEFAULT_NO_ANNOTATIONS else - CirGetter(annotations.map(::CirAnnotation), isDefault, isExternal, isInline) + CirGetter(annotations.map(CirAnnotation.Companion::create), isDefault, isExternal, isInline) } } @@ -105,8 +105,8 @@ data class CirSetter( ) fun PropertySetterDescriptor.toSetter() = CirSetter( - annotations.map(::CirAnnotation), - valueParameters.single().annotations.map(::CirAnnotation), + annotations.map(CirAnnotation.Companion::create), + valueParameters.single().annotations.map(CirAnnotation.Companion::create), visibility, isDefault, isExternal, diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt index 0d90f0654d4..ea2fd45add3 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt @@ -48,7 +48,7 @@ class CirSimpleType private constructor(original: SimpleType) : CirType() { val abbreviation = (original as? AbbreviatedType)?.abbreviation ?: original val expanded = (original as? AbbreviatedType)?.expandedType ?: original - annotations = abbreviation.annotations.map(::CirAnnotation) + annotations = abbreviation.annotations.map(CirAnnotation.Companion::create) kind = CirSimpleTypeKind.determineKind(abbreviation.declarationDescriptor) fqName = abbreviation.fqNameInterned arguments = abbreviation.arguments.map(::CirTypeProjection) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeAlias.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeAlias.kt index aa259ef928a..c08f7e9c3b3 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeAlias.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeAlias.kt @@ -14,7 +14,7 @@ interface CirTypeAlias : CirAnnotatedDeclaration, CirNamedDeclaration, CirDeclar } class CirTypeAliasImpl(original: TypeAliasDescriptor) : CirTypeAlias { - override val annotations = original.annotations.map(::CirAnnotation) + override val annotations = original.annotations.map(CirAnnotation.Companion::create) override val name = original.name.intern() override val typeParameters = original.declaredTypeParameters.map(::CirTypeParameterImpl) override val visibility = original.visibility diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeParameter.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeParameter.kt index d48eccc2a8f..e8018a8c0d2 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeParameter.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirTypeParameter.kt @@ -28,7 +28,7 @@ data class CirCommonTypeParameter( } class CirTypeParameterImpl(original: TypeParameterDescriptor) : CirTypeParameter { - override val annotations = original.annotations.map(::CirAnnotation) + override val annotations = original.annotations.map(CirAnnotation.Companion::create) override val name = original.name.intern() override val isReified = original.isReified override val variance = original.variance