[Commonizer] Drop CirContainingClassdetails in favor of CirClass entity

This commit is contained in:
Dmitriy Dolovov
2021-02-05 22:40:36 +03:00
parent 054b59198b
commit 97000b1285
18 changed files with 62 additions and 103 deletions
@@ -5,14 +5,11 @@
package org.jetbrains.kotlin.descriptors.commonizer.cir package org.jetbrains.kotlin.descriptors.commonizer.cir
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface CirClass : CirClassifier, CirHasModality { interface CirClass : CirClassifier, CirContainingClass {
val kind: ClassKind
var companion: Name? // null means no companion object var companion: Name? // null means no companion object
val isCompanion: Boolean val isCompanion: Boolean
val isData: Boolean
val isInline: Boolean val isInline: Boolean
val isInner: Boolean val isInner: Boolean
val isExternal: Boolean val isExternal: Boolean
@@ -14,5 +14,5 @@ interface CirClassConstructor :
CirCallableMemberWithParameters { CirCallableMemberWithParameters {
val isPrimary: Boolean val isPrimary: Boolean
override val containingClassDetails: CirContainingClassDetails // non-nullable override val containingClass: CirContainingClass // non-nullable
} }
@@ -1,15 +0,0 @@
/*
* 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
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
data class CirContainingClassDetails(
val kind: ClassKind,
override val modality: Modality,
val isData: Boolean
) : CirHasModality
@@ -44,7 +44,15 @@ interface CirHasModality {
} }
interface CirMaybeCallableMemberOfClass { interface CirMaybeCallableMemberOfClass {
val containingClassDetails: CirContainingClassDetails? // null assumes no containing class val containingClass: CirContainingClass? // null assumes no containing class
}
/**
* A subset of containing [CirClass] visible to such class members as [CirFunction], [CirProperty] and [CirClassConstructor].
*/
interface CirContainingClass : CirHasModality {
val kind: ClassKind
val isData: Boolean
} }
interface CirHasTypeParameters { interface CirHasTypeParameters {
@@ -26,5 +26,5 @@ interface CirFunctionOrProperty :
fun isVirtual(): Boolean = fun isVirtual(): Boolean =
visibility != DescriptorVisibilities.PRIVATE visibility != DescriptorVisibilities.PRIVATE
&& modality != Modality.FINAL && modality != Modality.FINAL
&& !(containingClassDetails?.modality == Modality.FINAL && containingClassDetails?.kind != ClassKind.ENUM_CLASS) && !(containingClass?.modality == Modality.FINAL && containingClass?.kind != ClassKind.ENUM_CLASS)
} }
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap
import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMapNotNull import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMapNotNull
object CirClassConstructorFactory { object CirClassConstructorFactory {
fun create(source: ClassConstructorDescriptor): CirClassConstructor { fun create(source: ClassConstructorDescriptor, containingClass: CirContainingClass): CirClassConstructor {
check(source.kind == CallableMemberDescriptor.Kind.DECLARATION) { check(source.kind == CallableMemberDescriptor.Kind.DECLARATION) {
"Unexpected ${CallableMemberDescriptor.Kind::class.java} for class constructor $source, ${source::class.java}: ${source.kind}" "Unexpected ${CallableMemberDescriptor.Kind::class.java} for class constructor $source, ${source::class.java}: ${source.kind}"
} }
@@ -26,7 +26,7 @@ object CirClassConstructorFactory {
typeParameter.takeIf { it.containingDeclaration == source }?.let(CirTypeParameterFactory::create) typeParameter.takeIf { it.containingDeclaration == source }?.let(CirTypeParameterFactory::create)
}, },
visibility = source.visibility, visibility = source.visibility,
containingClassDetails = CirContainingClassDetailsFactory.create(source), containingClass = containingClass,
valueParameters = source.valueParameters.compactMap(CirValueParameterFactory::create), valueParameters = source.valueParameters.compactMap(CirValueParameterFactory::create),
hasStableParameterNames = source.hasStableParameterNames(), hasStableParameterNames = source.hasStableParameterNames(),
isPrimary = source.isPrimary isPrimary = source.isPrimary
@@ -38,7 +38,7 @@ object CirClassConstructorFactory {
annotations: List<CirAnnotation>, annotations: List<CirAnnotation>,
typeParameters: List<CirTypeParameter>, typeParameters: List<CirTypeParameter>,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
containingClassDetails: CirContainingClassDetails, containingClass: CirContainingClass,
valueParameters: List<CirValueParameter>, valueParameters: List<CirValueParameter>,
hasStableParameterNames: Boolean, hasStableParameterNames: Boolean,
isPrimary: Boolean isPrimary: Boolean
@@ -47,7 +47,7 @@ object CirClassConstructorFactory {
annotations = annotations, annotations = annotations,
typeParameters = typeParameters, typeParameters = typeParameters,
visibility = visibility, visibility = visibility,
containingClassDetails = containingClassDetails, containingClass = containingClass,
valueParameters = valueParameters, valueParameters = valueParameters,
hasStableParameterNames = hasStableParameterNames, hasStableParameterNames = hasStableParameterNames,
isPrimary = isPrimary isPrimary = isPrimary
@@ -1,49 +0,0 @@
/*
* 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
)
)
}
}
@@ -13,13 +13,13 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
object CirFunctionFactory { object CirFunctionFactory {
fun create(source: SimpleFunctionDescriptor): CirFunction = create( fun create(source: SimpleFunctionDescriptor, containingClass: CirContainingClass?): CirFunction = create(
annotations = source.annotations.compactMap(CirAnnotationFactory::create), annotations = source.annotations.compactMap(CirAnnotationFactory::create),
name = source.name.intern(), name = source.name.intern(),
typeParameters = source.typeParameters.compactMap(CirTypeParameterFactory::create), typeParameters = source.typeParameters.compactMap(CirTypeParameterFactory::create),
visibility = source.visibility, visibility = source.visibility,
modality = source.modality, modality = source.modality,
containingClassDetails = CirContainingClassDetailsFactory.create(source), containingClass = containingClass,
valueParameters = source.valueParameters.compactMap(CirValueParameterFactory::create), valueParameters = source.valueParameters.compactMap(CirValueParameterFactory::create),
hasStableParameterNames = source.hasStableParameterNames(), hasStableParameterNames = source.hasStableParameterNames(),
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create), extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
@@ -35,7 +35,7 @@ object CirFunctionFactory {
typeParameters: List<CirTypeParameter>, typeParameters: List<CirTypeParameter>,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
modality: Modality, modality: Modality,
containingClassDetails: CirContainingClassDetails?, containingClass: CirContainingClass?,
valueParameters: List<CirValueParameter>, valueParameters: List<CirValueParameter>,
hasStableParameterNames: Boolean, hasStableParameterNames: Boolean,
extensionReceiver: CirExtensionReceiver?, extensionReceiver: CirExtensionReceiver?,
@@ -49,7 +49,7 @@ object CirFunctionFactory {
typeParameters = typeParameters, typeParameters = typeParameters,
visibility = visibility, visibility = visibility,
modality = modality, modality = modality,
containingClassDetails = containingClassDetails, containingClass = containingClass,
valueParameters = valueParameters, valueParameters = valueParameters,
hasStableParameterNames = hasStableParameterNames, hasStableParameterNames = hasStableParameterNames,
extensionReceiver = extensionReceiver, extensionReceiver = extensionReceiver,
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.constants.ConstantValue import org.jetbrains.kotlin.resolve.constants.ConstantValue
object CirPropertyFactory { object CirPropertyFactory {
fun create(source: PropertyDescriptor): CirProperty { fun create(source: PropertyDescriptor, containingClass: CirContainingClass?): CirProperty {
val compileTimeInitializer: ConstantValue<*>? = source.compileTimeInitializer val compileTimeInitializer: ConstantValue<*>? = source.compileTimeInitializer
if (compileTimeInitializer != null) { if (compileTimeInitializer != null) {
checkConstantSupportedInCommonization( checkConstantSupportedInCommonization(
@@ -34,7 +34,7 @@ object CirPropertyFactory {
typeParameters = source.typeParameters.compactMap(CirTypeParameterFactory::create), typeParameters = source.typeParameters.compactMap(CirTypeParameterFactory::create),
visibility = source.visibility, visibility = source.visibility,
modality = source.modality, modality = source.modality,
containingClassDetails = CirContainingClassDetailsFactory.create(source), containingClass = containingClass,
isExternal = source.isExternal, isExternal = source.isExternal,
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create), extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
returnType = CirTypeFactory.create(source.returnType!!), returnType = CirTypeFactory.create(source.returnType!!),
@@ -58,7 +58,7 @@ object CirPropertyFactory {
typeParameters: List<CirTypeParameter>, typeParameters: List<CirTypeParameter>,
visibility: DescriptorVisibility, visibility: DescriptorVisibility,
modality: Modality, modality: Modality,
containingClassDetails: CirContainingClassDetails?, containingClass: CirContainingClass?,
isExternal: Boolean, isExternal: Boolean,
extensionReceiver: CirExtensionReceiver?, extensionReceiver: CirExtensionReceiver?,
returnType: CirType, returnType: CirType,
@@ -79,7 +79,7 @@ object CirPropertyFactory {
typeParameters = typeParameters, typeParameters = typeParameters,
visibility = visibility, visibility = visibility,
modality = modality, modality = modality,
containingClassDetails = containingClassDetails, containingClass = containingClass,
isExternal = isExternal, isExternal = isExternal,
extensionReceiver = extensionReceiver, extensionReceiver = extensionReceiver,
returnType = returnType, returnType = returnType,
@@ -12,7 +12,7 @@ data class CirClassConstructorImpl(
override val annotations: List<CirAnnotation>, override val annotations: List<CirAnnotation>,
override val typeParameters: List<CirTypeParameter>, override val typeParameters: List<CirTypeParameter>,
override val visibility: DescriptorVisibility, override val visibility: DescriptorVisibility,
override val containingClassDetails: CirContainingClassDetails, override val containingClass: CirContainingClass,
override var valueParameters: List<CirValueParameter>, override var valueParameters: List<CirValueParameter>,
override var hasStableParameterNames: Boolean, override var hasStableParameterNames: Boolean,
override val isPrimary: Boolean override val isPrimary: Boolean
@@ -17,7 +17,7 @@ data class CirFunctionImpl(
override val typeParameters: List<CirTypeParameter>, override val typeParameters: List<CirTypeParameter>,
override val visibility: DescriptorVisibility, override val visibility: DescriptorVisibility,
override val modality: Modality, override val modality: Modality,
override val containingClassDetails: CirContainingClassDetails?, override val containingClass: CirContainingClass?,
override var valueParameters: List<CirValueParameter>, override var valueParameters: List<CirValueParameter>,
override var hasStableParameterNames: Boolean, override var hasStableParameterNames: Boolean,
override val extensionReceiver: CirExtensionReceiver?, override val extensionReceiver: CirExtensionReceiver?,
@@ -18,7 +18,7 @@ data class CirPropertyImpl(
override val typeParameters: List<CirTypeParameter>, override val typeParameters: List<CirTypeParameter>,
override val visibility: DescriptorVisibility, override val visibility: DescriptorVisibility,
override val modality: Modality, override val modality: Modality,
override val containingClassDetails: CirContainingClassDetails?, override val containingClass: CirContainingClass?,
override val isExternal: Boolean, override val isExternal: Boolean,
override val extensionReceiver: CirExtensionReceiver?, override val extensionReceiver: CirExtensionReceiver?,
override val returnType: CirType, override val returnType: CirType,
@@ -30,7 +30,7 @@ abstract class AbstractFunctionOrPropertyCommonizer<T : CirFunctionOrProperty>(
override fun doCommonizeWith(next: T): Boolean = override fun doCommonizeWith(next: T): Boolean =
next.kind != DELEGATION // delegated members should not be commonized next.kind != DELEGATION // delegated members should not be commonized
&& (next.kind != SYNTHESIZED || next.containingClassDetails?.isData != true) // synthesized members of data classes should not be commonized && (next.kind != SYNTHESIZED || next.containingClass?.isData != true) // synthesized members of data classes should not be commonized
&& kind == next.kind && kind == next.kind
&& modality.commonizeWith(next.modality) && modality.commonizeWith(next.modality)
&& visibility.commonizeWith(next) && visibility.commonizeWith(next)
@@ -5,10 +5,11 @@
package org.jetbrains.kotlin.descriptors.commonizer.core package org.jetbrains.kotlin.descriptors.commonizer.core
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassConstructor import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassConstructor
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirContainingClass
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirClassConstructorFactory 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.CirKnownClassifiers import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirKnownClassifiers
class ClassConstructorCommonizer( class ClassConstructorCommonizer(
@@ -27,7 +28,7 @@ class ClassConstructorCommonizer(
annotations = emptyList(), annotations = emptyList(),
typeParameters = typeParameters.result, typeParameters = typeParameters.result,
visibility = visibility.result, visibility = visibility.result,
containingClassDetails = CirContainingClassDetailsFactory.DOES_NOT_MATTER, containingClass = CONTAINING_CLASS_DOES_NOT_MATTER, // does not matter
valueParameters = valueParameters.valueParameters, valueParameters = valueParameters.valueParameters,
hasStableParameterNames = valueParameters.hasStableParameterNames, hasStableParameterNames = valueParameters.hasStableParameterNames,
isPrimary = isPrimary isPrimary = isPrimary
@@ -39,11 +40,19 @@ class ClassConstructorCommonizer(
} }
override fun doCommonizeWith(next: CirClassConstructor): Boolean { override fun doCommonizeWith(next: CirClassConstructor): Boolean {
return !next.containingClassDetails.kind.isSingleton // don't commonize constructors for objects and enum entries return !next.containingClass.kind.isSingleton // don't commonize constructors for objects and enum entries
&& next.containingClassDetails.modality != Modality.SEALED // don't commonize constructors for sealed classes (not not their subclasses) && next.containingClass.modality != Modality.SEALED // don't commonize constructors for sealed classes (not not their subclasses)
&& isPrimary == next.isPrimary && isPrimary == next.isPrimary
&& visibility.commonizeWith(next) && visibility.commonizeWith(next)
&& typeParameters.commonizeWith(next.typeParameters) && typeParameters.commonizeWith(next.typeParameters)
&& valueParameters.commonizeWith(next) && valueParameters.commonizeWith(next)
} }
companion object {
private val CONTAINING_CLASS_DOES_NOT_MATTER = object : CirContainingClass {
override val modality get() = Modality.FINAL
override val kind get() = ClassKind.CLASS
override val isData get() = false
}
}
} }
@@ -24,7 +24,7 @@ class FunctionCommonizer(classifiers: CirKnownClassifiers) : AbstractFunctionOrP
typeParameters = typeParameters.result, typeParameters = typeParameters.result,
visibility = visibility.result, visibility = visibility.result,
modality = modality.result, modality = modality.result,
containingClassDetails = null, containingClass = null, // does not matter
valueParameters = valueParameters.valueParameters, valueParameters = valueParameters.valueParameters,
hasStableParameterNames = valueParameters.hasStableParameterNames, hasStableParameterNames = valueParameters.hasStableParameterNames,
extensionReceiver = extensionReceiver.result, extensionReceiver = extensionReceiver.result,
@@ -34,7 +34,7 @@ class PropertyCommonizer(classifiers: CirKnownClassifiers) : AbstractFunctionOrP
typeParameters = typeParameters.result, typeParameters = typeParameters.result,
visibility = visibility.result, visibility = visibility.result,
modality = modality.result, modality = modality.result,
containingClassDetails = null, containingClass = null, // does not matter
isExternal = isExternal, isExternal = isExternal,
extensionReceiver = extensionReceiver.result, extensionReceiver = extensionReceiver.result,
returnType = returnType.result, returnType = returnType.result,
@@ -171,7 +171,10 @@ class CirTreeMerger(
val propertyNode: CirPropertyNode = ownerNode.properties.getOrPut(PropertyApproximationKey(propertyDescriptor)) { val propertyNode: CirPropertyNode = ownerNode.properties.getOrPut(PropertyApproximationKey(propertyDescriptor)) {
buildPropertyNode(storageManager, size, classifiers, (ownerNode as? CirClassNode)?.commonDeclaration) buildPropertyNode(storageManager, size, classifiers, (ownerNode as? CirClassNode)?.commonDeclaration)
} }
propertyNode.targetDeclarations[targetIndex] = CirPropertyFactory.create(propertyDescriptor) propertyNode.targetDeclarations[targetIndex] = CirPropertyFactory.create(
source = propertyDescriptor,
containingClass = (ownerNode as? CirClassNode)?.targetDeclarations?.get(targetIndex)
)
} }
private fun processFunction( private fun processFunction(
@@ -182,7 +185,10 @@ class CirTreeMerger(
val functionNode: CirFunctionNode = ownerNode.functions.getOrPut(FunctionApproximationKey(functionDescriptor)) { val functionNode: CirFunctionNode = ownerNode.functions.getOrPut(FunctionApproximationKey(functionDescriptor)) {
buildFunctionNode(storageManager, size, classifiers, (ownerNode as? CirClassNode)?.commonDeclaration) buildFunctionNode(storageManager, size, classifiers, (ownerNode as? CirClassNode)?.commonDeclaration)
} }
functionNode.targetDeclarations[targetIndex] = CirFunctionFactory.create(functionDescriptor) functionNode.targetDeclarations[targetIndex] = CirFunctionFactory.create(
source = functionDescriptor,
containingClass = (ownerNode as? CirClassNode)?.targetDeclarations?.get(targetIndex)
)
} }
private fun processClass( private fun processClass(
@@ -228,7 +234,10 @@ class CirTreeMerger(
val constructorNode: CirClassConstructorNode = classNode.constructors.getOrPut(ConstructorApproximationKey(constructorDescriptor)) { val constructorNode: CirClassConstructorNode = classNode.constructors.getOrPut(ConstructorApproximationKey(constructorDescriptor)) {
buildClassConstructorNode(storageManager, size, classifiers, classNode.commonDeclaration) buildClassConstructorNode(storageManager, size, classifiers, classNode.commonDeclaration)
} }
constructorNode.targetDeclarations[targetIndex] = CirClassConstructorFactory.create(constructorDescriptor) constructorNode.targetDeclarations[targetIndex] = CirClassConstructorFactory.create(
source = constructorDescriptor,
containingClass = classNode.targetDeclarations[targetIndex]!!
)
} }
private fun processTypeAlias( private fun processTypeAlias(
@@ -9,9 +9,9 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.* import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.*
import org.jetbrains.kotlin.descriptors.DescriptorVisibility import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirContainingClass
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionOrProperty import org.jetbrains.kotlin.descriptors.commonizer.cir.CirFunctionOrProperty
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirHasVisibility 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.jetbrains.kotlin.descriptors.commonizer.cir.impl.unsupported
import org.junit.Test import org.junit.Test
@@ -50,12 +50,12 @@ abstract class LoweringVisibilityCommonizerTest(
override val typeParameters get() = unsupported() override val typeParameters get() = unsupported()
override val visibility = this@toMock override val visibility = this@toMock
override val modality get() = if (areMembersVirtual) Modality.OPEN else Modality.FINAL override val modality get() = if (areMembersVirtual) Modality.OPEN else Modality.FINAL
override val containingClassDetails = if (areMembersVirtual) override val containingClass = if (areMembersVirtual)
CirContainingClassDetailsFactory.create( object : CirContainingClass {
kind = ClassKind.CLASS, override val modality get() = Modality.OPEN
modality = Modality.OPEN, override val kind get() = ClassKind.CLASS
isData = false override val isData get() = false
) else null } else null
override val extensionReceiver get() = unsupported() override val extensionReceiver get() = unsupported()
override val returnType get() = unsupported() override val returnType get() = unsupported()
override val kind get() = unsupported() override val kind get() = unsupported()