[Commonizer] Apply interner to avoid duplicated Name objects

This commit is contained in:
Dmitriy Dolovov
2020-02-16 21:31:23 +07:00
parent 47d091702b
commit d0e9dc05b5
13 changed files with 28 additions and 16 deletions

View File

@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode.Cla
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildClassNode
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildTypeAliasNode
import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.NullableLazyValue
import org.jetbrains.kotlin.storage.StorageManager
@@ -33,7 +34,7 @@ internal fun mergeClasses(
clazz?.unsubstitutedMemberScope?.collectMembers(
PropertyCollector { propertiesMap[PropertyApproximationKey(it)][index] = it },
FunctionCollector { functionsMap[FunctionApproximationKey(it)][index] = it },
ClassCollector { classesMap[it.name][index] = it }
ClassCollector { classesMap[it.name.intern()][index] = it }
)
}

View File

@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.resolve.constants.*
class CirAnnotation(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
val allValueArguments: Map<Name, ConstantValue<*>> = original.allValueArguments.mapKeys { it.key.intern() }
init {
allValueArguments.forEach { (name, constantValue) ->

View File

@@ -64,7 +64,7 @@ data class CirCommonClassConstructor(
class CirClassImpl(original: ClassDescriptor) : CirClass {
override val annotations = original.annotations.map(::CirAnnotation)
override val name = original.name
override val name = original.name.intern()
override val typeParameters = original.declaredTypeParameters.map(::CirTypeParameterImpl)
override val companion = original.companionObjectDescriptor?.fqNameSafe?.intern()
override val kind = original.kind

View File

@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name
interface CirFunctionModifiers {
@@ -72,7 +73,7 @@ data class CirCommonValueParameter(
}
class CirValueParameterImpl(original: ValueParameterDescriptor) : CirValueParameter {
override val name = original.name
override val name = original.name.intern()
override val annotations = original.annotations.map(::CirAnnotation)
override val returnType = CirType.create(original.returnType!!)
override val varargElementType = original.varargElementType?.let(CirType.Companion::create)

View File

@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirExtensionReceiver.Companion.toReceiver
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
interface CirFunctionOrProperty : CirAnnotatedDeclaration, CirNamedDeclaration, CirDeclarationWithTypeParameters, CirDeclarationWithVisibility, CirDeclarationWithModality, CirMaybeCallableMemberOfClass {
val isExternal: Boolean
@@ -24,7 +25,7 @@ abstract class CirCommonFunctionOrProperty : CirFunctionOrProperty {
abstract class CirFunctionOrPropertyImpl<T : CallableMemberDescriptor>(original: T) : CirFunctionOrProperty {
final override val annotations = original.annotations.map(::CirAnnotation)
final override val name = original.name
final override val name = original.name.intern()
final override val modality = original.modality
final override val visibility = original.visibility
final override val isExternal = original.isExternal

View File

@@ -6,8 +6,9 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name
data class CirModule(val name: Name) : CirDeclaration {
constructor(descriptor: ModuleDescriptor) : this(descriptor.name)
constructor(descriptor: ModuleDescriptor) : this(descriptor.name.intern())
}

View File

@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
interface CirTypeAlias : CirAnnotatedDeclaration, CirNamedDeclaration, CirDeclarationWithTypeParameters, CirDeclarationWithVisibility {
val underlyingType: CirSimpleType
@@ -14,7 +15,7 @@ interface CirTypeAlias : CirAnnotatedDeclaration, CirNamedDeclaration, CirDeclar
class CirTypeAliasImpl(original: TypeAliasDescriptor) : CirTypeAlias {
override val annotations = original.annotations.map(::CirAnnotation)
override val name = original.name
override val name = original.name.intern()
override val typeParameters = original.declaredTypeParameters.map(::CirTypeParameterImpl)
override val visibility = original.visibility
override val underlyingType = CirSimpleType(original.underlyingType)

View File

@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.types.Variance
@@ -28,7 +29,7 @@ data class CirCommonTypeParameter(
class CirTypeParameterImpl(original: TypeParameterDescriptor) : CirTypeParameter {
override val annotations = original.annotations.map(::CirAnnotation)
override val name = original.name
override val name = original.name.intern()
override val isReified = original.isReified
override val variance = original.variance
override val upperBounds = original.upperBounds.map(CirType.Companion::create)

View File

@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.commonizer.core.Commonizer
import org.jetbrains.kotlin.descriptors.commonizer.utils.*
import org.jetbrains.kotlin.descriptors.commonizer.utils.fqNameWithTypeParameters
import org.jetbrains.kotlin.descriptors.commonizer.utils.isBlacklistedDarwinFunction
import org.jetbrains.kotlin.descriptors.commonizer.utils.isDeprecated
@@ -69,7 +70,7 @@ internal data class PropertyApproximationKey(
val extensionReceiverParameter: String?
) {
constructor(property: PropertyDescriptor) : this(
property.name,
property.name.intern(),
property.extensionReceiverParameter?.type?.fqNameWithTypeParameters
)
}
@@ -81,8 +82,8 @@ internal data class FunctionApproximationKey(
val extensionReceiverParameter: String?
) {
constructor(function: SimpleFunctionDescriptor) : this(
function.name,
function.valueParameters.map { it.name to it.type.fqNameWithTypeParameters },
function.name.intern(),
function.valueParameters.map { it.name.intern() to it.type.fqNameWithTypeParameters },
function.extensionReceiverParameter?.type?.fqNameWithTypeParameters
)
}
@@ -92,6 +93,6 @@ internal data class ConstructorApproximationKey(
val valueParameters: List<Pair<Name, String>>
) {
constructor(constructor: ConstructorDescriptor) : this(
constructor.valueParameters.map { it.name to it.type.fqNameWithTypeParameters }
constructor.valueParameters.map { it.name.intern() to it.type.fqNameWithTypeParameters }
)
}

View File

@@ -32,7 +32,7 @@ internal fun mergeModules(
}
}
val moduleName = modules.firstNonNull().name
val moduleName = modules.firstNonNull().name.intern()
for ((packageFqName, packageMemberScopesGroup) in packageMemberScopesMap) {
node.packages += mergePackages(storageManager, cacheRW, moduleName, packageFqName, packageMemberScopesGroup.toList())
}

View File

@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirPackageNode
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildPackageNode
import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap
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.scopes.MemberScope
@@ -36,8 +37,8 @@ internal fun mergePackages(
memberScope?.collectMembers(
PropertyCollector { propertiesMap[PropertyApproximationKey(it)][index] = it },
FunctionCollector { functionsMap[FunctionApproximationKey(it)][index] = it },
ClassCollector { classesMap[it.name][index] = it },
TypeAliasCollector { typeAliasesMap[it.name][index] = it }
ClassCollector { classesMap[it.name.intern()][index] = it },
TypeAliasCollector { typeAliasesMap[it.name.intern()][index] = it }
)
}

View File

@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.TargetProvider
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildRootNode
import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.StorageManager
@@ -23,7 +24,7 @@ internal fun mergeRoots(
targetProviders.forEachIndexed { index, targetProvider ->
for (module in targetProvider.modulesProvider.loadModules()) {
modulesMap[module.name][index] = module
modulesMap[module.name.intern()][index] = module
}
}

View File

@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeUtils
@@ -21,6 +22,7 @@ internal inline val KotlinType.fqNameInterned: FqName
get() = declarationDescriptor.fqNameSafe.intern()
internal fun FqName.intern(): FqName = fqNameInterner.intern(this)
internal fun Name.intern(): Name = nameInterner.intern(this)
internal val KotlinType.fqNameWithTypeParameters: String
get() {
@@ -75,3 +77,4 @@ private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, explor
private val stringInterner = NonThreadSafeInterner<String>()
private val fqNameInterner = NonThreadSafeInterner<FqName>()
private val nameInterner = NonThreadSafeInterner<Name>()