[Commonizer] Fix: Cache package fragments with module name
This commit is contained in:
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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
|
||||
}
|
||||
|
||||
+3
@@ -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
|
||||
}
|
||||
|
||||
|
||||
+2
@@ -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()
|
||||
|
||||
+3
-1
@@ -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
|
||||
|
||||
+2
-1
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user