[Commonizer] Apply interner to avoid duplicated CirAnnotation objects
This commit is contained in:
+8
-1
@@ -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) {
|
||||
|
||||
+2
-2
@@ -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
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
+2
-2
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-5
@@ -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,
|
||||
|
||||
+1
-1
@@ -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)
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user