[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?> {
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() }
@@ -25,19 +25,21 @@ class DeclarationsBuilderCache(dimension: Int) {
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 typeAliases = CommonizedGroupMap<FqName, CommonizedTypeAliasDescriptor>(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)
private inline fun <reified T : DeclarationDescriptor> CommonizedGroupMap<FqName, T>.getOrFail(fqName: FqName): List<T?> =
getOrNull(fqName)?.toList() ?: error("No cached ${T::class.java} with FQ name $fqName found")
private inline fun <reified K, reified V : DeclarationDescriptor> CommonizedGroupMap<K, V>.getOrFail(key: K): List<V?> =
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) {
@@ -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
}
@@ -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<MemberScope?>
): CirPackageNode = buildNode(
@@ -51,6 +53,7 @@ internal fun buildPackageNode(
recursionMarker = null,
nodeProducer = ::CirPackageNode
).also { node ->
node.moduleName = moduleName
node.fqName = packageFqName
}
@@ -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<T : CirDeclaration, R : CirDeclaration> {
@@ -53,6 +54,7 @@ class CirPackageNode(
override val target: List<CirPackage?>,
override val common: NullableLazyValue<CirPackage>
) : CirNodeWithFqName<CirPackage, CirPackage> {
lateinit var moduleName: Name
override lateinit var fqName: FqName
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.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
@@ -21,10 +21,11 @@ import org.jetbrains.kotlin.storage.StorageManager
internal fun mergePackages(
storageManager: StorageManager,
cacheRW: CirRootNode.ClassifiersCacheImpl,
moduleName: Name,
packageFqName: FqName,
packageMemberScopes: List<MemberScope?>
): CirPackageNode {
val node = buildPackageNode(storageManager, packageFqName, packageMemberScopes)
val node = buildPackageNode(storageManager, moduleName, packageFqName, packageMemberScopes)
val propertiesMap = CommonizedGroupMap<PropertyApproximationKey, PropertyDescriptor>(packageMemberScopes.size)
val functionsMap = CommonizedGroupMap<FunctionApproximationKey, SimpleFunctionDescriptor>(packageMemberScopes.size)