diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirContainingClassDetails.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirContainingClassDetails.kt index c642b9fe96b..1df89347124 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirContainingClassDetails.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/CirContainingClassDetails.kt @@ -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 diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassConstructorFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassConstructorFactory.kt index 7e57d2166fc..b148104428f 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassConstructorFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirClassConstructorFactory.kt @@ -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( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirContainingClassDetailsFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirContainingClassDetailsFactory.kt new file mode 100644 index 00000000000..b493a70c9ec --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirContainingClassDetailsFactory.kt @@ -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() + + // 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 + ) + ) + } +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt index 335bd9e68bc..c240971347c 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirFunctionFactory.kt @@ -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( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPropertyFactory.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPropertyFactory.kt index 6d4f212c8b8..e4d02805d3a 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPropertyFactory.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cir/factory/CirPropertyFactory.kt @@ -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!!), diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ClassConstructorCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ClassConstructorCommonizer.kt index 8eb217ea581..9b1eddb08b3 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ClassConstructorCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ClassConstructorCommonizer.kt @@ -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() { @@ -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, diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/LoweringVisibilityCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/LoweringVisibilityCommonizerTest.kt index 551a5ea8805..d60f9b7b9f4 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/LoweringVisibilityCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/LoweringVisibilityCommonizerTest.kt @@ -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()