From 0a6c132241bf36d483db6bce26229f5aef97c859 Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Fri, 11 Oct 2019 12:33:04 +0700 Subject: [PATCH] [Commonizer] Fix: Cache package fragments with module name --- .../builder/DeclarationsBuilderVisitor2.kt | 2 +- .../descriptors/commonizer/builder/context.kt | 14 ++++++++------ .../commonizer/builder/packageFragments.kt | 2 +- .../commonizer/mergedtree/ir/nodeBuilders.kt | 3 +++ .../descriptors/commonizer/mergedtree/ir/nodes.kt | 2 ++ .../descriptors/commonizer/mergedtree/modules.kt | 4 +++- .../descriptors/commonizer/mergedtree/packages.kt | 3 ++- 7 files changed, 20 insertions(+), 10 deletions(-) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt index 2aa7368b386..acf8751ac52 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt @@ -46,7 +46,7 @@ internal class DeclarationsBuilderVisitor2( } override fun visitPackageNode(node: CirPackageNode, data: List): List { - val packageFragments = components.cache.getCachedPackageFragments(node.fqName) + val packageFragments = components.cache.getCachedPackageFragments(node.moduleName, node.fqName) // build non-classifier package members: val packageMemberScopes = packageFragments.map { it?.getMemberScope() } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt index 575eaee0526..5a17b51fc7a 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt @@ -25,19 +25,21 @@ class DeclarationsBuilderCache(dimension: Int) { check(dimension > 0) } - private val packageFragments = CommonizedGroupMap(dimension) + private val packageFragments = CommonizedGroupMap, CommonizedPackageFragmentDescriptor>(dimension) private val classes = CommonizedGroupMap(dimension) private val typeAliases = CommonizedGroupMap(dimension) private val modules = CommonizedGroup>(dimension) - fun getCachedPackageFragments(fqName: FqName): List = packageFragments.getOrFail(fqName) + fun getCachedPackageFragments(moduleName: Name, packageFqName: FqName): List = + packageFragments.getOrFail(moduleName to packageFqName) + fun getCachedClasses(fqName: FqName): List = classes.getOrFail(fqName) - private inline fun CommonizedGroupMap.getOrFail(fqName: FqName): List = - getOrNull(fqName)?.toList() ?: error("No cached ${T::class.java} with FQ name $fqName found") + private inline fun CommonizedGroupMap.getOrFail(key: K): List = + getOrNull(key)?.toList() ?: error("No cached ${V::class.java} with key $key found") - fun cache(fqName: FqName, index: Int, descriptor: CommonizedPackageFragmentDescriptor) { - packageFragments[fqName][index] = descriptor + fun cache(moduleName: Name, packageFqName: FqName, index: Int, descriptor: CommonizedPackageFragmentDescriptor) { + packageFragments[moduleName to packageFqName][index] = descriptor } fun cache(fqName: FqName, index: Int, descriptor: CommonizedClassDescriptor) { diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt index d8f3104a351..dfde683bc50 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt @@ -37,7 +37,7 @@ private fun CirPackage.buildDescriptor( val packageFragment = CommonizedPackageFragmentDescriptor(module, fqName) // cache created package fragment descriptor: - components.cache.cache(fqName, index, packageFragment) + components.cache.cache(module.name, fqName, index, packageFragment) output[index] = packageFragment } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt index 279be06543e..035c2a38b31 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.core.* import org.jetbrains.kotlin.descriptors.commonizer.firstNonNull import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode.ClassifiersCacheImpl import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.storage.NullableLazyValue @@ -41,6 +42,7 @@ internal fun buildModuleNode( internal fun buildPackageNode( storageManager: StorageManager, + moduleName: Name, packageFqName: FqName, packageMemberScopes: List ): CirPackageNode = buildNode( @@ -51,6 +53,7 @@ internal fun buildPackageNode( recursionMarker = null, nodeProducer = ::CirPackageNode ).also { node -> + node.moduleName = moduleName node.fqName = packageFqName } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodes.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodes.kt index 5f41fc7a548..e93ec495556 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodes.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodes.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.NullableLazyValue interface CirNode { @@ -53,6 +54,7 @@ class CirPackageNode( override val target: List, override val common: NullableLazyValue ) : CirNodeWithFqName { + lateinit var moduleName: Name override lateinit var fqName: FqName val properties: MutableList = ArrayList() diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt index 19cffb9c6a1..2b8c4452718 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap +import org.jetbrains.kotlin.descriptors.commonizer.firstNonNull import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirModuleNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildModuleNode @@ -33,8 +34,9 @@ internal fun mergeModules( } } + val moduleName = modules.firstNonNull().name for ((packageFqName, packageMemberScopesGroup) in packageMemberScopesMap) { - node.packages += mergePackages(storageManager, cacheRW, packageFqName, packageMemberScopesGroup.toList()) + node.packages += mergePackages(storageManager, cacheRW, moduleName, packageFqName, packageMemberScopesGroup.toList()) } return node diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt index 947f9fddba5..3c7cd7689e0 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt @@ -21,10 +21,11 @@ import org.jetbrains.kotlin.storage.StorageManager internal fun mergePackages( storageManager: StorageManager, cacheRW: CirRootNode.ClassifiersCacheImpl, + moduleName: Name, packageFqName: FqName, packageMemberScopes: List ): CirPackageNode { - val node = buildPackageNode(storageManager, packageFqName, packageMemberScopes) + val node = buildPackageNode(storageManager, moduleName, packageFqName, packageMemberScopes) val propertiesMap = CommonizedGroupMap(packageMemberScopes.size) val functionsMap = CommonizedGroupMap(packageMemberScopes.size)