[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?> {
|
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) {
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+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.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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
@@ -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()
|
||||||
|
|||||||
+3
-1
@@ -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
|
||||||
|
|||||||
+2
-1
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user