diff --git a/konan/commonizer/build.gradle.kts b/konan/commonizer/build.gradle.kts index b7203414a58..3f93a07cf47 100644 --- a/konan/commonizer/build.gradle.kts +++ b/konan/commonizer/build.gradle.kts @@ -9,6 +9,8 @@ dependencies { compile(kotlinStdlib()) + compile(project(":kotlin-native:kotlin-native-utils")) + testCompile(commonDep("junit:junit")) testCompile(projectTests(":compiler:tests-common")) diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/TargetId.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/Target.kt similarity index 69% rename from konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/TargetId.kt rename to konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/Target.kt index 82faf106d0f..26f11d536e4 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/TargetId.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/Target.kt @@ -5,13 +5,15 @@ package org.jetbrains.kotlin.descriptors.commonizer +import org.jetbrains.kotlin.konan.target.KonanTarget + // N.B. TargetPlatform/SimplePlatform are non exhaustive enough to address both target platforms such as // JVM, JS and concrete Kotlin/Native targets, e.g. macos_x64, ios_x64, linux_x64. -sealed class TargetId +sealed class Target -data class ConcreteTargetId(val name: String) : TargetId() +data class InputTarget(val name: String, val konanTarget: KonanTarget? = null) : Target() -data class CommonTargetId(val targets: Set) : TargetId() { +data class OutputTarget(val targets: Set) : Target() { init { require(targets.isNotEmpty()) } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor.kt index 1e3cd5b2d29..4709b8e302e 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/builder/DeclarationsBuilderVisitor.kt @@ -8,7 +8,7 @@ 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.TargetId +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.* @@ -21,12 +21,12 @@ import org.jetbrains.kotlin.utils.addIfNotNull internal class DeclarationsBuilderVisitor( private val storageManager: StorageManager, private val builtIns: KotlinBuiltIns, - private val collector: (TargetId, Collection) -> Unit + private val collector: (Target, Collection) -> Unit ) : NodeVisitor, List> { override fun visitRootNode(node: RootNode, data: List): List { - val allTargets = (node.target + node.common()!!).map { it.targetId } + val allTargets = (node.target + node.common()!!).map { it.target } - val modulesByTargets = HashMap>() + val modulesByTargets = HashMap>() // collect module descriptors: for (moduleNode in node.modules) { @@ -45,7 +45,7 @@ internal class DeclarationsBuilderVisitor( // return result (preserve platforms order): for (target in allTargets) { - collector(target, modulesByTargets[target]!!) + collector(target, modulesByTargets.getValue(target)) } return noReturningDeclarations() 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 cf09f568431..0ce75fc1a59 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 @@ -35,7 +35,7 @@ private fun Module.buildDescriptor( moduleName = name, storageManager = storageManager, builtIns = builtIns, - capabilities = emptyMap() // TODO: specify capabilities + capabilities = emptyMap() // TODO: preserve capabilities from the original module descriptors, KT-33998 ) output[index] = moduleDescriptor 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 5d703a1abc5..c7077e4b2c4 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 @@ -27,9 +27,6 @@ internal fun PropertyNode.buildDescriptors( val markAsExpectAndActual = commonProperty != null && commonProperty.kind != CallableMemberDescriptor.Kind.SYNTHESIZED target.forEachIndexed { index, property -> - // target property is DELEGATION - // AND - // the property it overrides is actual property?.buildDescriptor(output, index, containingDeclarations, storageManager, isActual = markAsExpectAndActual) } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt index 9c2b6a3a7d6..a5ceaecd66b 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/core/ModalityCommonizer.kt @@ -31,7 +31,8 @@ private class DefaultModalityCommonizer : ModalityCommonizer { return !error } - private fun getNext(current: Modality, next: Modality): Modality? = when { + @Suppress("NOTHING_TO_INLINE") + private inline fun getNext(current: Modality, next: Modality): Modality? = when { current == Modality.FINAL && next == Modality.OPEN -> Modality.FINAL current == Modality.OPEN && next == Modality.FINAL -> Modality.FINAL current == next -> current 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 37fb24dce3c..03b6458b3dd 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 @@ -106,7 +106,7 @@ private fun areAbbreviatedTypesEqual( return false // N.B. both lists of arguments are already known to be of the same size - for (i in 0 until a.arguments.size) { + for (i in a.arguments.indices) { val aArg = a.arguments[i] val bArg = b.arguments[i] diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/facade.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/facade.kt index d2bae3b165c..6157f88138b 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/facade.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/facade.kt @@ -13,26 +13,24 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.mergeRoots import org.jetbrains.kotlin.storage.LockBasedStorageManager class CommonizationParameters { - private val modulesByTargets = LinkedHashMap>() + // use linked hash map to preserve order + private val modulesByTargets = LinkedHashMap>() - fun addTarget(targetName: String, modules: Collection): CommonizationParameters { - val targetId = ConcreteTargetId(targetName) - require(targetId !in modulesByTargets) { - "Target $targetId is already added" - } + fun addTarget(target: InputTarget, modules: Collection): CommonizationParameters { + require(target !in modulesByTargets) { "Target $target is already added" } val modulesWithUniqueNames = modules.groupingBy { it.name }.eachCount() require(modulesWithUniqueNames.size == modules.size) { "Modules with duplicated names found: ${modulesWithUniqueNames.filter { it.value > 1 }}" } - modulesByTargets[targetId] = modules + modulesByTargets[target] = modules return this } // get them as ordered immutable collection (List) for further processing - fun getModulesByTargets(): List>> = + fun getModulesByTargets(): List>> = modulesByTargets.map { it.key to it.value } fun hasIntersection(): Boolean { @@ -51,9 +49,16 @@ sealed class CommonizationResult object NothingToCommonize : CommonizationResult() class CommonizationPerformed( - val commonModules: Collection, - val modulesByTargets: Map> -) : CommonizationResult() + val modulesByTargets: Map> +) : CommonizationResult() { + val commonTarget: OutputTarget by lazy { + modulesByTargets.keys.filterIsInstance().single() + } + + val concreteTargets: Set by lazy { + modulesByTargets.keys.filterIsInstance().toSet() + } +} fun runCommonization(parameters: CommonizationParameters): CommonizationResult { if (!parameters.hasIntersection()) @@ -66,24 +71,14 @@ fun runCommonization(parameters: CommonizationParameters): CommonizationResult { // commonize: mergedTree.accept(CommonizationVisitor(mergedTree), Unit) - var commonModules: Collection? = null - val otherModulesByTargets = LinkedHashMap>() + val modulesByTargets = LinkedHashMap>() // use linked hash map to preserve order // build resulting descriptors: - val visitor = DeclarationsBuilderVisitor(storageManager, DefaultBuiltIns.Instance) { targetId, commonizedModules -> - when (targetId) { - is CommonTargetId -> { - check(commonModules == null) - commonModules = commonizedModules - } - is ConcreteTargetId -> { - val targetName = targetId.name - check(targetName !in otherModulesByTargets) - otherModulesByTargets[targetName] = commonizedModules - } - } + val visitor = DeclarationsBuilderVisitor(storageManager, DefaultBuiltIns.Instance) { target, commonizedModules -> + check(target !in modulesByTargets) + modulesByTargets[target] = commonizedModules } mergedTree.accept(visitor, DeclarationsBuilderVisitor.noContainingDeclarations()) - return CommonizationPerformed(commonModules!!, otherModulesByTargets) + return CommonizationPerformed(modulesByTargets) } diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Module.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Module.kt index b29aad1be72..bd991a80aba 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Module.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Module.kt @@ -5,8 +5,9 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir +import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.name.Name -data class Module( - val name: Name -) : Declaration +data class Module(val name: Name) : Declaration { + constructor(descriptor: ModuleDescriptor) : this(descriptor.name) +} diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Package.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Package.kt index 0cf1522f8f4..7a875ef3179 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Package.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Package.kt @@ -7,6 +7,4 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir import org.jetbrains.kotlin.name.FqName -data class Package( - val fqName: FqName -) : Declaration +data class Package(val fqName: FqName) : Declaration diff --git a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Root.kt b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Root.kt index 47e5a3a276b..182ec9d9abe 100644 --- a/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Root.kt +++ b/konan/commonizer/src/org/jetbrains/kotlin/descriptors/commonizer/mergedtree/ir/Root.kt @@ -5,6 +5,6 @@ package org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir -import org.jetbrains.kotlin.descriptors.commonizer.TargetId +import org.jetbrains.kotlin.descriptors.commonizer.Target -data class Root(val targetId: TargetId) : Declaration +data class Root(val target: Target) : Declaration 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 93b421fa5d2..ab5a405a2cd 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 @@ -12,39 +12,39 @@ import org.jetbrains.kotlin.descriptors.commonizer.core.* import org.jetbrains.kotlin.descriptors.commonizer.firstNonNull import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.RootNode.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.LockBasedStorageManager import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.StorageManager internal fun buildRootNode( - targets: List + storageManager: StorageManager, + targets: List ): RootNode = RootNode( target = targets.map { Root(it) }, - common = LockBasedStorageManager.NO_LOCKS.createNullableLazyValue { - Root(CommonTargetId(targets.toSet())) + common = storageManager.createNullableLazyValue { + Root(OutputTarget(targets.toSet())) } ) internal fun buildModuleNode( - moduleName: Name, + storageManager: StorageManager, modules: List ): ModuleNode = buildNode( - storageManager = LockBasedStorageManager.NO_LOCKS, + storageManager = storageManager, descriptors = modules, - targetDeclarationProducer = { Module(moduleName) }, - commonValueProducer = { Module(moduleName) }, + targetDeclarationProducer = ::Module, + commonValueProducer = { Module(it.firstNonNull().name) }, recursionMarker = null, nodeProducer = ::ModuleNode ) internal fun buildPackageNode( + storageManager: StorageManager, packageFqName: FqName, packageMemberScopes: List ): PackageNode = buildNode( - storageManager = LockBasedStorageManager.NO_LOCKS, + storageManager = storageManager, descriptors = packageMemberScopes, targetDeclarationProducer = { Package(packageFqName) }, commonValueProducer = { Package(packageFqName) }, 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 7a0d5539fc1..080fbfd34da 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 @@ -22,10 +22,9 @@ import org.jetbrains.kotlin.utils.alwaysTrue internal fun mergeModules( storageManager: StorageManager, cacheRW: RootNode.ClassifiersCacheImpl, - moduleName: Name, modules: List ): ModuleNode { - val node = buildModuleNode(moduleName, modules) + val node = buildModuleNode(storageManager, modules) val packageMemberScopesMap = CommonizedGroupMap(modules.size) 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 206aa00b72f..3beaa742105 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 @@ -24,7 +24,7 @@ internal fun mergePackages( packageFqName: FqName, packageMemberScopes: List ): PackageNode { - val node = buildPackageNode(packageFqName, packageMemberScopes) + val node = buildPackageNode(storageManager, packageFqName, packageMemberScopes) val propertiesMap = CommonizedGroupMap(packageMemberScopes.size) val functionsMap = CommonizedGroupMap(packageMemberScopes.size) 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 08d17c44a47..d2e0e37dd69 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 @@ -7,7 +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.ConcreteTargetId +import org.jetbrains.kotlin.descriptors.commonizer.InputTarget import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.RootNode import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.buildRootNode import org.jetbrains.kotlin.name.Name @@ -15,9 +15,9 @@ import org.jetbrains.kotlin.storage.StorageManager internal fun mergeRoots( storageManager: StorageManager, - modulesByTargets: List>> + modulesByTargets: List>> ): RootNode { - val node = buildRootNode(modulesByTargets.map { it.first }) + val node = buildRootNode(storageManager, modulesByTargets.map { it.first }) val modulesMap = CommonizedGroupMap(modulesByTargets.size) @@ -27,8 +27,8 @@ internal fun mergeRoots( } } - for ((moduleName, modulesGroup) in modulesMap) { - node.modules += mergeModules(storageManager, node.cache, moduleName, modulesGroup.toList()) + for ((_, modulesGroup) in modulesMap) { + node.modules += mergeModules(storageManager, node.cache, modulesGroup.toList()) } return node diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/AbstractCommonizationFromSourcesTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/AbstractCommonizationFromSourcesTest.kt index db3df7ecbc7..3738bd015e0 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/AbstractCommonizationFromSourcesTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/AbstractCommonizationFromSourcesTest.kt @@ -32,12 +32,12 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() { } fun Collection.eachModuleAsTarget() = mapIndexed { index, moduleDescriptor -> - "target_$index" to moduleDescriptor + InputTarget("target_$index") to moduleDescriptor }.toMap().toCommonizationParameters() - fun Map.toCommonizationParameters() = CommonizationParameters().also { - forEach { (targetName, moduleDescriptor) -> - it.addTarget(targetName, listOf(moduleDescriptor)) + fun Map.toCommonizationParameters() = CommonizationParameters().also { + forEach { (target, moduleDescriptor) -> + it.addTarget(target, listOf(moduleDescriptor)) } } } @@ -71,7 +71,7 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() { .also(::assertIsDirectory) } - protected val sourceModuleRoots: Pair, Set> + protected val sourceModuleRoots: Triple, Set, File> get() { val testDataDir = testDataDir @@ -89,19 +89,21 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() { ?.toSet() ?.also { it.forEach(::assertIsDirectory) } + val commonRoot = commonizedRoots?.singleOrNull { it.name == "common" } + check( - !originalRoots.isNullOrEmpty() && !commonizedRoots.isNullOrEmpty() - && (originalRoots.map { it.name } + "common").toSet() == commonizedRoots.map { it.name }.toSet() + !originalRoots.isNullOrEmpty() && !commonizedRoots.isNullOrEmpty() && commonRoot != null + && (originalRoots + commonRoot).map { it.name }.toSet() == commonizedRoots.map { it.name }.toSet() ) { "Source module misconfiguration in $testDataDir" } - return originalRoots to commonizedRoots + return Triple(originalRoots, commonizedRoots - commonRoot, commonRoot) } - protected val sourceModuleDescriptors: Pair, Map> + protected val sourceModuleDescriptors: Pair, Map> get() { - fun analyzeTarget(targetRoot: File): Pair { + fun analyzeTarget(targetRoot: File): ModuleDescriptor { val environment = createEnvironment(targetRoot.parentFile.parentFile.name) val psiFactory = KtPsiFactory(environment.project) @@ -110,7 +112,7 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() { .map { psiFactory.createFile(it.name, doLoadFile(it)) } .toList() - val moduleDescriptor = CommonResolverForModuleFactory.analyzeFiles( + return CommonResolverForModuleFactory.analyzeFiles( files = psiFiles, moduleName = environment.moduleName, dependOnBuiltIns = true, @@ -118,11 +120,19 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() { ) { content -> environment.createPackagePartProvider(content.moduleContentScope) }.moduleDescriptor - - return targetRoot.name to moduleDescriptor } - return sourceModuleRoots.first.map(::analyzeTarget).toMap() to sourceModuleRoots.second.map(::analyzeTarget).toMap() + val originalModules = sourceModuleRoots.first + .map { InputTarget(it.name) to analyzeTarget(it) } + .toMap() + + val commonizedModules = sourceModuleRoots.second + .map { InputTarget(it.name) to analyzeTarget(it) } + .toMap() + + val commonModule = OutputTarget(commonizedModules.keys) to analyzeTarget(sourceModuleRoots.third) + + return originalModules to commonizedModules + commonModule } protected fun doTestSuccessfulCommonization() { @@ -131,23 +141,26 @@ abstract class AbstractCommonizationFromSourcesTest : KtUsefulTestCase() { val result = runCommonization(originalModules.toCommonizationParameters()) assertCommonizationPerformed(result) - val commonModuleAsExpected = commonizedModules.getValue("common") - val commonModuleByCommonizer = result.commonModules.single() + val commonTarget = commonizedModules.keys.filterIsInstance().single() + assertEquals(commonTarget, result.commonTarget) + + val commonModuleAsExpected = commonizedModules.getValue(commonTarget) + val commonModuleByCommonizer = result.modulesByTargets.getValue(commonTarget).single() assertValidModule(commonModuleAsExpected) assertValidModule(commonModuleByCommonizer) - assertModulesAreEqual(commonModuleAsExpected, commonModuleByCommonizer, "\"common\" target") + assertModulesAreEqual(commonModuleAsExpected, commonModuleByCommonizer, "\"$commonTarget\" target") - val concreteTargetNames = commonizedModules.keys - "common" - assertEquals(concreteTargetNames, result.modulesByTargets.keys) + val concreteTargets = commonizedModules.keys - commonTarget + assertEquals(concreteTargets, result.concreteTargets) - for (targetName in concreteTargetNames) { - val targetModuleAsExpected = commonizedModules.getValue(targetName) - val targetModuleByCommonizer = result.modulesByTargets.getValue(targetName).single() + for (target in concreteTargets) { + val targetModuleAsExpected = commonizedModules.getValue(target) + val targetModuleByCommonizer = result.modulesByTargets.getValue(target).single() assertValidModule(targetModuleAsExpected) assertValidModule(targetModuleByCommonizer) - assertModulesAreEqual(targetModuleAsExpected, targetModuleByCommonizer, "\"$targetName\" target") + assertModulesAreEqual(targetModuleAsExpected, targetModuleByCommonizer, "\"$target\" target") } } } diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/CommonizerFacadeTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/CommonizerFacadeTest.kt index 94fe562c190..d73c23c2b0a 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/CommonizerFacadeTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/CommonizerFacadeTest.kt @@ -37,7 +37,7 @@ class CommonizerFacadeTest { } @Test - fun nothingToCommonize2() { + fun commonized() { val modules = listOf( mockEmptyModule(""), mockEmptyModule("") @@ -47,11 +47,11 @@ class CommonizerFacadeTest { assertCommonizationPerformed(result) - assertSingleModuleForTarget("", result.commonModules) + assertSingleModuleForTarget("", result.modulesByTargets.getValue(result.commonTarget)) - assertEquals(2, result.modulesByTargets.size) - for (modulesSamePlatform in result.modulesByTargets.values) { - assertSingleModuleForTarget("", modulesSamePlatform) + assertEquals(2, result.concreteTargets.size) + for (target in result.concreteTargets) { + assertSingleModuleForTarget("", result.modulesByTargets.getValue(target)) } } diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt index a23ab4d2e0c..7dd69bed7d8 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultExtensionReceiverCommonizerTest.kt @@ -10,10 +10,8 @@ import org.jetbrains.kotlin.descriptors.commonizer.utils.EMPTY_CLASSIFIERS_CACHE import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.ExtensionReceiver import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType import org.jetbrains.kotlin.types.UnwrappedType -import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.junit.Test -@TypeRefinement class DefaultExtensionReceiverCommonizerTest : AbstractCommonizerTest() { @Test @@ -56,7 +54,6 @@ class DefaultExtensionReceiverCommonizerTest : AbstractCommonizerTest() { private lateinit var cache: ClassifiersCacheImpl diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterCommonizerTest.kt index e1cda38f030..cc4629f245c 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterCommonizerTest.kt @@ -11,10 +11,8 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.TypeParameter import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance -import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.junit.Test -@TypeRefinement class DefaultTypeParameterCommonizerTest : AbstractCommonizerTest() { override fun createCommonizer() = TypeParameterCommonizer.default(EMPTY_CLASSIFIERS_CACHE) diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterListCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterListCommonizerTest.kt index a54313c3464..07cdee4057c 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterListCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultTypeParameterListCommonizerTest.kt @@ -7,10 +7,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.commonizer.utils.EMPTY_CLASSIFIERS_CACHE import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.TypeParameter -import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.junit.Test -@TypeRefinement class DefaultTypeParameterListCommonizerTest : AbstractCommonizerTest, List>() { @Test diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterCommonizerTest.kt index 2d11a529618..a6a1122b638 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterCommonizerTest.kt @@ -13,10 +13,8 @@ import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.ValueParameter import org.jetbrains.kotlin.descriptors.commonizer.utils.mockClassType import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.UnwrappedType -import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.junit.Test -@TypeRefinement class DefaultValueParameterCommonizerTest : AbstractCommonizerTest() { @Test diff --git a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterListCommonizerTest.kt b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterListCommonizerTest.kt index ff580d57d56..7a9ce4a6275 100644 --- a/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterListCommonizerTest.kt +++ b/konan/commonizer/tests/org/jetbrains/kotlin/descriptors/commonizer/core/DefaultValueParameterListCommonizerTest.kt @@ -8,10 +8,8 @@ package org.jetbrains.kotlin.descriptors.commonizer.core import org.jetbrains.kotlin.descriptors.commonizer.utils.EMPTY_CLASSIFIERS_CACHE import org.jetbrains.kotlin.descriptors.commonizer.core.TestValueParameter.Companion.areEqual import org.jetbrains.kotlin.descriptors.commonizer.mergedtree.ir.ValueParameter -import org.jetbrains.kotlin.types.refinement.TypeRefinement import org.junit.Test -@TypeRefinement class DefaultValueParameterListCommonizerTest : AbstractCommonizerTest, List>() { @Test @@ -174,7 +172,7 @@ class DefaultValueParameterListCommonizerTest : AbstractCommonizerTest = emptyList() - override fun computeSupertypes(): List = emptyList() - override fun isDenotable() = true - override fun getDeclarationDescriptor() = classDescriptor - override val supertypeLoopChecker = SupertypeLoopChecker.EMPTY - override fun toString() = "class type constructor ${declarationDescriptor.name}" - } + val classDescriptor = CommonizedClassDescriptor( + storageManager = LockBasedStorageManager.NO_LOCKS, + containingDeclaration = createPackageFragmentForClassifier(classFqName), + annotations = Annotations.EMPTY, + name = classFqName.shortName(), + kind = ClassKind.CLASS, + modality = Modality.FINAL, + visibility = Visibilities.PUBLIC, + isCompanion = false, + isData = false, + isInline = false, + isInner = false, + isExternal = false, + isExpect = false, + isActual = false, + companionObjectName = null, + supertypes = emptyList() + ) - val classDescriptor = object : ClassDescriptorBase( - /*storageManager =*/ LockBasedStorageManager.NO_LOCKS, - /*containingDeclaration =*/ createPackageFragmentForClassifier(classFqName), - /*name =*/ classFqName.shortName(), - /*source =*/ SourceElement.NO_SOURCE, - /*isExternal =*/ false - ) { - override fun getStaticScope() = MemberScope.Empty - override fun getConstructors(): List = emptyList() - override fun getCompanionObjectDescriptor(): ClassDescriptor? = null - override fun getKind() = ClassKind.CLASS - override fun getModality() = Modality.FINAL - override fun getVisibility() = Visibilities.PUBLIC - override fun isCompanionObject() = false - override fun isData() = false - override fun isInline() = false - override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? = null - override fun isExpect() = false - override fun getUnsubstitutedMemberScope(kotlinTypeRefiner: KotlinTypeRefiner) = MemberScope.Empty - override fun isActual() = false - override fun getSealedSubclasses(): List = emptyList() - override fun getTypeConstructor() = classTypeConstructor - override fun isInner() = false - override fun getDeclaredTypeParameters(): List = emptyList() - override val annotations = Annotations.EMPTY - override fun toString() = "class descriptor $name" - } + classDescriptor.declaredTypeParameters = emptyList() - classTypeConstructor.classDescriptor = classDescriptor + classDescriptor.initialize( + unsubstitutedMemberScope = MemberScope.Empty, + constructors = emptyList() + ) - createSimpleType(classTypeConstructor, nullable) + classDescriptor.defaultType.makeNullableAsSpecified(nullable) } -@TypeRefinement internal fun mockTAType( fqName: String, nullable: Boolean = false, @@ -88,27 +69,24 @@ internal fun mockTAType( val rightHandSideType = rightHandSideTypeProvider().lowerIfFlexible() - val typeAliasDescriptor = object : AbstractTypeAliasDescriptor( + val typeAliasDescriptor = CommonizedTypeAliasDescriptor( + storageManager = LockBasedStorageManager.NO_LOCKS, containingDeclaration = createPackageFragmentForClassifier(typeAliasFqName), annotations = Annotations.EMPTY, name = typeAliasFqName.shortName(), - sourceElement = SourceElement.NO_SOURCE, - visibilityImpl = Visibilities.PUBLIC - ) { - private val myDefaultType by lazy { createSimpleType(typeConstructor, nullable) } - override val storageManager = LockBasedStorageManager.NO_LOCKS - override fun getTypeConstructorTypeParameters(): List = emptyList() - override val underlyingType by lazy { rightHandSideType.getAbbreviation() ?: rightHandSideType } - override fun getDefaultType() = myDefaultType - override val classDescriptor get() = expandedType.constructor.declarationDescriptor as ClassDescriptor? - override val constructors: Collection = emptyList() - override fun substitute(substitutor: TypeSubstitutor) = this - override val expandedType by lazy { rightHandSideType } - }.apply { - initialize(emptyList()) - } + visibility = Visibilities.PUBLIC, + isActual = false + ) - (rightHandSideType.getAbbreviatedType()?.expandedType ?: rightHandSideType).withAbbreviation(typeAliasDescriptor.defaultType) + typeAliasDescriptor.initialize( + declaredTypeParameters = emptyList(), + underlyingType = rightHandSideType.getAbbreviation() ?: rightHandSideType, + expandedType = rightHandSideType + ) + + (rightHandSideType.getAbbreviatedType()?.expandedType ?: rightHandSideType) + .withAbbreviation(typeAliasDescriptor.defaultType) + .makeNullableAsSpecified(nullable) } private fun createPackageFragmentForClassifier(classifierFqName: FqName): PackageFragmentDescriptor = @@ -126,16 +104,6 @@ private fun createPackageFragmentForClassifier(classifierFqName: FqName): Packag override fun toString() = "package $name" } -private fun createSimpleType(typeConstructor: TypeConstructor, nullable: Boolean): SimpleType = - KotlinTypeFactory.simpleTypeWithNonTrivialMemberScope( - annotations = Annotations.EMPTY, - constructor = typeConstructor, - arguments = emptyList(), - nullable = nullable, - memberScope = MemberScope.Empty, - refinedTypeFactory = { null } - ) - internal val EMPTY_CLASSIFIERS_CACHE = object : ClassifiersCache { override val classes: Map get() = emptyMap() override val typeAliases: Map get() = emptyMap()