[Commonizer] Apply interner to avoid duplicated CirAnnotation objects

This commit is contained in:
Dmitriy Dolovov
2020-02-18 12:41:26 +07:00
parent c88ea2f2e6
commit 39125a75e7
8 changed files with 21 additions and 14 deletions
@@ -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<Name, ConstantValue<*>> = 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<CirAnnotation>()
fun create(original: AnnotationDescriptor): CirAnnotation = interner.intern(CirAnnotation(original))
}
}
internal fun checkSupportedInCommonization(constantValue: ConstantValue<*>, location: () -> String) {
@@ -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
@@ -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()
@@ -24,7 +24,7 @@ abstract class CirCommonFunctionOrProperty : CirFunctionOrProperty {
}
abstract class CirFunctionOrPropertyImpl<T : CallableMemberDescriptor>(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))
}
}
@@ -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,
@@ -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)
@@ -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
@@ -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