[Commonizer] Intern duplicated CirContainingClassDetails instances
This commit is contained in:
+1
-10
@@ -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
|
||||
|
||||
+14
-23
@@ -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(
|
||||
|
||||
+49
@@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+16
-26
@@ -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(
|
||||
|
||||
+1
-9
@@ -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!!),
|
||||
|
||||
+2
-2
@@ -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,
|
||||
|
||||
+7
-3
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user