diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt index ba6ac834cb1..d0885def5ac 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor1.kt @@ -5,14 +5,15 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup +import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.commonizer.Target import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedMemberScope.Companion.plusAssign import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedPackageFragmentProvider.Companion.plusAssign import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.* -import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.dimension -import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.utils.addIfNotNull @@ -51,7 +52,8 @@ internal class DeclarationsBuilderVisitor1( override fun visitModuleNode(node: CirModuleNode, data: List): List { // build module descriptors: - val moduleDescriptorsGroup = CommonizedGroup(node.dimension) + val moduleDescriptorsGroup = + CommonizedGroup(node.dimension) node.buildDescriptors(components, moduleDescriptorsGroup) val moduleDescriptors = moduleDescriptorsGroup.toList() @@ -74,7 +76,8 @@ internal class DeclarationsBuilderVisitor1( val containingDeclarations = data.asListContaining() // build package fragments: - val packageFragmentsGroup = CommonizedGroup(node.dimension) + val packageFragmentsGroup = + CommonizedGroup(node.dimension) node.buildDescriptors(components, packageFragmentsGroup, containingDeclarations) val packageFragments = packageFragmentsGroup.toList() @@ -102,7 +105,10 @@ internal class DeclarationsBuilderVisitor1( error("This method should not be called in ${this::class.java}") override fun visitClassNode(node: CirClassNode, data: List): List { - val classesGroup = CommonizedGroup(node.dimension) + val classesGroup = + CommonizedGroup( + node.dimension + ) node.buildDescriptors(components, classesGroup, data) val classes = classesGroup.toList().asListContaining() @@ -124,7 +130,10 @@ internal class DeclarationsBuilderVisitor1( error("This method should not be called in ${this::class.java}") override fun visitTypeAliasNode(node: CirTypeAliasNode, data: List): List { - val typeAliasesGroup = CommonizedGroup(node.dimension) + val typeAliasesGroup = + CommonizedGroup( + node.dimension + ) node.buildDescriptors(components, typeAliasesGroup, data) val typeAliases = typeAliasesGroup.toList() diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt index acf8751ac52..0a94c5d5243 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor2.kt @@ -6,12 +6,12 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.builder.CommonizedMemberScope.Companion.plusAssign +import org.jetbrains.kotlin.descriptors.commonizer.builder.DeclarationsBuilderVisitor1.Companion.asListContaining import org.jetbrains.kotlin.descriptors.commonizer.builder.DeclarationsBuilderVisitor1.Companion.noContainingDeclarations import org.jetbrains.kotlin.descriptors.commonizer.builder.DeclarationsBuilderVisitor1.Companion.noReturningDeclarations -import org.jetbrains.kotlin.descriptors.commonizer.builder.DeclarationsBuilderVisitor1.Companion.asListContaining import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.* +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl /** Builds and initializes the new tree of common descriptors */ @@ -65,14 +65,16 @@ internal class DeclarationsBuilderVisitor2( } override fun visitPropertyNode(node: CirPropertyNode, data: List): List { - val propertyDescriptorsGroup = CommonizedGroup(node.dimension) + val propertyDescriptorsGroup = + CommonizedGroup(node.dimension) node.buildDescriptors(components, propertyDescriptorsGroup, data) return propertyDescriptorsGroup.toList() } override fun visitFunctionNode(node: CirFunctionNode, data: List): List { - val functionDescriptorsGroup = CommonizedGroup(node.dimension) + val functionDescriptorsGroup = + CommonizedGroup(node.dimension) node.buildDescriptors(components, functionDescriptorsGroup, data) return functionDescriptorsGroup.toList() @@ -114,7 +116,8 @@ internal class DeclarationsBuilderVisitor2( override fun visitClassConstructorNode(node: CirClassConstructorNode, data: List): List { val containingDeclarations = data.asListContaining() - val constructorsGroup = CommonizedGroup(node.dimension) + val constructorsGroup = + CommonizedGroup(node.dimension) node.buildDescriptors(components, constructorsGroup, containingDeclarations) return constructorsGroup.toList() diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/utils.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/builderUtils.kt similarity index 97% rename from konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/utils.kt rename to konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/builderUtils.kt index b1b1a968a73..06036dccb93 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/utils.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/builderUtils.kt @@ -7,10 +7,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.commonizer.isUnderStandardKotlinPackages import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.* import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirSimpleTypeKind.Companion.areCompatible -import org.jetbrains.kotlin.descriptors.commonizer.resolveClassOrTypeAliasByFqName +import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderStandardKotlinPackages +import org.jetbrains.kotlin.descriptors.commonizer.utils.resolveClassOrTypeAliasByFqName import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt index 7fb470c933e..9d457dd0f9a 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/classDescriptors.kt @@ -5,10 +5,12 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup +import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor +import org.jetbrains.kotlin.descriptors.ClassKind +import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.* -import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.name.FqName internal fun CirClassNode.buildDescriptors( diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt index 115e1bee2d9..3ce2933ce1c 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/context.kt @@ -7,14 +7,14 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap import org.jetbrains.kotlin.descriptors.commonizer.Target -import org.jetbrains.kotlin.descriptors.commonizer.createKotlinNativeForwardDeclarationsModule -import org.jetbrains.kotlin.descriptors.commonizer.isUnderKotlinNativeSyntheticPackages import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.dimension import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap +import org.jetbrains.kotlin.descriptors.commonizer.utils.createKotlinNativeForwardDeclarationsModule +import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderKotlinNativeSyntheticPackages import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName @@ -29,13 +29,23 @@ class DeclarationsBuilderCache(dimension: Int) { check(dimension > 0) } - private val modules = CommonizedGroup>(dimension) - private val packageFragments = CommonizedGroupMap, CommonizedPackageFragmentDescriptor>(dimension) - private val classes = CommonizedGroupMap(dimension) - private val typeAliases = CommonizedGroupMap(dimension) + private val modules = + CommonizedGroup>(dimension) + private val packageFragments = + CommonizedGroupMap, CommonizedPackageFragmentDescriptor>( + dimension + ) + private val classes = + CommonizedGroupMap(dimension) + private val typeAliases = + CommonizedGroupMap( + dimension + ) - private val forwardDeclarationsModules = CommonizedGroup(dimension) - private val allModulesWithDependencies = CommonizedGroup>(dimension) + private val forwardDeclarationsModules = + CommonizedGroup(dimension) + private val allModulesWithDependencies = + CommonizedGroup>(dimension) fun getCachedPackageFragments(moduleName: Name, packageFqName: FqName): List = packageFragments.getOrFail(moduleName to packageFqName) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt index 5e178a33139..92ea699028b 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/functionDescriptors.kt @@ -9,10 +9,10 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirFunction import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirFunctionNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl internal fun CirFunctionNode.buildDescriptors( diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt index b9f7ad4b80b..f2cada42d57 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/moduleDescriptors.kt @@ -5,10 +5,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirModule import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirModuleNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl internal fun CirModuleNode.buildDescriptors( diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt index dfde683bc50..625aab9257d 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/packageFragments.kt @@ -6,10 +6,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirPackage import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirPackageNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PackageFragmentDescriptorImpl import org.jetbrains.kotlin.name.FqName diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt index 99e803700a5..1777bdfcd48 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/propertyDescriptors.kt @@ -9,10 +9,10 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirProperty import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirPropertyNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.descriptors.impl.FieldDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.resolve.DescriptorFactory diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt index 4eb6b066075..acdb349a06d 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/typeAliasDescriptors.kt @@ -7,11 +7,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.builder import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters import org.jetbrains.kotlin.descriptors.DeclarationDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirClass import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirTypeAlias import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirTypeAliasNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.indexOfCommon +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.name.FqName internal fun CirTypeAliasNode.buildDescriptors( diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cli.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cli.kt index 04c60858cea..b6415d27d09 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cli.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/cli.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.commonizer.ModuleForCommonization.DeserializedModule import org.jetbrains.kotlin.descriptors.commonizer.ModuleForCommonization.SyntheticModule +import org.jetbrains.kotlin.descriptors.commonizer.utils.createKotlinNativeForwardDeclarationsModule import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.ir.util.UniqId import org.jetbrains.kotlin.konan.library.* @@ -153,10 +154,11 @@ private fun loadModules(repository: File, targets: List): Map(node.target.size) + val supertypesMap = + CommonizedGroupMap(node.target.size) node.target.forEachIndexed { index, clazz -> for (supertype in clazz!!.supertypes) { supertypesMap[supertype.fqNameWithTypeParameters][index] = supertype diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt index cdc94092e49..c5471c8c361 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/TypeCommonizer.kt @@ -5,8 +5,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.core -import org.jetbrains.kotlin.descriptors.commonizer.isUnderStandardKotlinPackages import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.* +import org.jetbrains.kotlin.descriptors.commonizer.utils.isUnderStandardKotlinPackages import org.jetbrains.kotlin.types.AbstractStrictEqualityTypeChecker interface TypeCommonizer : Commonizer { diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt index f6d0347c59b..1eea32eeb67 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ValueParameterCommonizer.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.core -import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirCommonValueParameter -import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirValueParameter -import org.jetbrains.kotlin.descriptors.commonizer.isNull import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirClassifiersCache +import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirCommonValueParameter import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirType +import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirValueParameter +import org.jetbrains.kotlin.descriptors.commonizer.utils.isNull import org.jetbrains.kotlin.name.Name interface ValueParameterCommonizer : Commonizer { diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/classifiers.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/classifiers.kt index 758e12cd7ba..9549b79bbcb 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/classifiers.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/classifiers.kt @@ -6,11 +6,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap -import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.* +import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirClassNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode.ClassifiersCacheImpl import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildClassNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildTypeAliasNode +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.StorageManager @@ -23,10 +23,20 @@ internal fun mergeClasses( ): CirClassNode { val node = buildClassNode(storageManager, cacheRW, containingDeclarationCommon, classes) - val constructorsMap = CommonizedGroupMap(classes.size) - val propertiesMap = CommonizedGroupMap(classes.size) - val functionsMap = CommonizedGroupMap(classes.size) - val classesMap = CommonizedGroupMap(classes.size) + val constructorsMap = + CommonizedGroupMap( + classes.size + ) + val propertiesMap = + CommonizedGroupMap( + classes.size + ) + val functionsMap = + CommonizedGroupMap( + classes.size + ) + val classesMap = + CommonizedGroupMap(classes.size) classes.forEachIndexed { index, clazz -> clazz?.constructors?.forEach { constructorsMap[ConstructorApproximationKey(it)][index] = it } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt index 84709438904..55dd2e3ad38 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/CirType.kt @@ -9,11 +9,11 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.declarationDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.fqName -import org.jetbrains.kotlin.descriptors.commonizer.fqNameWithTypeParameters import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirSimpleTypeKind.CLASS import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirSimpleTypeKind.TYPE_ALIAS +import org.jetbrains.kotlin.descriptors.commonizer.utils.declarationDescriptor +import org.jetbrains.kotlin.descriptors.commonizer.utils.fqName +import org.jetbrains.kotlin.descriptors.commonizer.utils.fqNameWithTypeParameters import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.types.* import kotlin.LazyThreadSafetyMode.PUBLICATION diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt index 035c2a38b31..eec1969d590 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/nodeBuilders.kt @@ -6,11 +6,12 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.commonizer.* -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroup +import org.jetbrains.kotlin.descriptors.commonizer.InputTarget +import org.jetbrains.kotlin.descriptors.commonizer.OutputTarget 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.descriptors.commonizer.utils.CommonizedGroup +import org.jetbrains.kotlin.descriptors.commonizer.utils.firstNonNull import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt index 1b7b2e3078d..28d26d1e5c0 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/memberScopes.kt @@ -7,9 +7,9 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.commonizer.core.Commonizer -import org.jetbrains.kotlin.descriptors.commonizer.fqNameWithTypeParameters -import org.jetbrains.kotlin.descriptors.commonizer.isBlacklistedDarwinFunction -import org.jetbrains.kotlin.descriptors.commonizer.isKniBridgeFunction +import org.jetbrains.kotlin.descriptors.commonizer.utils.fqNameWithTypeParameters +import org.jetbrains.kotlin.descriptors.commonizer.utils.isBlacklistedDarwinFunction +import org.jetbrains.kotlin.descriptors.commonizer.utils.isKniBridgeFunction import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt index 38d2b8fe361..7912311e046 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/modules.kt @@ -7,13 +7,10 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree import org.jetbrains.kotlin.backend.common.serialization.metadata.impl.ExportedForwardDeclarationsPackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.* -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap -import org.jetbrains.kotlin.descriptors.commonizer.firstNonNull -import org.jetbrains.kotlin.descriptors.commonizer.isUnderKotlinNativeSyntheticPackages 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 +import org.jetbrains.kotlin.descriptors.commonizer.utils.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.scopes.ChainedMemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -27,7 +24,8 @@ internal fun mergeModules( ): CirModuleNode { val node = buildModuleNode(storageManager, modules) - val packageMemberScopesMap = CommonizedGroupMap(modules.size) + val packageMemberScopesMap = + CommonizedGroupMap(modules.size) modules.forEachIndexed { index, module -> module?.collectNonEmptyPackageMemberScopes { packageFqName, memberScope -> diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt index c5a39eec033..d2578ad6f88 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/packages.kt @@ -9,10 +9,10 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirPackageNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildPackageNode +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.MemberScope @@ -27,10 +27,19 @@ internal fun mergePackages( ): CirPackageNode { val node = buildPackageNode(storageManager, moduleName, packageFqName, packageMemberScopes) - val propertiesMap = CommonizedGroupMap(packageMemberScopes.size) - val functionsMap = CommonizedGroupMap(packageMemberScopes.size) - val classesMap = CommonizedGroupMap(packageMemberScopes.size) - val typeAliasesMap = CommonizedGroupMap(packageMemberScopes.size) + val propertiesMap = + CommonizedGroupMap( + packageMemberScopes.size + ) + val functionsMap = + CommonizedGroupMap( + packageMemberScopes.size + ) + val classesMap = + CommonizedGroupMap(packageMemberScopes.size) + val typeAliasesMap = CommonizedGroupMap( + packageMemberScopes.size + ) packageMemberScopes.forEachIndexed { index, memberScope -> memberScope?.collectMembers( diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/root.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/root.kt index d8a3c90930c..a3c4f16b30d 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/root.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/root.kt @@ -6,10 +6,10 @@ 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.InputTarget import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildRootNode +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.StorageManager @@ -19,7 +19,8 @@ internal fun mergeRoots( ): CirRootNode { val node = buildRootNode(storageManager, modulesByTargets.map { it.first }) - val modulesMap = CommonizedGroupMap(modulesByTargets.size) + val modulesMap = + CommonizedGroupMap(modulesByTargets.size) modulesByTargets.forEachIndexed { index, (_, modules) -> for (module in modules) { diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils.kt deleted file mode 100644 index 43aea744363..00000000000 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils.kt +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2010-2019 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 - -import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.incremental.components.LookupLocation -import org.jetbrains.kotlin.konan.library.KonanFactories.DefaultDeserializedDescriptorFactory -import org.jetbrains.kotlin.konan.library.KonanFactories.createDefaultKonanResolvedModuleDescriptorsFactory -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe -import org.jetbrains.kotlin.serialization.konan.impl.ForwardDeclarationsFqNames -import org.jetbrains.kotlin.serialization.konan.impl.KlibResolvedModuleDescriptorsFactoryImpl -import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.types.KotlinType -import org.jetbrains.kotlin.types.TypeUtils.getTypeParameterDescriptorOrNull -import org.jetbrains.kotlin.types.Variance -import org.jetbrains.kotlin.types.typeUtil.makeNotNullable -import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance - -internal fun Sequence.toList(expectedCapacity: Int): List { - val result = ArrayList(expectedCapacity) - toCollection(result) - return result -} - -internal inline fun Iterable.firstNonNull() = firstIsInstance() - -internal inline val KotlinType.declarationDescriptor: ClassifierDescriptor - get() = (constructor.declarationDescriptor ?: error("No declaration descriptor found for $constructor")) - -internal inline val KotlinType.fqName: FqName - get() = declarationDescriptor.fqNameSafe - -internal val KotlinType.fqNameWithTypeParameters: String - get() = buildString { buildFqNameWithTypeParameters(this@fqNameWithTypeParameters, HashSet()) } - -private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, exploredTypeParameters: MutableSet) { - append(type.fqName) - - val typeParameterDescriptor = getTypeParameterDescriptorOrNull(type) - if (typeParameterDescriptor != null) { - // N.B this is type parameter type - - if (exploredTypeParameters.add(type.makeNotNullable())) { // print upper bounds once the first time when type parameter type is met - append(":[") - typeParameterDescriptor.upperBounds.forEachIndexed { index, upperBound -> - if (index > 0) - append(",") - buildFqNameWithTypeParameters(upperBound, exploredTypeParameters) - } - append("]") - } - } else { - // N.B. this is classifier type - - val arguments = type.arguments - if (arguments.isNotEmpty()) { - append("<") - arguments.forEachIndexed { index, argument -> - if (index > 0) - append(",") - - if (argument.isStarProjection) - append("*") - else { - val variance = argument.projectionKind - if (variance != Variance.INVARIANT) - append(variance).append(" ") - buildFqNameWithTypeParameters(argument.type, exploredTypeParameters) - } - } - append(">") - } - } - - if (type.isMarkedNullable) - append("?") -} - -internal fun Any?.isNull(): Boolean = this == null - -private val STANDARD_KOTLIN_PACKAGE_PREFIXES = listOf( - KotlinBuiltIns.BUILT_INS_PACKAGE_NAME.asString(), - "kotlinx" -) - -private val KOTLIN_NATIVE_SYNTHETIC_PACKAGES_PREFIXES = ForwardDeclarationsFqNames.syntheticPackages - .map { fqName -> - check(!fqName.isRoot) - fqName.asString() - } - -private const val DARWIN_PACKAGE_PREFIX = "platform.darwin" - -internal val FqName.isUnderStandardKotlinPackages: Boolean - get() = hasAnyPrefix(STANDARD_KOTLIN_PACKAGE_PREFIXES) - -internal val FqName.isUnderKotlinNativeSyntheticPackages: Boolean - get() = hasAnyPrefix(KOTLIN_NATIVE_SYNTHETIC_PACKAGES_PREFIXES) - -internal val FqName.isUnderDarwinPackage: Boolean - get() = asString().hasPrefix(DARWIN_PACKAGE_PREFIX) - -private fun FqName.hasAnyPrefix(prefixes: List): Boolean = - asString().let { fqName -> prefixes.any(fqName::hasPrefix) } - -private fun String.hasPrefix(prefix: String): Boolean { - val lengthDifference = length - prefix.length - return when { - lengthDifference == 0 -> this == prefix - lengthDifference > 0 -> this[prefix.length] == '.' && this.startsWith(prefix) - else -> false - } -} - -internal val ModuleDescriptor.packageFragmentProvider - get() = (this as ModuleDescriptorImpl).packageFragmentProviderForModuleContentWithoutDependencies - -internal fun createKotlinNativeForwardDeclarationsModule( - storageManager: StorageManager, - builtIns: KotlinBuiltIns -): ModuleDescriptorImpl = - (createDefaultKonanResolvedModuleDescriptorsFactory(DefaultDeserializedDescriptorFactory) as KlibResolvedModuleDescriptorsFactoryImpl) - .createForwardDeclarationsModule( - builtIns = builtIns, - storageManager = storageManager - ) - -// similar to org.jetbrains.kotlin.descriptors.DescriptorUtilKt#resolveClassByFqName, but resolves also type aliases -internal fun ModuleDescriptor.resolveClassOrTypeAliasByFqName( - fqName: FqName, - lookupLocation: LookupLocation -): ClassifierDescriptorWithTypeParameters? { - if (fqName.isRoot) return null - - (getPackage(fqName.parent()).memberScope.getContributedClassifier( - fqName.shortName(), - lookupLocation - ) as? ClassifierDescriptorWithTypeParameters)?.let { return it } - - return (resolveClassOrTypeAliasByFqName(fqName.parent(), lookupLocation) as? ClassDescriptor) - ?.unsubstitutedInnerClassesScope - ?.getContributedClassifier(fqName.shortName(), lookupLocation) as? ClassifierDescriptorWithTypeParameters -} diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/blacklist.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/blacklist.kt similarity index 96% rename from konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/blacklist.kt rename to konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/blacklist.kt index 44438bba1c8..fb5fc485d8c 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/blacklist.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/blacklist.kt @@ -3,7 +3,7 @@ * 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 +package org.jetbrains.kotlin.descriptors.commonizer.utils import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/commonizedGroup.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/commonizedGroup.kt similarity index 92% rename from konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/commonizedGroup.kt rename to konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/commonizedGroup.kt index 895a45be97b..ab6ae3a22c8 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/commonizedGroup.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/commonizedGroup.kt @@ -3,7 +3,7 @@ * 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 +package org.jetbrains.kotlin.descriptors.commonizer.utils /** Fixed-size ordered collection with no extra space that represents a commonized group of same-rank elements */ internal class CommonizedGroup( @@ -41,7 +41,11 @@ internal class CommonizedGroup( internal class CommonizedGroupMap(val size: Int) : Iterable>> { private val wrapped: MutableMap> = HashMap() - operator fun get(key: K): CommonizedGroup = wrapped.getOrPut(key) { CommonizedGroup(size) } + operator fun get(key: K): CommonizedGroup = wrapped.getOrPut(key) { + CommonizedGroup( + size + ) + } fun getOrNull(key: K): CommonizedGroup? = wrapped[key] override fun iterator(): Iterator>> = wrapped.iterator() diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt new file mode 100644 index 00000000000..e32da0e9177 --- /dev/null +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/fqName.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2019 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.utils + +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.konan.impl.ForwardDeclarationsFqNames + +private val STANDARD_KOTLIN_PACKAGE_PREFIXES = listOf( + KotlinBuiltIns.BUILT_INS_PACKAGE_NAME.asString(), + "kotlinx" +) + +private val KOTLIN_NATIVE_SYNTHETIC_PACKAGES_PREFIXES = ForwardDeclarationsFqNames.syntheticPackages + .map { fqName -> + check(!fqName.isRoot) + fqName.asString() + } + +private const val DARWIN_PACKAGE_PREFIX = "platform.darwin" + +internal val FqName.isUnderStandardKotlinPackages: Boolean + get() = hasAnyPrefix(STANDARD_KOTLIN_PACKAGE_PREFIXES) + +internal val FqName.isUnderKotlinNativeSyntheticPackages: Boolean + get() = hasAnyPrefix(KOTLIN_NATIVE_SYNTHETIC_PACKAGES_PREFIXES) + +internal val FqName.isUnderDarwinPackage: Boolean + get() = asString().hasPrefix(DARWIN_PACKAGE_PREFIX) + +private fun FqName.hasAnyPrefix(prefixes: List): Boolean = + asString().let { fqName -> prefixes.any(fqName::hasPrefix) } + +private fun String.hasPrefix(prefix: String): Boolean { + val lengthDifference = length - prefix.length + return when { + lengthDifference == 0 -> this == prefix + lengthDifference > 0 -> this[prefix.length] == '.' && this.startsWith(prefix) + else -> false + } +} diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/misc.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/misc.kt new file mode 100644 index 00000000000..84cb2bdbf9c --- /dev/null +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/misc.kt @@ -0,0 +1,18 @@ +/* + * Copyright 2010-2019 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.utils + +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance + +internal fun Sequence.toList(expectedCapacity: Int): List { + val result = ArrayList(expectedCapacity) + toCollection(result) + return result +} + +internal inline fun Iterable.firstNonNull() = firstIsInstance() + +internal fun Any?.isNull(): Boolean = this == null diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/moduleDescriptor.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/moduleDescriptor.kt new file mode 100644 index 00000000000..7a79dacd712 --- /dev/null +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/moduleDescriptor.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2019 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.utils + +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ClassifierDescriptorWithTypeParameters +import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl +import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.konan.library.KonanFactories.DefaultDeserializedDescriptorFactory +import org.jetbrains.kotlin.konan.library.KonanFactories.createDefaultKonanResolvedModuleDescriptorsFactory +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.serialization.konan.impl.KlibResolvedModuleDescriptorsFactoryImpl +import org.jetbrains.kotlin.storage.StorageManager + +internal val ModuleDescriptor.packageFragmentProvider + get() = (this as ModuleDescriptorImpl).packageFragmentProviderForModuleContentWithoutDependencies + +internal fun createKotlinNativeForwardDeclarationsModule( + storageManager: StorageManager, + builtIns: KotlinBuiltIns +): ModuleDescriptorImpl = + (createDefaultKonanResolvedModuleDescriptorsFactory(DefaultDeserializedDescriptorFactory) as KlibResolvedModuleDescriptorsFactoryImpl) + .createForwardDeclarationsModule( + builtIns = builtIns, + storageManager = storageManager + ) + +// similar to org.jetbrains.kotlin.descriptors.DescriptorUtilKt#resolveClassByFqName, but resolves also type aliases +internal fun ModuleDescriptor.resolveClassOrTypeAliasByFqName( + fqName: FqName, + lookupLocation: LookupLocation +): ClassifierDescriptorWithTypeParameters? { + if (fqName.isRoot) return null + + (getPackage(fqName.parent()).memberScope.getContributedClassifier( + fqName.shortName(), + lookupLocation + ) as? ClassifierDescriptorWithTypeParameters)?.let { return it } + + return (resolveClassOrTypeAliasByFqName(fqName.parent(), lookupLocation) as? ClassDescriptor) + ?.unsubstitutedInnerClassesScope + ?.getContributedClassifier(fqName.shortName(), lookupLocation) as? ClassifierDescriptorWithTypeParameters +} diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt new file mode 100644 index 00000000000..5c83760b915 --- /dev/null +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/utils/type.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2010-2019 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.utils + +import org.jetbrains.kotlin.descriptors.ClassifierDescriptor +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe +import org.jetbrains.kotlin.types.KotlinType +import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.typeUtil.makeNotNullable + +internal inline val KotlinType.declarationDescriptor: ClassifierDescriptor + get() = (constructor.declarationDescriptor ?: error("No declaration descriptor found for $constructor")) + +internal inline val KotlinType.fqName: FqName + get() = declarationDescriptor.fqNameSafe + +internal val KotlinType.fqNameWithTypeParameters: String + get() = buildString { buildFqNameWithTypeParameters(this@fqNameWithTypeParameters, HashSet()) } + +private fun StringBuilder.buildFqNameWithTypeParameters(type: KotlinType, exploredTypeParameters: MutableSet) { + append(type.fqName) + + val typeParameterDescriptor = TypeUtils.getTypeParameterDescriptorOrNull(type) + if (typeParameterDescriptor != null) { + // N.B this is type parameter type + + if (exploredTypeParameters.add(type.makeNotNullable())) { // print upper bounds once the first time when type parameter type is met + append(":[") + typeParameterDescriptor.upperBounds.forEachIndexed { index, upperBound -> + if (index > 0) + append(",") + buildFqNameWithTypeParameters(upperBound, exploredTypeParameters) + } + append("]") + } + } else { + // N.B. this is classifier type + + val arguments = type.arguments + if (arguments.isNotEmpty()) { + append("<") + arguments.forEachIndexed { index, argument -> + if (index > 0) + append(",") + + if (argument.isStarProjection) + append("*") + else { + val variance = argument.projectionKind + if (variance != Variance.INVARIANT) + append(variance).append(" ") + buildFqNameWithTypeParameters(argument.type, exploredTypeParameters) + } + } + append(">") + } + } + + if (type.isMarkedNullable) + append("?") +} diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeCommonizerTest.kt index 315b6d8578a..18bad84cd7f 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeCommonizerTest.kt @@ -7,11 +7,11 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor -import org.jetbrains.kotlin.descriptors.commonizer.CommonizedGroupMap import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirRootNode.ClassifiersCacheImpl import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.CirType import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildClassNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildTypeAliasNode +import org.jetbrains.kotlin.descriptors.commonizer.utils.CommonizedGroupMap import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType import org.jetbrains.kotlin.descriptors.commonizer.utils.mockTAType import org.jetbrains.kotlin.name.FqName @@ -369,8 +369,10 @@ class DefaultTypeCommonizerTest : AbstractCommonizerTest() { private fun prepareCache(variants: Array) { check(variants.isNotEmpty()) - val classesMap = CommonizedGroupMap(variants.size) - val typeAliasesMap = CommonizedGroupMap(variants.size) + val classesMap = + CommonizedGroupMap(variants.size) + val typeAliasesMap = + CommonizedGroupMap(variants.size) fun recurse(type: KotlinType, index: Int) { @Suppress("MoveVariableDeclarationIntoWhen") diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt index 186ee3a182e..cf3e98153a8 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/utils/ComparingDeclarationsVisitor.kt @@ -7,9 +7,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.utils import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.descriptors.commonizer.fqName -import org.jetbrains.kotlin.descriptors.commonizer.fqNameWithTypeParameters -import org.jetbrains.kotlin.descriptors.commonizer.isNull import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe