[Commonizer] Drop CirContainingClassdetails in favor of CirClass entity
This commit is contained in:
@@ -5,14 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.commonizer.cir
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
interface CirClass : CirClassifier, CirHasModality {
|
||||
val kind: ClassKind
|
||||
interface CirClass : CirClassifier, CirContainingClass {
|
||||
var companion: Name? // null means no companion object
|
||||
val isCompanion: Boolean
|
||||
val isData: Boolean
|
||||
val isInline: Boolean
|
||||
val isInner: Boolean
|
||||
val isExternal: Boolean
|
||||
|
||||
+1
-1
@@ -14,5 +14,5 @@ interface CirClassConstructor :
|
||||
CirCallableMemberWithParameters {
|
||||
|
||||
val isPrimary: Boolean
|
||||
override val containingClassDetails: CirContainingClassDetails // non-nullable
|
||||
override val containingClass: CirContainingClass // non-nullable
|
||||
}
|
||||
|
||||
-15
@@ -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
|
||||
+9
-1
@@ -44,7 +44,15 @@ interface CirHasModality {
|
||||
}
|
||||
|
||||
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 {
|
||||
|
||||
+1
-1
@@ -26,5 +26,5 @@ interface CirFunctionOrProperty :
|
||||
fun isVirtual(): Boolean =
|
||||
visibility != DescriptorVisibilities.PRIVATE
|
||||
&& modality != Modality.FINAL
|
||||
&& !(containingClassDetails?.modality == Modality.FINAL && containingClassDetails?.kind != ClassKind.ENUM_CLASS)
|
||||
&& !(containingClass?.modality == Modality.FINAL && containingClass?.kind != ClassKind.ENUM_CLASS)
|
||||
}
|
||||
|
||||
+4
-4
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMap
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.utils.compactMapNotNull
|
||||
|
||||
object CirClassConstructorFactory {
|
||||
fun create(source: ClassConstructorDescriptor): CirClassConstructor {
|
||||
fun create(source: ClassConstructorDescriptor, containingClass: CirContainingClass): CirClassConstructor {
|
||||
check(source.kind == CallableMemberDescriptor.Kind.DECLARATION) {
|
||||
"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)
|
||||
},
|
||||
visibility = source.visibility,
|
||||
containingClassDetails = CirContainingClassDetailsFactory.create(source),
|
||||
containingClass = containingClass,
|
||||
valueParameters = source.valueParameters.compactMap(CirValueParameterFactory::create),
|
||||
hasStableParameterNames = source.hasStableParameterNames(),
|
||||
isPrimary = source.isPrimary
|
||||
@@ -38,7 +38,7 @@ object CirClassConstructorFactory {
|
||||
annotations: List<CirAnnotation>,
|
||||
typeParameters: List<CirTypeParameter>,
|
||||
visibility: DescriptorVisibility,
|
||||
containingClassDetails: CirContainingClassDetails,
|
||||
containingClass: CirContainingClass,
|
||||
valueParameters: List<CirValueParameter>,
|
||||
hasStableParameterNames: Boolean,
|
||||
isPrimary: Boolean
|
||||
@@ -47,7 +47,7 @@ object CirClassConstructorFactory {
|
||||
annotations = annotations,
|
||||
typeParameters = typeParameters,
|
||||
visibility = visibility,
|
||||
containingClassDetails = containingClassDetails,
|
||||
containingClass = containingClass,
|
||||
valueParameters = valueParameters,
|
||||
hasStableParameterNames = hasStableParameterNames,
|
||||
isPrimary = isPrimary
|
||||
|
||||
-49
@@ -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
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -13,13 +13,13 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
object CirFunctionFactory {
|
||||
fun create(source: SimpleFunctionDescriptor): CirFunction = create(
|
||||
fun create(source: SimpleFunctionDescriptor, containingClass: CirContainingClass?): CirFunction = create(
|
||||
annotations = source.annotations.compactMap(CirAnnotationFactory::create),
|
||||
name = source.name.intern(),
|
||||
typeParameters = source.typeParameters.compactMap(CirTypeParameterFactory::create),
|
||||
visibility = source.visibility,
|
||||
modality = source.modality,
|
||||
containingClassDetails = CirContainingClassDetailsFactory.create(source),
|
||||
containingClass = containingClass,
|
||||
valueParameters = source.valueParameters.compactMap(CirValueParameterFactory::create),
|
||||
hasStableParameterNames = source.hasStableParameterNames(),
|
||||
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
|
||||
@@ -35,7 +35,7 @@ object CirFunctionFactory {
|
||||
typeParameters: List<CirTypeParameter>,
|
||||
visibility: DescriptorVisibility,
|
||||
modality: Modality,
|
||||
containingClassDetails: CirContainingClassDetails?,
|
||||
containingClass: CirContainingClass?,
|
||||
valueParameters: List<CirValueParameter>,
|
||||
hasStableParameterNames: Boolean,
|
||||
extensionReceiver: CirExtensionReceiver?,
|
||||
@@ -49,7 +49,7 @@ object CirFunctionFactory {
|
||||
typeParameters = typeParameters,
|
||||
visibility = visibility,
|
||||
modality = modality,
|
||||
containingClassDetails = containingClassDetails,
|
||||
containingClass = containingClass,
|
||||
valueParameters = valueParameters,
|
||||
hasStableParameterNames = hasStableParameterNames,
|
||||
extensionReceiver = extensionReceiver,
|
||||
|
||||
+4
-4
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
||||
|
||||
object CirPropertyFactory {
|
||||
fun create(source: PropertyDescriptor): CirProperty {
|
||||
fun create(source: PropertyDescriptor, containingClass: CirContainingClass?): CirProperty {
|
||||
val compileTimeInitializer: ConstantValue<*>? = source.compileTimeInitializer
|
||||
if (compileTimeInitializer != null) {
|
||||
checkConstantSupportedInCommonization(
|
||||
@@ -34,7 +34,7 @@ object CirPropertyFactory {
|
||||
typeParameters = source.typeParameters.compactMap(CirTypeParameterFactory::create),
|
||||
visibility = source.visibility,
|
||||
modality = source.modality,
|
||||
containingClassDetails = CirContainingClassDetailsFactory.create(source),
|
||||
containingClass = containingClass,
|
||||
isExternal = source.isExternal,
|
||||
extensionReceiver = source.extensionReceiverParameter?.let(CirExtensionReceiverFactory::create),
|
||||
returnType = CirTypeFactory.create(source.returnType!!),
|
||||
@@ -58,7 +58,7 @@ object CirPropertyFactory {
|
||||
typeParameters: List<CirTypeParameter>,
|
||||
visibility: DescriptorVisibility,
|
||||
modality: Modality,
|
||||
containingClassDetails: CirContainingClassDetails?,
|
||||
containingClass: CirContainingClass?,
|
||||
isExternal: Boolean,
|
||||
extensionReceiver: CirExtensionReceiver?,
|
||||
returnType: CirType,
|
||||
@@ -79,7 +79,7 @@ object CirPropertyFactory {
|
||||
typeParameters = typeParameters,
|
||||
visibility = visibility,
|
||||
modality = modality,
|
||||
containingClassDetails = containingClassDetails,
|
||||
containingClass = containingClass,
|
||||
isExternal = isExternal,
|
||||
extensionReceiver = extensionReceiver,
|
||||
returnType = returnType,
|
||||
|
||||
+1
-1
@@ -12,7 +12,7 @@ data class CirClassConstructorImpl(
|
||||
override val annotations: List<CirAnnotation>,
|
||||
override val typeParameters: List<CirTypeParameter>,
|
||||
override val visibility: DescriptorVisibility,
|
||||
override val containingClassDetails: CirContainingClassDetails,
|
||||
override val containingClass: CirContainingClass,
|
||||
override var valueParameters: List<CirValueParameter>,
|
||||
override var hasStableParameterNames: Boolean,
|
||||
override val isPrimary: Boolean
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ data class CirFunctionImpl(
|
||||
override val typeParameters: List<CirTypeParameter>,
|
||||
override val visibility: DescriptorVisibility,
|
||||
override val modality: Modality,
|
||||
override val containingClassDetails: CirContainingClassDetails?,
|
||||
override val containingClass: CirContainingClass?,
|
||||
override var valueParameters: List<CirValueParameter>,
|
||||
override var hasStableParameterNames: Boolean,
|
||||
override val extensionReceiver: CirExtensionReceiver?,
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ data class CirPropertyImpl(
|
||||
override val typeParameters: List<CirTypeParameter>,
|
||||
override val visibility: DescriptorVisibility,
|
||||
override val modality: Modality,
|
||||
override val containingClassDetails: CirContainingClassDetails?,
|
||||
override val containingClass: CirContainingClass?,
|
||||
override val isExternal: Boolean,
|
||||
override val extensionReceiver: CirExtensionReceiver?,
|
||||
override val returnType: CirType,
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ abstract class AbstractFunctionOrPropertyCommonizer<T : CirFunctionOrProperty>(
|
||||
|
||||
override fun doCommonizeWith(next: T): Boolean =
|
||||
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
|
||||
&& modality.commonizeWith(next.modality)
|
||||
&& visibility.commonizeWith(next)
|
||||
|
||||
+13
-4
@@ -5,10 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.descriptors.commonizer.core
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
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.CirContainingClassDetailsFactory
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.CirKnownClassifiers
|
||||
|
||||
class ClassConstructorCommonizer(
|
||||
@@ -27,7 +28,7 @@ class ClassConstructorCommonizer(
|
||||
annotations = emptyList(),
|
||||
typeParameters = typeParameters.result,
|
||||
visibility = visibility.result,
|
||||
containingClassDetails = CirContainingClassDetailsFactory.DOES_NOT_MATTER,
|
||||
containingClass = CONTAINING_CLASS_DOES_NOT_MATTER, // does not matter
|
||||
valueParameters = valueParameters.valueParameters,
|
||||
hasStableParameterNames = valueParameters.hasStableParameterNames,
|
||||
isPrimary = isPrimary
|
||||
@@ -39,11 +40,19 @@ class ClassConstructorCommonizer(
|
||||
}
|
||||
|
||||
override fun doCommonizeWith(next: CirClassConstructor): Boolean {
|
||||
return !next.containingClassDetails.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)
|
||||
return !next.containingClass.kind.isSingleton // don't commonize constructors for objects and enum entries
|
||||
&& next.containingClass.modality != Modality.SEALED // don't commonize constructors for sealed classes (not not their subclasses)
|
||||
&& isPrimary == next.isPrimary
|
||||
&& visibility.commonizeWith(next)
|
||||
&& typeParameters.commonizeWith(next.typeParameters)
|
||||
&& 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ class FunctionCommonizer(classifiers: CirKnownClassifiers) : AbstractFunctionOrP
|
||||
typeParameters = typeParameters.result,
|
||||
visibility = visibility.result,
|
||||
modality = modality.result,
|
||||
containingClassDetails = null,
|
||||
containingClass = null, // does not matter
|
||||
valueParameters = valueParameters.valueParameters,
|
||||
hasStableParameterNames = valueParameters.hasStableParameterNames,
|
||||
extensionReceiver = extensionReceiver.result,
|
||||
|
||||
+1
-1
@@ -34,7 +34,7 @@ class PropertyCommonizer(classifiers: CirKnownClassifiers) : AbstractFunctionOrP
|
||||
typeParameters = typeParameters.result,
|
||||
visibility = visibility.result,
|
||||
modality = modality.result,
|
||||
containingClassDetails = null,
|
||||
containingClass = null, // does not matter
|
||||
isExternal = isExternal,
|
||||
extensionReceiver = extensionReceiver.result,
|
||||
returnType = returnType.result,
|
||||
|
||||
+12
-3
@@ -171,7 +171,10 @@ class CirTreeMerger(
|
||||
val propertyNode: CirPropertyNode = ownerNode.properties.getOrPut(PropertyApproximationKey(propertyDescriptor)) {
|
||||
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(
|
||||
@@ -182,7 +185,10 @@ class CirTreeMerger(
|
||||
val functionNode: CirFunctionNode = ownerNode.functions.getOrPut(FunctionApproximationKey(functionDescriptor)) {
|
||||
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(
|
||||
@@ -228,7 +234,10 @@ class CirTreeMerger(
|
||||
val constructorNode: CirClassConstructorNode = classNode.constructors.getOrPut(ConstructorApproximationKey(constructorDescriptor)) {
|
||||
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(
|
||||
|
||||
+7
-7
@@ -9,9 +9,9 @@ import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.*
|
||||
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.CirHasVisibility
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.CirContainingClassDetailsFactory
|
||||
import org.jetbrains.kotlin.descriptors.commonizer.cir.impl.unsupported
|
||||
import org.junit.Test
|
||||
|
||||
@@ -50,12 +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)
|
||||
CirContainingClassDetailsFactory.create(
|
||||
kind = ClassKind.CLASS,
|
||||
modality = Modality.OPEN,
|
||||
isData = false
|
||||
) else null
|
||||
override val containingClass = if (areMembersVirtual)
|
||||
object : CirContainingClass {
|
||||
override val modality get() = Modality.OPEN
|
||||
override val kind get() = ClassKind.CLASS
|
||||
override val isData get() = false
|
||||
} else null
|
||||
override val extensionReceiver get() = unsupported()
|
||||
override val returnType get() = unsupported()
|
||||
override val kind get() = unsupported()
|
||||
|
||||
Reference in New Issue
Block a user