[Commonizer] Intern duplicated CirContainingClassDetails instances

This commit is contained in:
Dmitriy Dolovov
2020-06-19 16:17:39 +07:00
parent 63d549dfa1
commit 70ea53315d
7 changed files with 90 additions and 73 deletions
@@ -8,17 +8,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
// TODO: inline?
data class CirContainingClassDetails(
val kind: ClassKind,
override val modality: Modality,
val isData: Boolean
) : CirHasModality {
companion object {
val DOES_NOT_MATTER = CirContainingClassDetails(
kind = ClassKind.CLASS,
modality = Modality.FINAL,
isData = false
)
}
}
) : CirHasModality
@@ -7,34 +7,25 @@ package org.jetbrains.kotlin.descriptors.commonizer.cir.factory
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.*
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.CirClassConstructorImpl
object CirClassConstructorFactory {
fun create(source: ClassConstructorDescriptor): CirClassConstructor {
val containingClass: ClassDescriptor = source.containingDeclaration
return create(
annotations = source.annotations.map(CirAnnotationFactory::create),
typeParameters = source.typeParameters.mapNotNull { typeParameter ->
// save only type parameters that are contributed by the constructor itself
typeParameter.takeIf { it.containingDeclaration == source }?.let(CirTypeParameterFactory::create)
},
visibility = source.visibility,
containingClassDetails = CirContainingClassDetails(
kind = containingClass.kind,
modality = containingClass.modality,
isData = containingClass.isData
),
valueParameters = source.valueParameters.map(CirValueParameterFactory::create),
hasStableParameterNames = source.hasStableParameterNames(),
hasSynthesizedParameterNames = source.hasSynthesizedParameterNames(),
isPrimary = source.isPrimary,
kind = source.kind
)
}
fun create(source: ClassConstructorDescriptor): CirClassConstructor = create(
annotations = source.annotations.map(CirAnnotationFactory::create),
typeParameters = source.typeParameters.mapNotNull { typeParameter ->
// save only type parameters that are contributed by the constructor itself
typeParameter.takeIf { it.containingDeclaration == source }?.let(CirTypeParameterFactory::create)
},
visibility = source.visibility,
containingClassDetails = CirContainingClassDetailsFactory.create(source),
valueParameters = source.valueParameters.map(CirValueParameterFactory::create),
hasStableParameterNames = source.hasStableParameterNames(),
hasSynthesizedParameterNames = source.hasSynthesizedParameterNames(),
isPrimary = source.isPrimary,
kind = source.kind
)
@Suppress("NOTHING_TO_INLINE")
inline fun create(
@@ -0,0 +1,49 @@
/*
* 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.factory
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirContainingClassDetails
import org.jetbrains.kotlin.descriptors.commonizer.utils.Interner
object CirContainingClassDetailsFactory {
private val interner = Interner<CirContainingClassDetails>()
// speed optimization
val DOES_NOT_MATTER: CirContainingClassDetails = create(
kind = ClassKind.CLASS,
modality = Modality.FINAL,
isData = false
)
fun create(source: ClassConstructorDescriptor): CirContainingClassDetails = doCreate(source.containingDeclaration)
fun create(source: CallableMemberDescriptor): CirContainingClassDetails? {
val containingClass: ClassDescriptor = source.containingDeclaration as? ClassDescriptor ?: return null
return doCreate(containingClass)
}
@Suppress("NOTHING_TO_INLINE")
private inline fun doCreate(containingClass: ClassDescriptor): CirContainingClassDetails = create(
kind = containingClass.kind,
modality = containingClass.modality,
isData = containingClass.isData
)
fun create(
kind: ClassKind,
modality: Modality,
isData: Boolean
): CirContainingClassDetails {
return interner.intern(
CirContainingClassDetails(
kind = kind,
modality = modality,
isData = isData
)
)
}
}
@@ -12,32 +12,22 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name
object CirFunctionFactory {
fun create(source: SimpleFunctionDescriptor): CirFunction {
val containingClass: ClassDescriptor? = source.containingDeclaration as? ClassDescriptor
return create(
annotations = source.annotations.map(CirAnnotationFactory::create),
name = source.name.intern(),
typeParameters = source.typeParameters.map(CirTypeParameterFactory::create),
visibility = source.visibility,
modality = source.modality,
containingClassDetails = containingClass?.let {
CirContainingClassDetails(
kind = it.kind,
modality = it.modality,
isData = it.isData
)
},
valueParameters = source.valueParameters.map(CirValueParameterFactory::create),
hasStableParameterNames = source.hasStableParameterNames(),
hasSynthesizedParameterNames = source.hasSynthesizedParameterNames(),
isExternal = source.isExternal,
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
returnType = CirTypeFactory.create(source.returnType!!),
kind = source.kind,
modifiers = CirFunctionModifiersFactory.create(source),
)
}
fun create(source: SimpleFunctionDescriptor): CirFunction = create(
annotations = source.annotations.map(CirAnnotationFactory::create),
name = source.name.intern(),
typeParameters = source.typeParameters.map(CirTypeParameterFactory::create),
visibility = source.visibility,
modality = source.modality,
containingClassDetails = CirContainingClassDetailsFactory.create(source),
valueParameters = source.valueParameters.map(CirValueParameterFactory::create),
hasStableParameterNames = source.hasStableParameterNames(),
hasSynthesizedParameterNames = source.hasSynthesizedParameterNames(),
isExternal = source.isExternal,
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
returnType = CirTypeFactory.create(source.returnType!!),
kind = source.kind,
modifiers = CirFunctionModifiersFactory.create(source),
)
@Suppress("NOTHING_TO_INLINE")
inline fun create(
@@ -24,21 +24,13 @@ object CirPropertyFactory {
)
}
val containingClass: ClassDescriptor? = source.containingDeclaration as? ClassDescriptor
return create(
annotations = source.annotations.map(CirAnnotationFactory::create),
name = source.name.intern(),
typeParameters = source.typeParameters.map(CirTypeParameterFactory::create),
visibility = source.visibility,
modality = source.modality,
containingClassDetails = containingClass?.let {
CirContainingClassDetails(
kind = it.kind,
modality = it.modality,
isData = it.isData
)
},
containingClassDetails = CirContainingClassDetailsFactory.create(source),
isExternal = source.isExternal,
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
returnType = CirTypeFactory.create(source.returnType!!),
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassConstructor
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirContainingClassDetails
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirClassConstructorFactory
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirContainingClassDetailsFactory
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirClassifiersCache
class ClassConstructorCommonizer(cache: CirClassifiersCache) : AbstractStandardCommonizer<CirClassConstructor, CirClassConstructor>() {
@@ -25,7 +25,7 @@ class ClassConstructorCommonizer(cache: CirClassifiersCache) : AbstractStandardC
annotations = emptyList(),
typeParameters = typeParameters.result,
visibility = visibility.result,
containingClassDetails = CirContainingClassDetails.DOES_NOT_MATTER,
containingClassDetails = CirContainingClassDetailsFactory.DOES_NOT_MATTER,
valueParameters = valueParameters.result,
hasStableParameterNames = hasStableParameterNames,
hasSynthesizedParameterNames = hasSynthesizedParameterNames,
@@ -9,9 +9,9 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities.*
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirContainingClassDetails
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionOrProperty
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirHasVisibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirContainingClassDetailsFactory
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.unsupported
import org.junit.Test
@@ -50,8 +50,12 @@ abstract class LoweringVisibilityCommonizerTest(
override val typeParameters get() = unsupported()
override val visibility = this@toMock
override val modality get() = if (areMembersVirtual) Modality.OPEN else Modality.FINAL
override val containingClassDetails =
if (areMembersVirtual) CirContainingClassDetails(kind = ClassKind.CLASS, modality = Modality.OPEN, isData = false) else null
override val containingClassDetails = if (areMembersVirtual)
CirContainingClassDetailsFactory.create(
kind = ClassKind.CLASS,
modality = Modality.OPEN,
isData = false
) else null
override val isExternal get() = unsupported()
override val extensionReceiver get() = unsupported()
override val returnType get() = unsupported()