From 5cad8a793cd137563cd0dcd42c75e8064738c42e Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Wed, 17 Jun 2020 21:56:43 +0700 Subject: [PATCH] [Commonizer] Rework CommonizedGroup API to make it more usable --- .../builder/DeclarationsBuilderVisitor1.kt | 34 ++++++++----------- .../builder/DeclarationsBuilderVisitor2.kt | 18 +++++----- .../commonizer/builder/classDescriptors.kt | 8 ++--- .../descriptors/commonizer/builder/context.kt | 2 +- .../commonizer/builder/functionDescriptors.kt | 4 +-- .../commonizer/builder/moduleDescriptors.kt | 4 +-- .../commonizer/builder/packageFragments.kt | 2 +- .../commonizer/builder/propertyDescriptors.kt | 4 +-- .../builder/typeAliasDescriptors.kt | 4 +-- .../commonizer/core/CommonizationVisitor.kt | 4 +-- .../commonizer/mergedtree/CirNode.kt | 2 +- .../commonizer/mergedtree/nodeBuilders.kt | 2 +- .../commonizer/utils/commonizedGroup.kt | 14 ++------ .../commonizer/core/TypeCommonizerTest.kt | 4 +-- 14 files changed, 46 insertions(+), 60 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt index dff36419dd0..995a6c40b31 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt @@ -5,10 +5,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder -import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.commonizer.Target import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedMemberScope.Companion.plusAssign import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedPackageFragmentProvider.Companion.plusAssign @@ -31,7 +28,7 @@ internal class DeclarationsBuilderVisitor1( check(data.isEmpty()) // root node may not have containing declarations check(components.targetComponents.size == node.dimension) - val allTargets = (node.targetDeclarations.toList() + node.commonDeclaration()!!).map { it!!.target } + val allTargets = (node.targetDeclarations + node.commonDeclaration()).map { it!!.target } val modulesByTargets = HashMap>() @@ -56,30 +53,28 @@ internal class DeclarationsBuilderVisitor1( // build module descriptors: val moduleDescriptorsGroup = CommonizedGroup(node.dimension) node.buildDescriptors(components, moduleDescriptorsGroup) - val moduleDescriptors = moduleDescriptorsGroup.toList() // build package fragments: val packageFragmentProviders = CommonizedPackageFragmentProvider.createArray(node.dimension) for (packageNode in node.packages.values) { - val packageFragments = packageNode.accept(this, moduleDescriptors).asListContaining() + val packageFragments = packageNode.accept(this, moduleDescriptorsGroup).asListContaining() packageFragmentProviders += packageFragments } // initialize module descriptors: - moduleDescriptors.forEachIndexed { index, moduleDescriptor -> + moduleDescriptorsGroup.forEachIndexed { index, moduleDescriptor -> moduleDescriptor?.initialize(packageFragmentProviders[index]) } - return moduleDescriptors + return moduleDescriptorsGroup } override fun visitPackageNode(node: CirPackageNode, data: List): List { val containingDeclarations = data.asListContaining() // build package fragments: - val packageFragmentsGroup = CommonizedGroup(node.dimension) - node.buildDescriptors(components, packageFragmentsGroup, containingDeclarations) - val packageFragments = packageFragmentsGroup.toList() + val packageFragments = CommonizedGroup(node.dimension) + node.buildDescriptors(components, packageFragments, containingDeclarations) // build package members: val packageMemberScopes = CommonizedMemberScope.createArray(node.dimension) @@ -105,9 +100,9 @@ internal class DeclarationsBuilderVisitor1( error("This method should not be called in ${this::class.java}") override fun visitClassNode(node: CirClassNode, data: List): List { - val classesGroup = CommonizedGroup(node.dimension) - node.buildDescriptors(components, classesGroup, data) - val classes = classesGroup.toList().asListContaining() + val classifiers = CommonizedGroup(node.dimension) + node.buildDescriptors(components, classifiers, data) + val classes = classifiers.asListContaining() // build class members: val classMemberScopes = CommonizedMemberScope.createArray(node.dimension) @@ -127,15 +122,14 @@ internal class DeclarationsBuilderVisitor1( error("This method should not be called in ${this::class.java}") override fun visitTypeAliasNode(node: CirTypeAliasNode, data: List): List { - val typeAliasesGroup = CommonizedGroup(node.dimension) - node.buildDescriptors(components, typeAliasesGroup, data) - val typeAliases = typeAliasesGroup.toList() + val classifiers = CommonizedGroup(node.dimension) + node.buildDescriptors(components, classifiers, data) - val commonClass = typeAliases[node.indexOfCommon] as? CommonizedClassDescriptor? + val commonClass = classifiers[node.indexOfCommon] as? CommonizedClassDescriptor? commonClass?.unsubstitutedMemberScope = CommonizedMemberScope() // empty member scope commonClass?.initialize(emptyList()) // no constructors - return typeAliases + return classifiers } companion object { diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt index 0819cf51e9d..00ac861a6f1 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt @@ -66,17 +66,17 @@ internal class DeclarationsBuilderVisitor2( } override fun visitPropertyNode(node: CirPropertyNode, data: List): List { - val propertyDescriptorsGroup = CommonizedGroup(node.dimension) - node.buildDescriptors(components, propertyDescriptorsGroup, data) + val propertyDescriptors = CommonizedGroup(node.dimension) + node.buildDescriptors(components, propertyDescriptors, data) - return propertyDescriptorsGroup.toList() + return propertyDescriptors } override fun visitFunctionNode(node: CirFunctionNode, data: List): List { - val functionDescriptorsGroup = CommonizedGroup(node.dimension) - node.buildDescriptors(components, functionDescriptorsGroup, data) + val functionDescriptors = CommonizedGroup(node.dimension) + node.buildDescriptors(components, functionDescriptors, data) - return functionDescriptorsGroup.toList() + return functionDescriptors } override fun visitClassNode(node: CirClassNode, data: List): List { @@ -115,10 +115,10 @@ internal class DeclarationsBuilderVisitor2( override fun visitClassConstructorNode(node: CirClassConstructorNode, data: List): List { val containingDeclarations = data.asListContaining() - val constructorsGroup = CommonizedGroup(node.dimension) - node.buildDescriptors(components, constructorsGroup, containingDeclarations) + val constructors = CommonizedGroup(node.dimension) + node.buildDescriptors(components, constructors, containingDeclarations) - return constructorsGroup.toList() + return constructors } override fun visitTypeAliasNode(node: CirTypeAliasNode, data: List) = diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt index 248f399cff7..70d0182d198 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt @@ -25,14 +25,14 @@ internal fun CirClassNode.buildDescriptors( val commonClass = commonDeclaration() val markAsActual = commonClass != null && commonClass.kind != ClassKind.ENUM_ENTRY - targetDeclarations.toList().forEachIndexed { index, clazz -> + targetDeclarations.forEachIndexed { index, clazz -> clazz?.buildDescriptor(components, output, index, containingDeclarations, fqName, isActual = markAsActual) } commonClass?.buildDescriptor(components, output, indexOfCommon, containingDeclarations, fqName, isExpect = true) // log stats - components.statsCollector?.logStats(output.toList()) + components.statsCollector?.logStats(output) } internal fun CirClass.buildDescriptor( @@ -81,14 +81,14 @@ internal fun CirClassConstructorNode.buildDescriptors( val commonConstructor = commonDeclaration() val markAsActual = commonConstructor != null - targetDeclarations.toList().forEachIndexed { index, constructor -> + targetDeclarations.forEachIndexed { index, constructor -> constructor?.buildDescriptor(components, output, index, containingDeclarations, isActual = markAsActual) } commonConstructor?.buildDescriptor(components, output, indexOfCommon, containingDeclarations, isExpect = true) // log stats - components.statsCollector?.logStats(output.toList()) + components.statsCollector?.logStats(output) } private fun CirClassConstructor.buildDescriptor( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt index d4355aee963..2add8255968 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt @@ -110,7 +110,7 @@ class DeclarationsBuilderCache(private val dimension: Int) { companion object { private inline fun CommonizedGroupMap.getOrFail(key: K): List = - getOrNull(key)?.toList() ?: error("No cached ${V::class.java} with key $key found") + getOrNull(key) ?: error("No cached ${V::class.java} with key $key found") } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt index b1334c92102..84c372fa59c 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt @@ -23,14 +23,14 @@ internal fun CirFunctionNode.buildDescriptors( val commonFunction = commonDeclaration() val markAsExpectAndActual = commonFunction != null && commonFunction.kind != CallableMemberDescriptor.Kind.SYNTHESIZED - targetDeclarations.toList().forEachIndexed { index, function -> + targetDeclarations.forEachIndexed { index, function -> function?.buildDescriptor(components, output, index, containingDeclarations, isActual = markAsExpectAndActual) } commonFunction?.buildDescriptor(components, output, indexOfCommon, containingDeclarations, isExpect = markAsExpectAndActual) // log stats - components.statsCollector?.logStats(output.toList()) + components.statsCollector?.logStats(output) } private fun CirFunction.buildDescriptor( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt index c5e4de5f859..e8e2db550ac 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt @@ -15,14 +15,14 @@ internal fun CirModuleNode.buildDescriptors( components: GlobalDeclarationsBuilderComponents, output: CommonizedGroup ) { - targetDeclarations.toList().forEachIndexed { index, module -> + targetDeclarations.forEachIndexed { index, module -> module?.buildDescriptor(components, output, index) } commonDeclaration()?.buildDescriptor(components, output, indexOfCommon) // log stats - components.statsCollector?.logStats(output.toList()) + components.statsCollector?.logStats(output) } private fun CirModule.buildDescriptor( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt index b3e19779fc2..cf7706d1a25 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt @@ -19,7 +19,7 @@ internal fun CirPackageNode.buildDescriptors( output: CommonizedGroup, modules: List ) { - targetDeclarations.toList().forEachIndexed { index, pkg -> + targetDeclarations.forEachIndexed { index, pkg -> pkg?.buildDescriptor(components, output, index, modules) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt index 0bb868a826d..27b1e01a971 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt @@ -31,7 +31,7 @@ internal fun CirPropertyNode.buildDescriptors( && !isLiftedUp if (!isLiftedUp) { - targetDeclarations.toList().forEachIndexed { index, property -> + targetDeclarations.forEachIndexed { index, property -> property?.buildDescriptor(components, output, index, containingDeclarations, isActual = markAsExpectAndActual) } } @@ -39,7 +39,7 @@ internal fun CirPropertyNode.buildDescriptors( commonProperty?.buildDescriptor(components, output, indexOfCommon, containingDeclarations, isExpect = markAsExpectAndActual) // log stats - components.statsCollector?.logStats(output.toList()) + components.statsCollector?.logStats(output) } private fun CirProperty.buildDescriptor( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt index ffd01f37d45..f1fe9372ce6 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt @@ -28,7 +28,7 @@ internal fun CirTypeAliasNode.buildDescriptors( val markAsActual = commonClassifier != null if (!isLiftedUp) { - targetDeclarations.toList().forEachIndexed { index, typeAlias -> + targetDeclarations.forEachIndexed { index, typeAlias -> typeAlias?.buildDescriptor(components, output, index, containingDeclarations, fqName, isActual = markAsActual) } } @@ -40,7 +40,7 @@ internal fun CirTypeAliasNode.buildDescriptors( } // log stats - components.statsCollector?.logStats(output.toList()) + components.statsCollector?.logStats(output) } private fun CirTypeAlias.buildDescriptor( diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt index 3508a4afb81..0c6778531ee 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/CommonizationVisitor.kt @@ -78,7 +78,7 @@ internal class CommonizationVisitor( if (commonClass != null) { // companion object should have the same FQ name for each target class, then it could be set to common class - val companionObjectFqName = node.targetDeclarations.toList().mapTo(HashSet()) { it!!.companion }.singleOrNull() + val companionObjectFqName = node.targetDeclarations.mapTo(HashSet()) { it!!.companion }.singleOrNull() if (companionObjectFqName != null) { val companionObjectNode = root.cache.classes[companionObjectFqName] ?: error("Can't find companion object with FQ name $companionObjectFqName") @@ -91,7 +91,7 @@ internal class CommonizationVisitor( // find out common (and commonized) supertypes val supertypesMap = CommonizedGroupMap(node.targetDeclarations.size) - node.targetDeclarations.toList().forEachIndexed { index, clazz -> + node.targetDeclarations.forEachIndexed { index, clazz -> for (supertype in clazz!!.supertypes) { supertypesMap[supertype.fqNameWithTypeParameters][index] = supertype } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt index d7559337fe2..b94cda94b14 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/CirNode.kt @@ -27,7 +27,7 @@ interface CirNode { append("fqName=").append(node.fqName).append(", ") } append("target=") - node.targetDeclarations.toList().joinTo(this) + node.targetDeclarations.joinTo(this) append(", common=") append(if (node.commonDeclaration.isComputed()) node.commonDeclaration() else "") } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt index 6d8873feb3a..e79d08c4e27 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/nodeBuilders.kt @@ -149,7 +149,7 @@ internal fun commonize( targetDeclarations: CommonizedGroup, commonizer: Commonizer ): R? { - for (targetDeclaration in targetDeclarations.toList()) { + for (targetDeclaration in targetDeclarations) { if (targetDeclaration == null || !commonizer.commonizeWith(targetDeclaration)) return null } diff --git a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/commonizedGroup.kt b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/commonizedGroup.kt index cff88ca67fe..d52e531a860 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/commonizedGroup.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/commonizedGroup.kt @@ -7,9 +7,9 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils /** Fixed-size ordered collection with no extra space that represents a commonized group of same-rank elements */ class CommonizedGroup( - val size: Int, + override val size: Int, initialize: (Int) -> T? -) { +) : AbstractList() { constructor(elements: List) : this(elements.size, elements::get) constructor(size: Int) : this(size, { null }) @@ -18,7 +18,7 @@ class CommonizedGroup( // so let's use `Any?` instead if `T` here private val elements = Array(size, initialize) - operator fun get(index: Int): T? { + override operator fun get(index: Int): T? { @Suppress("UNCHECKED_CAST") return elements[index] as T? } @@ -29,14 +29,6 @@ class CommonizedGroup( elements[index] = value } - - // TODO: consider removing this method - fun toList(): List = object : AbstractList() { - override val size - get() = this@CommonizedGroup.size - - override fun get(index: Int): T? = this@CommonizedGroup[index] - } } internal class CommonizedGroupMap(val size: Int) : Iterable>> { diff --git a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt index d7640d64254..2c2de32fd45 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizerTest.kt @@ -484,7 +484,7 @@ class TypeCommonizerTest : AbstractCommonizerTest() { null, fqName ).also { - classesGroup.toList().forEachIndexed { index, clazz -> + classesGroup.forEachIndexed { index, clazz -> if (clazz != null) { it.targetDeclarations[index] = CirClassFactory.create(clazz) } @@ -499,7 +499,7 @@ class TypeCommonizerTest : AbstractCommonizerTest() { cache, fqName ).also { - typeAliasesGroup.toList().forEachIndexed { index, typeAlias -> + typeAliasesGroup.forEachIndexed { index, typeAlias -> if (typeAlias != null) { it.targetDeclarations[index] = CirTypeAliasFactory.create(typeAlias) }