提交 c6756762 编写于 作者: D Dmitriy Dolovov

[Commonizer] Refactoring: Clean-up in CirTreeMerger

上级 671ebc68
...@@ -16,12 +16,12 @@ class CirClassNode( ...@@ -16,12 +16,12 @@ class CirClassNode(
override val targetDeclarations: CommonizedGroup<CirClass>, override val targetDeclarations: CommonizedGroup<CirClass>,
override val commonDeclaration: NullableLazyValue<CirClass>, override val commonDeclaration: NullableLazyValue<CirClass>,
override val classId: ClassId override val classId: ClassId
) : CirNodeWithClassId<CirClass, CirClass> { ) : CirNodeWithClassId<CirClass, CirClass>, CirNodeWithMembers<CirClass, CirClass> {
val constructors: MutableMap<ConstructorApproximationKey, CirClassConstructorNode> = THashMap() val constructors: MutableMap<ConstructorApproximationKey, CirClassConstructorNode> = THashMap()
val properties: MutableMap<PropertyApproximationKey, CirPropertyNode> = THashMap() override val properties: MutableMap<PropertyApproximationKey, CirPropertyNode> = THashMap()
val functions: MutableMap<FunctionApproximationKey, CirFunctionNode> = THashMap() override val functions: MutableMap<FunctionApproximationKey, CirFunctionNode> = THashMap()
val classes: MutableMap<Name, CirClassNode> = THashMap() override val classes: MutableMap<Name, CirClassNode> = THashMap()
override fun <T, R> accept(visitor: CirNodeVisitor<T, R>, data: T): R = override fun <T, R> accept(visitor: CirNodeVisitor<T, R>, data: T): R =
visitor.visitClassNode(this, data) visitor.visitClassNode(this, data)
......
...@@ -5,8 +5,14 @@ ...@@ -5,8 +5,14 @@
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
import gnu.trove.THashMap
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassifier
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirDeclaration import org.jetbrains.kotlin.descriptors.commonizer.cir.CirDeclaration
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirLiftedUpDeclaration
import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup
import org.jetbrains.kotlin.name.ClassId
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> {
...@@ -37,3 +43,21 @@ interface CirNode<T : CirDeclaration, R : CirDeclaration> { ...@@ -37,3 +43,21 @@ interface CirNode<T : CirDeclaration, R : CirDeclaration> {
} }
} }
interface CirNodeWithClassId<T : CirClassifier, R : CirClassifier> : CirNode<T, R> {
val classId: ClassId
}
interface CirNodeWithFqName<T : CirDeclaration, R : CirDeclaration> : CirNode<T, R> {
val fqName: FqName
}
interface CirNodeWithLiftingUp<T : CirDeclaration, R : CirDeclaration> : CirNode<T, R> {
val isLiftedUp: Boolean
get() = (commonDeclaration() as? CirLiftedUpDeclaration)?.isLiftedUp == true
}
interface CirNodeWithMembers<T : CirDeclaration, R : CirDeclaration> : CirNode<T, R> {
val properties: MutableMap<PropertyApproximationKey, CirPropertyNode>
val functions: MutableMap<FunctionApproximationKey, CirFunctionNode>
val classes: MutableMap<Name, CirClassNode>
}
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClassifier
import org.jetbrains.kotlin.name.ClassId
interface CirNodeWithClassId<T : CirClassifier, R : CirClassifier> : CirNode<T, R> {
val classId: ClassId
}
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirDeclaration
import org.jetbrains.kotlin.name.FqName
interface CirNodeWithFqName<T : CirDeclaration, R : CirDeclaration> : CirNode<T, R> {
val fqName: FqName
}
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.descriptors.commonizer.mergedtree
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirDeclaration
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirLiftedUpDeclaration
interface CirNodeWithLiftingUp<T : CirDeclaration, R : CirDeclaration> : CirNode<T, R> {
val isLiftedUp: Boolean
get() = (commonDeclaration() as? CirLiftedUpDeclaration)?.isLiftedUp == true
}
...@@ -17,11 +17,11 @@ class CirPackageNode( ...@@ -17,11 +17,11 @@ class CirPackageNode(
override val commonDeclaration: NullableLazyValue<CirPackage>, override val commonDeclaration: NullableLazyValue<CirPackage>,
override val fqName: FqName, override val fqName: FqName,
val moduleName: Name val moduleName: Name
) : CirNodeWithFqName<CirPackage, CirPackage> { ) : CirNodeWithFqName<CirPackage, CirPackage>, CirNodeWithMembers<CirPackage, CirPackage> {
val properties: MutableMap<PropertyApproximationKey, CirPropertyNode> = THashMap() override val properties: MutableMap<PropertyApproximationKey, CirPropertyNode> = THashMap()
val functions: MutableMap<FunctionApproximationKey, CirFunctionNode> = THashMap() override val functions: MutableMap<FunctionApproximationKey, CirFunctionNode> = THashMap()
val classes: MutableMap<Name, CirClassNode> = THashMap() override val classes: MutableMap<Name, CirClassNode> = THashMap()
val typeAliases: MutableMap<Name, CirTypeAliasNode> = THashMap() val typeAliases: MutableMap<Name, CirTypeAliasNode> = THashMap()
override fun <T, R> accept(visitor: CirNodeVisitor<T, R>, data: T) = override fun <T, R> accept(visitor: CirNodeVisitor<T, R>, data: T) =
......
...@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget ...@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.descriptors.commonizer.LeafTarget
import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo import org.jetbrains.kotlin.descriptors.commonizer.ModulesProvider.ModuleInfo
import org.jetbrains.kotlin.descriptors.commonizer.CommonizerParameters import org.jetbrains.kotlin.descriptors.commonizer.CommonizerParameters
import org.jetbrains.kotlin.descriptors.commonizer.TargetProvider import org.jetbrains.kotlin.descriptors.commonizer.TargetProvider
import org.jetbrains.kotlin.descriptors.commonizer.cir.CirClass
import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.* import org.jetbrains.kotlin.descriptors.commonizer.cir.factory.*
import org.jetbrains.kotlin.descriptors.commonizer.utils.intern import org.jetbrains.kotlin.descriptors.commonizer.utils.intern
import org.jetbrains.kotlin.descriptors.commonizer.utils.internedClassId import org.jetbrains.kotlin.descriptors.commonizer.utils.internedClassId
...@@ -18,7 +17,6 @@ import org.jetbrains.kotlin.name.ClassId ...@@ -18,7 +17,6 @@ import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
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.StorageManager import org.jetbrains.kotlin.storage.StorageManager
/** /**
...@@ -110,16 +108,15 @@ class CirTreeMerger( ...@@ -110,16 +108,15 @@ class CirTreeMerger(
val allDependeeModules = targetDependeeModules + dependeeModules val allDependeeModules = targetDependeeModules + dependeeModules
val moduleDescriptors: Map<String, ModuleDescriptor> = targetProvider.modulesProvider.loadModules(allDependeeModules) val moduleDescriptors: Map<String, ModuleDescriptor> = targetProvider.modulesProvider.loadModules(allDependeeModules)
val modules: MutableMap<Name, CirModuleNode> = rootNode.modules
moduleDescriptors.forEach { (name, moduleDescriptor) -> moduleDescriptors.forEach { (name, moduleDescriptor) ->
val moduleInfo = commonModuleInfos[name] ?: return@forEach val moduleInfo = commonModuleInfos[name] ?: return@forEach
processModule(modules, targetIndex, moduleInfo, moduleDescriptor) processModule(rootNode, targetIndex, moduleInfo, moduleDescriptor)
} }
} }
private fun processModule( private fun processModule(
modules: MutableMap<Name, CirModuleNode>, rootNode: CirRootNode,
targetIndex: Int, targetIndex: Int,
moduleInfo: ModuleInfo, moduleInfo: ModuleInfo,
moduleDescriptor: ModuleDescriptor moduleDescriptor: ModuleDescriptor
...@@ -127,114 +124,97 @@ class CirTreeMerger( ...@@ -127,114 +124,97 @@ class CirTreeMerger(
processCInteropModuleAttributes(moduleInfo) processCInteropModuleAttributes(moduleInfo)
val moduleName: Name = moduleDescriptor.name.intern() val moduleName: Name = moduleDescriptor.name.intern()
val moduleNode: CirModuleNode = modules.getOrPut(moduleName) { val moduleNode: CirModuleNode = rootNode.modules.getOrPut(moduleName) {
buildModuleNode(storageManager, size) buildModuleNode(storageManager, size)
} }
moduleNode.targetDeclarations[targetIndex] = CirModuleFactory.create(moduleDescriptor) moduleNode.targetDeclarations[targetIndex] = CirModuleFactory.create(moduleDescriptor)
val packages: MutableMap<FqName, CirPackageNode> = moduleNode.packages
moduleDescriptor.collectNonEmptyPackageMemberScopes { packageFqName, packageMemberScope -> moduleDescriptor.collectNonEmptyPackageMemberScopes { packageFqName, packageMemberScope ->
processPackage(packages, targetIndex, packageFqName.intern(), packageMemberScope, moduleName) processPackage(moduleNode, targetIndex, packageFqName.intern(), packageMemberScope, moduleName)
} }
} }
private fun processPackage( private fun processPackage(
packages: MutableMap<FqName, CirPackageNode>, moduleNode: CirModuleNode,
targetIndex: Int, targetIndex: Int,
packageFqName: FqName, packageFqName: FqName,
packageMemberScope: MemberScope, packageMemberScope: MemberScope,
moduleName: Name moduleName: Name
) { ) {
val packageNode: CirPackageNode = packages.getOrPut(packageFqName) { val packageNode: CirPackageNode = moduleNode.packages.getOrPut(packageFqName) {
buildPackageNode(storageManager, size, packageFqName, moduleName) buildPackageNode(storageManager, size, packageFqName, moduleName)
} }
packageNode.targetDeclarations[targetIndex] = CirPackageFactory.create(packageFqName) packageNode.targetDeclarations[targetIndex] = CirPackageFactory.create(packageFqName)
val properties: MutableMap<PropertyApproximationKey, CirPropertyNode> = packageNode.properties
val functions: MutableMap<FunctionApproximationKey, CirFunctionNode> = packageNode.functions
val classes: MutableMap<Name, CirClassNode> = packageNode.classes
val typeAliases: MutableMap<Name, CirTypeAliasNode> = packageNode.typeAliases
packageMemberScope.collectMembers( packageMemberScope.collectMembers(
PropertyCollector { propertyDescriptor -> PropertyCollector { propertyDescriptor ->
processProperty(properties, targetIndex, propertyDescriptor, null) processProperty(packageNode, targetIndex, propertyDescriptor)
}, },
FunctionCollector { functionDescriptor -> FunctionCollector { functionDescriptor ->
processFunction(functions, targetIndex, functionDescriptor, null) processFunction(packageNode, targetIndex, functionDescriptor)
}, },
ClassCollector { classDescriptor -> ClassCollector { classDescriptor ->
processClass(classes, targetIndex, classDescriptor, null) { className -> processClass(packageNode, targetIndex, classDescriptor) { className ->
internedClassId(packageFqName, className) internedClassId(packageFqName, className)
} }
}, },
TypeAliasCollector { typeAliasDescriptor -> TypeAliasCollector { typeAliasDescriptor ->
processTypeAlias(typeAliases, targetIndex, typeAliasDescriptor, packageFqName) processTypeAlias(packageNode, targetIndex, typeAliasDescriptor)
} }
) )
} }
private fun processProperty( private fun processProperty(
properties: MutableMap<PropertyApproximationKey, CirPropertyNode>, ownerNode: CirNodeWithMembers<*, *>,
targetIndex: Int, targetIndex: Int,
propertyDescriptor: PropertyDescriptor, propertyDescriptor: PropertyDescriptor
parentCommonDeclaration: NullableLazyValue<*>?
) { ) {
val propertyNode: CirPropertyNode = properties.getOrPut(PropertyApproximationKey(propertyDescriptor)) { val propertyNode: CirPropertyNode = ownerNode.properties.getOrPut(PropertyApproximationKey(propertyDescriptor)) {
buildPropertyNode(storageManager, size, classifiers, parentCommonDeclaration) buildPropertyNode(storageManager, size, classifiers, (ownerNode as? CirClassNode)?.commonDeclaration)
} }
propertyNode.targetDeclarations[targetIndex] = CirPropertyFactory.create(propertyDescriptor) propertyNode.targetDeclarations[targetIndex] = CirPropertyFactory.create(propertyDescriptor)
} }
private fun processFunction( private fun processFunction(
functions: MutableMap<FunctionApproximationKey, CirFunctionNode>, ownerNode: CirNodeWithMembers<*, *>,
targetIndex: Int, targetIndex: Int,
functionDescriptor: SimpleFunctionDescriptor, functionDescriptor: SimpleFunctionDescriptor
parentCommonDeclaration: NullableLazyValue<*>?
) { ) {
val functionNode: CirFunctionNode = functions.getOrPut(FunctionApproximationKey(functionDescriptor)) { val functionNode: CirFunctionNode = ownerNode.functions.getOrPut(FunctionApproximationKey(functionDescriptor)) {
buildFunctionNode(storageManager, size, classifiers, parentCommonDeclaration) buildFunctionNode(storageManager, size, classifiers, (ownerNode as? CirClassNode)?.commonDeclaration)
} }
functionNode.targetDeclarations[targetIndex] = CirFunctionFactory.create(functionDescriptor) functionNode.targetDeclarations[targetIndex] = CirFunctionFactory.create(functionDescriptor)
} }
private fun processClass( private fun processClass(
classes: MutableMap<Name, CirClassNode>, ownerNode: CirNodeWithMembers<*, *>,
targetIndex: Int, targetIndex: Int,
classDescriptor: ClassDescriptor, classDescriptor: ClassDescriptor,
parentCommonDeclaration: NullableLazyValue<*>?,
classIdFunction: (Name) -> ClassId classIdFunction: (Name) -> ClassId
) { ) {
val className = classDescriptor.name.intern() val className = classDescriptor.name.intern()
val classId = classIdFunction(className) val classId = classIdFunction(className)
val classNode: CirClassNode = classes.getOrPut(className) { val classNode: CirClassNode = ownerNode.classes.getOrPut(className) {
buildClassNode(storageManager, size, classifiers, parentCommonDeclaration, classId) buildClassNode(storageManager, size, classifiers, (ownerNode as? CirClassNode)?.commonDeclaration, classId)
} }
classNode.targetDeclarations[targetIndex] = CirClassFactory.create(classDescriptor) classNode.targetDeclarations[targetIndex] = CirClassFactory.create(classDescriptor)
val parentCommonDeclarationForMembers: NullableLazyValue<CirClass> = classNode.commonDeclaration
val constructors: MutableMap<ConstructorApproximationKey, CirClassConstructorNode> = classNode.constructors
val properties: MutableMap<PropertyApproximationKey, CirPropertyNode> = classNode.properties
val functions: MutableMap<FunctionApproximationKey, CirFunctionNode> = classNode.functions
val nestedClasses: MutableMap<Name, CirClassNode> = classNode.classes
if (classDescriptor.kind != ClassKind.ENUM_ENTRY) { if (classDescriptor.kind != ClassKind.ENUM_ENTRY) {
classDescriptor.constructors.forEach { constructorDescriptor -> classDescriptor.constructors.forEach { constructorDescriptor ->
processClassConstructor(constructors, targetIndex, constructorDescriptor, parentCommonDeclarationForMembers) processClassConstructor(classNode, targetIndex, constructorDescriptor)
} }
} }
classDescriptor.unsubstitutedMemberScope.collectMembers( classDescriptor.unsubstitutedMemberScope.collectMembers(
PropertyCollector { propertyDescriptor -> PropertyCollector { propertyDescriptor ->
processProperty(properties, targetIndex, propertyDescriptor, parentCommonDeclarationForMembers) processProperty(classNode, targetIndex, propertyDescriptor)
}, },
FunctionCollector { functionDescriptor -> FunctionCollector { functionDescriptor ->
processFunction(functions, targetIndex, functionDescriptor, parentCommonDeclarationForMembers) processFunction(classNode, targetIndex, functionDescriptor)
}, },
ClassCollector { nestedClassDescriptor -> ClassCollector { nestedClassDescriptor ->
processClass(nestedClasses, targetIndex, nestedClassDescriptor, parentCommonDeclarationForMembers) { nestedClassName -> processClass(classNode, targetIndex, nestedClassDescriptor) { nestedClassName ->
internedClassId(classId, nestedClassName) internedClassId(classId, nestedClassName)
} }
} }
...@@ -242,27 +222,25 @@ class CirTreeMerger( ...@@ -242,27 +222,25 @@ class CirTreeMerger(
} }
private fun processClassConstructor( private fun processClassConstructor(
constructors: MutableMap<ConstructorApproximationKey, CirClassConstructorNode>, classNode: CirClassNode,
targetIndex: Int, targetIndex: Int,
constructorDescriptor: ClassConstructorDescriptor, constructorDescriptor: ClassConstructorDescriptor
parentCommonDeclaration: NullableLazyValue<*>?
) { ) {
val constructorNode: CirClassConstructorNode = constructors.getOrPut(ConstructorApproximationKey(constructorDescriptor)) { val constructorNode: CirClassConstructorNode = classNode.constructors.getOrPut(ConstructorApproximationKey(constructorDescriptor)) {
buildClassConstructorNode(storageManager, size, classifiers, parentCommonDeclaration) buildClassConstructorNode(storageManager, size, classifiers, classNode.commonDeclaration)
} }
constructorNode.targetDeclarations[targetIndex] = CirClassConstructorFactory.create(constructorDescriptor) constructorNode.targetDeclarations[targetIndex] = CirClassConstructorFactory.create(constructorDescriptor)
} }
private fun processTypeAlias( private fun processTypeAlias(
typeAliases: MutableMap<Name, CirTypeAliasNode>, packageNode: CirPackageNode,
targetIndex: Int, targetIndex: Int,
typeAliasDescriptor: TypeAliasDescriptor, typeAliasDescriptor: TypeAliasDescriptor
packageFqName: FqName
) { ) {
val typeAliasName = typeAliasDescriptor.name.intern() val typeAliasName = typeAliasDescriptor.name.intern()
val typeAliasClassId = internedClassId(packageFqName, typeAliasName) val typeAliasClassId = internedClassId(packageNode.fqName, typeAliasName)
val typeAliasNode: CirTypeAliasNode = typeAliases.getOrPut(typeAliasName) { val typeAliasNode: CirTypeAliasNode = packageNode.typeAliases.getOrPut(typeAliasName) {
buildTypeAliasNode(storageManager, size, classifiers, typeAliasClassId) buildTypeAliasNode(storageManager, size, classifiers, typeAliasClassId)
} }
typeAliasNode.targetDeclarations[targetIndex] = CirTypeAliasFactory.create(typeAliasDescriptor) typeAliasNode.targetDeclarations[targetIndex] = CirTypeAliasFactory.create(typeAliasDescriptor)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册