[Commonizer] Fix: Cache package fragments with module name

This commit is contained in:
Dmitriy Dolovov
2019-10-11 12:33:04 +07:00
parent a3e3b43aed
commit 0a6c132241
7 changed files with 20 additions and 10 deletions
@@ -46,7 +46,7 @@ internal class DeclarationsBuilderVisitor2(
} }
override fun visitPackageNode(node: CirPackageNode, data: List<DeclarationDescriptor?>): List<PackageFragmentDescriptor?> { override fun visitPackageNode(node: CirPackageNode, data: List<DeclarationDescriptor?>): List<PackageFragmentDescriptor?> {
val packageFragments = components.cache.getCachedPackageFragments(node.fqName) val packageFragments = components.cache.getCachedPackageFragments(node.moduleName, node.fqName)
// build non-classifier package members: // build non-classifier package members:
val packageMemberScopes = packageFragments.map { it?.getMemberScope() } val packageMemberScopes = packageFragments.map { it?.getMemberScope() }
@@ -25,19 +25,21 @@ class DeclarationsBuilderCache(dimension: Int) {
check(dimension > 0) check(dimension > 0)
} }
private val packageFragments = CommonizedGroupMap<FqName, CommonizedPackageFragmentDescriptor>(dimension) private val packageFragments = CommonizedGroupMap<Pair<Name, FqName>, CommonizedPackageFragmentDescriptor>(dimension)
private val classes = CommonizedGroupMap<FqName, CommonizedClassDescriptor>(dimension) private val classes = CommonizedGroupMap<FqName, CommonizedClassDescriptor>(dimension)
private val typeAliases = CommonizedGroupMap<FqName, CommonizedTypeAliasDescriptor>(dimension) private val typeAliases = CommonizedGroupMap<FqName, CommonizedTypeAliasDescriptor>(dimension)
private val modules = CommonizedGroup<Collection<ModuleDescriptor>>(dimension) private val modules = CommonizedGroup<Collection<ModuleDescriptor>>(dimension)
fun getCachedPackageFragments(fqName: FqName): List<CommonizedPackageFragmentDescriptor?> = packageFragments.getOrFail(fqName) fun getCachedPackageFragments(moduleName: Name, packageFqName: FqName): List<CommonizedPackageFragmentDescriptor?> =
packageFragments.getOrFail(moduleName to packageFqName)
fun getCachedClasses(fqName: FqName): List<CommonizedClassDescriptor?> = classes.getOrFail(fqName) fun getCachedClasses(fqName: FqName): List<CommonizedClassDescriptor?> = classes.getOrFail(fqName)
private inline fun <reified T : DeclarationDescriptor> CommonizedGroupMap<FqName, T>.getOrFail(fqName: FqName): List<T?> = private inline fun <reified K, reified V : DeclarationDescriptor> CommonizedGroupMap<K, V>.getOrFail(key: K): List<V?> =
getOrNull(fqName)?.toList() ?: error("No cached ${T::class.java} with FQ name $fqName found") getOrNull(key)?.toList() ?: error("No cached ${V::class.java} with key $key found")
fun cache(fqName: FqName, index: Int, descriptor: CommonizedPackageFragmentDescriptor) { fun cache(moduleName: Name, packageFqName: FqName, index: Int, descriptor: CommonizedPackageFragmentDescriptor) {
packageFragments[fqName][index] = descriptor packageFragments[moduleName to packageFqName][index] = descriptor
} }
fun cache(fqName: FqName, index: Int, descriptor: CommonizedClassDescriptor) { fun cache(fqName: FqName, index: Int, descriptor: CommonizedClassDescriptor) {
@@ -37,7 +37,7 @@ private fun CirPackage.buildDescriptor(
val packageFragment = CommonizedPackageFragmentDescriptor(module, fqName) val packageFragment = CommonizedPackageFragmentDescriptor(module, fqName)
// cache created package fragment descriptor: // cache created package fragment descriptor:
components.cache.cache(fqName, index, packageFragment) components.cache.cache(module.name, fqName, index, packageFragment)
output[index] = packageFragment output[index] = packageFragment
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.descriptors.commonizer.core.*
import org.jetbrains.kotlin.descriptors.commonizer.firstNonNull import org.jetbrains.kotlin.descriptors.commonizer.firstNonNull
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode.ClassifiersCacheImpl import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode.ClassifiersCacheImpl
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.NullableLazyValue
@@ -41,6 +42,7 @@ internal fun buildModuleNode(
internal fun buildPackageNode( internal fun buildPackageNode(
storageManager: StorageManager, storageManager: StorageManager,
moduleName: Name,
packageFqName: FqName, packageFqName: FqName,
packageMemberScopes: List<MemberScope?> packageMemberScopes: List<MemberScope?>
): CirPackageNode = buildNode( ): CirPackageNode = buildNode(
@@ -51,6 +53,7 @@ internal fun buildPackageNode(
recursionMarker = null, recursionMarker = null,
nodeProducer = ::CirPackageNode nodeProducer = ::CirPackageNode
).also { node -> ).also { node ->
node.moduleName = moduleName
node.fqName = packageFqName node.fqName = packageFqName
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.NullableLazyValue
interface CirNode<T : CirDeclaration, R : CirDeclaration> { interface CirNode<T : CirDeclaration, R : CirDeclaration> {
@@ -53,6 +54,7 @@ class CirPackageNode(
override val target: List<CirPackage?>, override val target: List<CirPackage?>,
override val common: NullableLazyValue<CirPackage> override val common: NullableLazyValue<CirPackage>
) : CirNodeWithFqName<CirPackage, CirPackage> { ) : CirNodeWithFqName<CirPackage, CirPackage> {
lateinit var moduleName: Name
override lateinit var fqName: FqName override lateinit var fqName: FqName
val properties: MutableList<CirPropertyNode> = ArrayList() val properties: MutableList<CirPropertyNode> = ArrayList()
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap 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.CirModuleNode
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode
import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildModuleNode 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) { for ((packageFqName, packageMemberScopesGroup) in packageMemberScopesMap) {
node.packages += mergePackages(storageManager, cacheRW, packageFqName, packageMemberScopesGroup.toList()) node.packages += mergePackages(storageManager, cacheRW, moduleName, packageFqName, packageMemberScopesGroup.toList())
} }
return node return node
@@ -21,10 +21,11 @@ import org.jetbrains.kotlin.storage.StorageManager
internal fun mergePackages( internal fun mergePackages(
storageManager: StorageManager, storageManager: StorageManager,
cacheRW: CirRootNode.ClassifiersCacheImpl, cacheRW: CirRootNode.ClassifiersCacheImpl,
moduleName: Name,
packageFqName: FqName, packageFqName: FqName,
packageMemberScopes: List<MemberScope?> packageMemberScopes: List<MemberScope?>
): CirPackageNode { ): CirPackageNode {
val node = buildPackageNode(storageManager, packageFqName, packageMemberScopes) val node = buildPackageNode(storageManager, moduleName, packageFqName, packageMemberScopes)
val propertiesMap = CommonizedGroupMap<PropertyApproximationKey, PropertyDescriptor>(packageMemberScopes.size) val propertiesMap = CommonizedGroupMap<PropertyApproximationKey, PropertyDescriptor>(packageMemberScopes.size)
val functionsMap = CommonizedGroupMap<FunctionApproximationKey, SimpleFunctionDescriptor>(packageMemberScopes.size) val functionsMap = CommonizedGroupMap<FunctionApproximationKey, SimpleFunctionDescriptor>(packageMemberScopes.size)