From 68c3e39058c766b782259840e8717effe3637175 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Fri, 26 Mar 2021 12:20:42 +0100 Subject: [PATCH] [Commonizer] Implement support for hierarchical commonization --- .../KotlinNativeCommonizerToolRunner.kt | 2 +- .../kotlin/commonizer/CommonizerParameters.kt | 25 ++++--- .../kotlin/commonizer/TargetDependent.kt | 8 +-- .../kotlin/commonizer/TargetProvider.kt | 5 +- .../kotlin/commonizer/cli/nativeTasks.kt | 4 +- .../org/jetbrains/kotlin/commonizer/facade.kt | 69 ++++++++++++------ .../commonizer/konan/LibraryCommonizer.kt | 38 +++++++--- .../commonizer/mergedtree/CirClassNode.kt | 2 + .../kotlin/commonizer/mergedtree/CirNode.kt | 7 +- .../mergedtree/CirProvidedClassifiers.kt | 8 ++- .../commonizer/mergedtree/CirTypeAliasNode.kt | 2 + .../mergedtree/mergers/RootMerger.kt | 3 +- .../commonizer/mergedtree/nodeBuilders.kt | 4 +- .../commonizer/repository/FilesRepository.kt | 8 +-- .../kotlin/commonizer/tree/CirTree.kt | 12 ++-- .../kotlin/commonizer/tree/assembelCirTree.kt | 72 +++++++++++++++++++ .../commonizer/tree/deserializeCirTree.kt | 32 +++++++++ ...=> CirTreeClassConstructorDeserializer.kt} | 2 +- ...ializer.kt => CirTreeClassDeserializer.kt} | 8 +-- ...izer.kt => CirTreeFunctionDeserializer.kt} | 2 +- ...alizer.kt => CirTreeModuleDeserializer.kt} | 4 +- ...lizer.kt => CirTreePackageDeserializer.kt} | 10 +-- ...izer.kt => CirTreePropertyDeserializer.kt} | 2 +- ...zer.kt => CirTreeTypeAliasDeserializer.kt} | 2 +- .../deserializer/RootCirTreeDeserializer.kt | 10 +-- .../tree/deserializer/deserialize.kt | 30 -------- .../tree/{merger/merge.kt => mergeCirTree.kt} | 2 +- .../AbstractCommonizationFromSourcesTest.kt | 9 ++- .../kotlin/commonizer/TargetDependentTest.kt | 39 ++++++++++ .../kotlin/commonizer/utils/mocks.kt | 4 +- 30 files changed, 293 insertions(+), 132 deletions(-) create mode 100644 native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/assembelCirTree.kt create mode 100644 native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializeCirTree.kt rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/{ClassConstructorCirTreeDeserializer.kt => CirTreeClassConstructorDeserializer.kt} (95%) rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/{ClassCirTreeDeserializer.kt => CirTreeClassDeserializer.kt} (92%) rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/{FunctionCirTreeDeserializer.kt => CirTreeFunctionDeserializer.kt} (97%) rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/{ModuleCirTreeDeserializer.kt => CirTreeModuleDeserializer.kt} (94%) rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/{PackageCirTreeDeserializer.kt => CirTreePackageDeserializer.kt} (87%) rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/{PropertyCirTreeDeserializer.kt => CirTreePropertyDeserializer.kt} (97%) rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/{TypeAliasCirTreeDeserializer.kt => CirTreeTypeAliasDeserializer.kt} (96%) delete mode 100644 native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/deserialize.kt rename native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/{merger/merge.kt => mergeCirTree.kt} (98%) create mode 100644 native/commonizer/tests/org/jetbrains/kotlin/commonizer/TargetDependentTest.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt index da433a19e43..5cfae29e47c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/compilerRunner/KotlinNativeCommonizerToolRunner.kt @@ -31,7 +31,7 @@ internal class KotlinNativeCommonizerToolRunner(project: Project) : KotlinToolRu override val defaultMaxHeapSize: String get() = "4G" - override val mustRunViaExec get() = true // because it's not enough the standard Gradle wrapper's heap size + override val mustRunViaExec get() = false // because it's not enough the standard Gradle wrapper's heap size override fun getCustomJvmArgs() = PropertiesProvider(project).commonizerJvmArgs?.split("\\s+".toRegex()).orEmpty() } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt index 9acef6e56d0..957b2bca550 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt @@ -6,26 +6,19 @@ package org.jetbrains.kotlin.commonizer import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider +import org.jetbrains.kotlin.commonizer.mergedtree.CirFictitiousFunctionClassifiers +import org.jetbrains.kotlin.commonizer.mergedtree.CirProvidedClassifiers import org.jetbrains.kotlin.commonizer.stats.StatsCollector class CommonizerParameters( + val outputTarget: SharedCommonizerTarget, + val manifestProvider: TargetDependent, + val dependenciesProvider: TargetDependent, val targetProviders: TargetDependent, val resultsConsumer: ResultsConsumer, - val commonManifestProvider: NativeManifestDataProvider, - val commonDependencyModulesProvider: ModulesProvider? = null, val statsCollector: StatsCollector? = null, val progressLogger: ((String) -> Unit)? = null -) { - internal val commonTarget: SharedCommonizerTarget = SharedCommonizerTarget(targetProviders.targets.toSet()) - - internal val manifestDataProvider: TargetDependent - get() = TargetDependent(setOf(SharedCommonizerTarget(targetProviders.targets.toSet())) + targetProviders.targets) { target -> - if (target == commonTarget) return@TargetDependent commonManifestProvider - this.targetProviders.firstOrNull { it.target == target }?.manifestProvider?.let { return@TargetDependent it } - throw IllegalStateException("Illegal target $target") - } - -} +) fun CommonizerParameters.getCommonModuleNames(): Set { if (targetProviders.size < 2) return emptySet() // too few targets @@ -37,4 +30,10 @@ fun CommonizerParameters.getCommonModuleNames(): Set { return allModuleNames.reduce { a, b -> a intersect b } // there are modules that are present in every target } +internal fun CommonizerParameters.dependencyClassifiers(target: CommonizerTarget): CirProvidedClassifiers { + val modules = outputTarget.withAllAncestors() + .filter { it == target || it isAncestorOf target } + .mapNotNull { compatibleTarget -> dependenciesProvider[compatibleTarget] } + return CirProvidedClassifiers.of(modules.map { module -> CirProvidedClassifiers.by(module) } + CirFictitiousFunctionClassifiers) +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt index 3f50ae397e1..0aa7d0c7a67 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetDependent.kt @@ -36,8 +36,8 @@ internal fun TargetDependent.filterNonNull(): TargetDependent { internal fun TargetDependent.toMap(): Map { return mutableMapOf().apply { - for (key in keys) { - put(key, this@toMap[key]) + for (target in targets) { + put(target, this@toMap[target]) } } } @@ -55,8 +55,8 @@ internal fun TargetDependent.mapTargets(mapper: (CommonizerTarget) -> } -internal fun TargetDependent(map: Map): TargetDependent { - return MapBasedTargetDependent(map) +internal fun TargetDependent(map: Map): TargetDependent { + return MapBasedTargetDependent(map.toMap()) } internal fun TargetDependent(keys: Iterable, factory: (target: CommonizerTarget) -> T): TargetDependent { diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt index e05566a4721..8e7bcab23ec 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt @@ -5,15 +5,12 @@ package org.jetbrains.kotlin.commonizer -import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider import org.jetbrains.kotlin.library.SerializedMetadata import java.io.File class TargetProvider( val target: CommonizerTarget, - val modulesProvider: ModulesProvider, - val dependencyModulesProvider: ModulesProvider?, - val manifestProvider: NativeManifestDataProvider + val modulesProvider: ModulesProvider ) interface ModulesProvider { diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt index da3e11f6d51..950555d3439 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/cli/nativeTasks.kt @@ -68,7 +68,7 @@ internal class NativeKlibCommonize(options: Collection>) : Task(option } LibraryCommonizer( - commonTarget = outputCommonizerTarget, + outputTarget = outputCommonizerTarget, repository = repository, dependencies = StdlibRepository(distribution, libraryLoader) + FilesRepository(dependencyLibraries.toSet(), libraryLoader), @@ -119,7 +119,7 @@ internal class NativeDistributionCommonize(options: Collection>) : Tas println(description) LibraryCommonizer( - commonTarget = SharedCommonizerTarget(commonizerTargets.toSet()), + outputTarget = SharedCommonizerTarget(commonizerTargets.toSet()), repository = repository, dependencies = StdlibRepository(distribution, libraryLoader), resultsConsumer = resultsConsumer, diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt index 2de63c0acfd..0277822d7f0 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt @@ -9,11 +9,16 @@ import kotlinx.metadata.klib.ChunkedKlibModuleFragmentWriteStrategy import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult import org.jetbrains.kotlin.commonizer.ResultsConsumer.Status import org.jetbrains.kotlin.commonizer.core.CommonizationVisitor -import org.jetbrains.kotlin.commonizer.mergedtree.* -import org.jetbrains.kotlin.commonizer.mergedtree.CirNode.Companion.dimension +import org.jetbrains.kotlin.commonizer.mergedtree.CirCommonizedClassifierNodes +import org.jetbrains.kotlin.commonizer.mergedtree.CirKnownClassifiers +import org.jetbrains.kotlin.commonizer.mergedtree.CirNode.Companion.indexOfCommon +import org.jetbrains.kotlin.commonizer.mergedtree.CirNode.Companion.indices +import org.jetbrains.kotlin.commonizer.mergedtree.CirRootNode import org.jetbrains.kotlin.commonizer.metadata.CirTreeSerializer -import org.jetbrains.kotlin.commonizer.tree.deserializer.deserialize -import org.jetbrains.kotlin.commonizer.tree.merger.mergeCirTree +import org.jetbrains.kotlin.commonizer.tree.CirTreeRoot +import org.jetbrains.kotlin.commonizer.tree.assembleCirTree +import org.jetbrains.kotlin.commonizer.tree.deserializeCirTree +import org.jetbrains.kotlin.commonizer.tree.mergeCirTree import org.jetbrains.kotlin.library.SerializedMetadata import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.StorageManager @@ -25,37 +30,55 @@ fun runCommonization(parameters: CommonizerParameters) { } val storageManager = LockBasedStorageManager("Declarations commonization") - - val mergedTree = mergeAndCommonize(storageManager, parameters) - - // build resulting declarations: - for (targetIndex in 0 until mergedTree.dimension) { - serializeTarget(mergedTree, targetIndex, parameters) - } - + serializeCommonDeclarations(commonize(parameters, storageManager, parameters.outputTarget), parameters) parameters.resultsConsumer.allConsumed(Status.DONE) } -private fun mergeAndCommonize(storageManager: StorageManager, parameters: CommonizerParameters): CirRootNode { +private fun commonize( + parameters: CommonizerParameters, + storageManager: StorageManager, + target: SharedCommonizerTarget, +): CirRootNode { + val cirTrees = getCirTree(parameters, storageManager, target) + parameters.progressLogger?.invoke("Build cir tree for $target") + // build merged tree: val classifiers = CirKnownClassifiers( commonizedNodes = CirCommonizedClassifierNodes.default(), - commonDependencies = CirProvidedClassifiers.of( - CirFictitiousFunctionClassifiers, - CirProvidedClassifiers.by(parameters.commonDependencyModulesProvider) - ) + commonDependencies = parameters.dependencyClassifiers(target) ) - val targetTrees = parameters.targetProviders.mapValue { target -> deserialize(parameters, target) } - parameters.progressLogger?.invoke("Deserialized targets") - - val mergedTree = mergeCirTree(storageManager, classifiers, targetTrees) + val mergedTree = mergeCirTree(storageManager, classifiers, cirTrees) mergedTree.accept(CommonizationVisitor(classifiers, mergedTree), Unit) - parameters.progressLogger?.invoke("Commonized declarations") + parameters.progressLogger?.invoke("Commonized declarations for $target") + + serializeTargetDeclarations(mergedTree, parameters) + parameters.progressLogger?.invoke("Commonized target $target") return mergedTree } +private fun getCirTree( + parameters: CommonizerParameters, storageManager: StorageManager, target: SharedCommonizerTarget +): TargetDependent { + return TargetDependent(target.targets) { childTarget -> + when (childTarget) { + is LeafCommonizerTarget -> deserializeCirTree(parameters, parameters.targetProviders[childTarget]) + is SharedCommonizerTarget -> commonize(parameters, storageManager, childTarget).assembleCirTree() + } + } +} + +private fun serializeTargetDeclarations(mergedTree: CirRootNode, parameters: CommonizerParameters) { + for (targetIndex in (mergedTree.indices - mergedTree.indexOfCommon)) { + serializeTarget(mergedTree, targetIndex, parameters) + } +} + +private fun serializeCommonDeclarations(mergedTree: CirRootNode, parameters: CommonizerParameters) { + serializeTarget(mergedTree, mergedTree.indexOfCommon, parameters) +} + private fun serializeTarget(mergedTree: CirRootNode, targetIndex: Int, parameters: CommonizerParameters) { val target = mergedTree.getTarget(targetIndex) @@ -64,7 +87,7 @@ private fun serializeTarget(mergedTree: CirRootNode, targetIndex: Int, parameter val serializedMetadata = with(metadataModule.write(KLIB_FRAGMENT_WRITE_STRATEGY)) { SerializedMetadata(header, fragments, fragmentNames) } - val manifestData = parameters.manifestDataProvider[target].getManifest(libraryName) + val manifestData = parameters.manifestProvider[target].getManifest(libraryName) parameters.resultsConsumer.consume(target, ModuleResult.Commonized(libraryName, serializedMetadata, manifestData)) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt index f6e06498092..9c595cfb85f 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt @@ -11,9 +11,9 @@ import org.jetbrains.kotlin.commonizer.stats.StatsCollector import org.jetbrains.kotlin.commonizer.utils.ProgressLogger internal class LibraryCommonizer internal constructor( + private val outputTarget: SharedCommonizerTarget, private val repository: Repository, private val dependencies: Repository, - private val commonTarget: SharedCommonizerTarget, private val resultsConsumer: ResultsConsumer, private val statsCollector: StatsCollector?, private val progressLogger: ProgressLogger @@ -27,7 +27,7 @@ internal class LibraryCommonizer internal constructor( } private fun loadLibraries(): TargetDependent { - val librariesByTargets = commonTarget.targets.associateWith { target -> + val librariesByTargets = outputTarget.allLeaves().associateWith { target -> NativeLibrariesToCommonize(repository.getLibraries(target).toList()) } @@ -42,11 +42,12 @@ internal class LibraryCommonizer internal constructor( private fun commonizeAndSaveResults(allLibraries: TargetDependent) { val parameters = CommonizerParameters( - targetProviders = TargetDependent(commonTarget.targets) { target -> createTargetProvider(target, allLibraries[target]) } + outputTarget = outputTarget, + targetProviders = TargetDependent(outputTarget.allLeaves()) { target -> createTargetProvider(target, allLibraries[target]) } .filterNonNull(), + manifestProvider = createManifestProvider(allLibraries), + dependenciesProvider = createDependenciesProvider(), resultsConsumer = resultsConsumer, - commonManifestProvider = CommonNativeManifestDataProvider(commonTarget.targets.map { allLibraries[it] }), - commonDependencyModulesProvider = DefaultModulesProvider.create(dependencies.getLibraries(commonTarget)), statsCollector = statsCollector, progressLogger = progressLogger::log ) @@ -57,16 +58,33 @@ internal class LibraryCommonizer internal constructor( if (libraries.libraries.isEmpty()) return null return TargetProvider( target = target, - modulesProvider = DefaultModulesProvider.create(libraries), - dependencyModulesProvider = DefaultModulesProvider.create(dependencies.getLibraries(target)), - manifestProvider = libraries, + modulesProvider = DefaultModulesProvider.create(libraries) ) } + private fun createDependenciesProvider(): TargetDependent { + return TargetDependent(outputTarget.withAllAncestors()) { target -> + DefaultModulesProvider.create(dependencies.getLibraries(target)) + } + } + + private fun createManifestProvider( + libraries: TargetDependent + ): TargetDependent { + return TargetDependent(outputTarget.withAllAncestors()) { target -> + when (target) { + is LeafCommonizerTarget -> libraries[target] + is SharedCommonizerTarget -> CommonNativeManifestDataProvider( + target.allLeaves().map { leafTarget -> libraries[leafTarget] } + ) + } + } + } + private fun checkPreconditions() { - when (commonTarget.targets.size) { + when (outputTarget.allLeaves().size) { 0 -> progressLogger.fatal("No targets specified") - 1 -> progressLogger.fatal("Too few targets specified: $commonTarget") + 1 -> progressLogger.fatal("Too few targets specified: $outputTarget") } } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirClassNode.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirClassNode.kt index 5668d405270..38faa65bff7 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirClassNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirClassNode.kt @@ -7,11 +7,13 @@ package org.jetbrains.kotlin.commonizer.mergedtree import gnu.trove.THashMap import org.jetbrains.kotlin.commonizer.cir.CirClass +import org.jetbrains.kotlin.commonizer.cir.CirEntityId import org.jetbrains.kotlin.commonizer.cir.CirName import org.jetbrains.kotlin.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.storage.NullableLazyValue class CirClassNode( + val id: CirEntityId, override val targetDeclarations: CommonizedGroup, override val commonDeclaration: NullableLazyValue, ) : CirClassifierNode, CirNodeWithMembers { diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirNode.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirNode.kt index 52484237ed0..785eb825c14 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirNode.kt @@ -5,7 +5,10 @@ package org.jetbrains.kotlin.commonizer.mergedtree -import org.jetbrains.kotlin.commonizer.cir.* +import org.jetbrains.kotlin.commonizer.cir.CirClassifier +import org.jetbrains.kotlin.commonizer.cir.CirDeclaration +import org.jetbrains.kotlin.commonizer.cir.CirLiftedUpDeclaration +import org.jetbrains.kotlin.commonizer.cir.CirName import org.jetbrains.kotlin.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.commonizer.utils.firstNonNull import org.jetbrains.kotlin.storage.NullableLazyValue @@ -17,6 +20,8 @@ interface CirNode { fun accept(visitor: CirNodeVisitor, data: T): R companion object { + inline val CirNode<*, *>.indices: IntRange get() = 0..targetDeclarations.size + inline val CirNode<*, *>.indexOfCommon: Int get() = targetDeclarations.size diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirProvidedClassifiers.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirProvidedClassifiers.kt index b35edb4957d..68de9a650d4 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirProvidedClassifiers.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirProvidedClassifiers.kt @@ -5,11 +5,11 @@ package org.jetbrains.kotlin.commonizer.mergedtree -import org.jetbrains.kotlin.descriptors.Visibilities -import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.commonizer.ModulesProvider import org.jetbrains.kotlin.commonizer.cir.CirEntityId import org.jetbrains.kotlin.commonizer.utils.isUnderKotlinNativeSyntheticPackages +import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.types.Variance /** A set of classes and type aliases provided by libraries (either the libraries to commonize, or their dependency libraries)/ */ @@ -50,6 +50,10 @@ interface CirProvidedClassifiers { } } + fun of(delegates: Iterable): CirProvidedClassifiers { + return of(*delegates.filterNotNull().toTypedArray()) + } + fun by(modulesProvider: ModulesProvider?): CirProvidedClassifiers = if (modulesProvider != null) CirProvidedClassifiersByModules.load(modulesProvider) else EMPTY } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirTypeAliasNode.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirTypeAliasNode.kt index 4bdf7472796..68cc581af4f 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirTypeAliasNode.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/CirTypeAliasNode.kt @@ -6,11 +6,13 @@ package org.jetbrains.kotlin.commonizer.mergedtree import org.jetbrains.kotlin.commonizer.cir.CirClassifier +import org.jetbrains.kotlin.commonizer.cir.CirEntityId import org.jetbrains.kotlin.commonizer.cir.CirTypeAlias import org.jetbrains.kotlin.commonizer.utils.CommonizedGroup import org.jetbrains.kotlin.storage.NullableLazyValue class CirTypeAliasNode( + val id: CirEntityId, override val targetDeclarations: CommonizedGroup, override val commonDeclaration: NullableLazyValue, ) : CirClassifierNode, CirNodeWithLiftingUp { diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/mergers/RootMerger.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/mergers/RootMerger.kt index 0032457c3ac..9ed291ec21c 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/mergers/RootMerger.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/mergers/RootMerger.kt @@ -30,8 +30,7 @@ internal class RootMerger( val typeResolver = CirTypeResolver.create( providedClassifiers = CirProvidedClassifiers.of( CirProvidedClassifiers.by(targetProvider.modulesProvider), - CirProvidedClassifiers.by(targetProvider.dependencyModulesProvider), - classifiers.commonDependencies + parameters.dependencyClassifiers(targetProvider.target) ) ) targetMerger.processTarget( diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/nodeBuilders.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/nodeBuilders.kt index 5892c550d74..00f401e53dd 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/nodeBuilders.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/mergedtree/nodeBuilders.kt @@ -77,7 +77,7 @@ internal fun buildClassNode( commonizerProducer = { ClassCommonizer(classifiers) }, recursionMarker = CirClassRecursionMarker, nodeProducer = { targetDeclarations, commonDeclaration -> - CirClassNode(targetDeclarations, commonDeclaration).also { + CirClassNode(classId, targetDeclarations, commonDeclaration).also { classifiers.commonizedNodes.addClassNode(classId, it) } } @@ -105,7 +105,7 @@ internal fun buildTypeAliasNode( commonizerProducer = { TypeAliasCommonizer(classifiers) }, recursionMarker = CirClassifierRecursionMarker, nodeProducer = { targetDeclarations, commonDeclaration -> - CirTypeAliasNode(targetDeclarations, commonDeclaration).also { + CirTypeAliasNode(typeAliasId, targetDeclarations, commonDeclaration).also { classifiers.commonizedNodes.addTypeAliasNode(typeAliasId, it) } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/repository/FilesRepository.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/repository/FilesRepository.kt index 68675a55efa..58a516f074a 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/repository/FilesRepository.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/repository/FilesRepository.kt @@ -6,9 +6,9 @@ package org.jetbrains.kotlin.commonizer.repository import org.jetbrains.kotlin.commonizer.CommonizerTarget -import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget import org.jetbrains.kotlin.commonizer.NativeLibraryLoader import org.jetbrains.kotlin.commonizer.konan.NativeLibrary +import org.jetbrains.kotlin.commonizer.konanTargets import org.jetbrains.kotlin.konan.target.KonanTarget import java.io.File @@ -17,15 +17,15 @@ internal class FilesRepository( private val libraryLoader: NativeLibraryLoader ) : Repository { - private val librariesByTarget: Map> by lazy { + private val librariesByTarget: Map, Set> by lazy { libraryFiles .map(libraryLoader::invoke) - .groupBy { library -> CommonizerTarget(library.manifestData.nativeTargets.map(::konanTargetOrThrow)) } + .groupBy { library -> library.manifestData.nativeTargets.map(::konanTargetOrThrow).toSet() } .mapValues { (_, list) -> list.toSet() } } override fun getLibraries(target: CommonizerTarget): Set { - return librariesByTarget[target].orEmpty() + return librariesByTarget[target.konanTargets].orEmpty() } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/CirTree.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/CirTree.kt index de25f157b77..19fe6b8ba37 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/CirTree.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/CirTree.kt @@ -37,19 +37,23 @@ data class CirTreeFunction( val function: CirFunction ) +sealed interface CirTreeClassifier { + val id: CirEntityId +} + data class CirTreeTypeAlias( - val id: CirEntityId, + override val id: CirEntityId, val typeAlias: CirTypeAlias -) +) : CirTreeClassifier data class CirTreeClass( - val id: CirEntityId, + override val id: CirEntityId, val clazz: CirClass, val properties: List, val functions: List, val constructors: List, val classes: List, -) +) : CirTreeClassifier class CirTreeClassConstructor( val approximationKey: ConstructorApproximationKey, diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/assembelCirTree.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/assembelCirTree.kt new file mode 100644 index 00000000000..0379c8aad84 --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/assembelCirTree.kt @@ -0,0 +1,72 @@ +/* + * Copyright 2010-2021 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.commonizer.tree + +import org.jetbrains.kotlin.commonizer.cir.CirTypeAlias +import org.jetbrains.kotlin.commonizer.mergedtree.* + +internal fun CirRootNode.assembleCirTree(): CirTreeRoot { + return CirTreeRoot( + modules = modules.values.mapNotNull { it.assembleCirTree() } + ) +} + +internal fun CirModuleNode.assembleCirTree(): CirTreeModule? { + return CirTreeModule( + module = commonDeclaration() ?: return null, + packages = packages.values.mapNotNull { it.assembleCirTree() } + ) +} + +internal fun CirPackageNode.assembleCirTree(): CirTreePackage? { + return CirTreePackage( + pkg = commonDeclaration() ?: return null, + properties = properties.mapNotNull { (key, property) -> property.assembleCirTree(key) }, + functions = functions.mapNotNull { (key, function) -> function.assembleCirTree(key) }, + typeAliases = typeAliases.mapNotNull { (_, typeAlias) -> typeAlias.assembleCirTree() }, + classes = classes.mapNotNull { (_, clazz) -> clazz.assembleCirTree() } + ) +} + +internal fun CirClassNode.assembleCirTree(): CirTreeClass? { + return CirTreeClass( + id = id, + clazz = commonDeclaration() ?: return null, + properties = properties.mapNotNull { (key, property) -> property.assembleCirTree(key) }, + functions = functions.mapNotNull { (key, function) -> function.assembleCirTree(key) }, + constructors = constructors.mapNotNull { (key, constructor) -> constructor.assembleCirTree(key) }, + classes = classes.mapNotNull { (_, clazz) -> clazz.assembleCirTree() } + ) +} + +internal fun CirTypeAliasNode.assembleCirTree(): CirTreeTypeAlias? { + return CirTreeTypeAlias( + id = id, + typeAlias = commonDeclaration() as? CirTypeAlias ?: return null + ) +} + +internal fun CirPropertyNode.assembleCirTree(approximationKey: PropertyApproximationKey): CirTreeProperty? { + return CirTreeProperty( + approximationKey = approximationKey, + property = commonDeclaration() ?: return null, + ) +} + +internal fun CirFunctionNode.assembleCirTree(approximationKey: FunctionApproximationKey): CirTreeFunction? { + return CirTreeFunction( + approximationKey = approximationKey, + function = commonDeclaration() ?: return null, + ) +} + +internal fun CirClassConstructorNode.assembleCirTree(approximationKey: ConstructorApproximationKey): CirTreeClassConstructor? { + return CirTreeClassConstructor( + approximationKey = approximationKey, + constructor = commonDeclaration() ?: return null + ) +} + diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializeCirTree.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializeCirTree.kt new file mode 100644 index 00000000000..ff35c576656 --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializeCirTree.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2021 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.commonizer.tree + +import org.jetbrains.kotlin.commonizer.CommonizerParameters +import org.jetbrains.kotlin.commonizer.TargetProvider +import org.jetbrains.kotlin.commonizer.tree.deserializer.* + +internal val defaultCirTreeModuleDeserializer = CirTreeModuleDeserializer( + packageDeserializer = CirTreePackageDeserializer( + propertyDeserializer = CirTreePropertyDeserializer, + functionDeserializer = CirTreeFunctionDeserializer, + typeAliasDeserializer = CirTreeTypeAliasDeserializer, + classDeserializer = CirTreeClassDeserializer( + propertyDeserializer = CirTreePropertyDeserializer, + functionDeserializer = CirTreeFunctionDeserializer, + constructorDeserializer = CirTreeClassConstructorDeserializer + ) + ) +) + +internal val defaultCirTreeRootDeserializer = RootCirTreeDeserializer( + defaultCirTreeModuleDeserializer +) + + +internal fun deserializeCirTree(parameters: CommonizerParameters, target: TargetProvider): CirTreeRoot { + return defaultCirTreeRootDeserializer(parameters, target) +} diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ClassConstructorCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassConstructorDeserializer.kt similarity index 95% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ClassConstructorCirTreeDeserializer.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassConstructorDeserializer.kt index e060e750c3a..dd719161df0 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ClassConstructorCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassConstructorDeserializer.kt @@ -12,7 +12,7 @@ import org.jetbrains.kotlin.commonizer.metadata.CirDeserializers import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver import org.jetbrains.kotlin.commonizer.tree.CirTreeClassConstructor -internal object ClassConstructorCirTreeDeserializer { +internal object CirTreeClassConstructorDeserializer { operator fun invoke( constructor: KmConstructor, containingClass: CirContainingClass, typeResolver: CirTypeResolver ): CirTreeClassConstructor { diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ClassCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassDeserializer.kt similarity index 92% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ClassCirTreeDeserializer.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassDeserializer.kt index 668e9701141..68597f17729 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ClassCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeClassDeserializer.kt @@ -12,10 +12,10 @@ import org.jetbrains.kotlin.commonizer.metadata.CirDeserializers import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver import org.jetbrains.kotlin.commonizer.tree.CirTreeClass -internal class ClassCirTreeDeserializer( - private val propertyDeserializer: PropertyCirTreeDeserializer, - private val functionDeserializer: FunctionCirTreeDeserializer, - private val constructorDeserializer: ClassConstructorCirTreeDeserializer, +internal class CirTreeClassDeserializer( + private val propertyDeserializer: CirTreePropertyDeserializer, + private val functionDeserializer: CirTreeFunctionDeserializer, + private val constructorDeserializer: CirTreeClassConstructorDeserializer, ) { operator fun invoke( classEntry: ClassesToProcess.ClassEntry, classesToProcess: ClassesToProcess, typeResolver: CirTypeResolver diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/FunctionCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeFunctionDeserializer.kt similarity index 97% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/FunctionCirTreeDeserializer.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeFunctionDeserializer.kt index f78d47a1c07..6a3f474454b 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/FunctionCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeFunctionDeserializer.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.commonizer.utils.isFakeOverride import org.jetbrains.kotlin.commonizer.utils.isKniBridgeFunction import org.jetbrains.kotlin.commonizer.utils.isTopLevelDeprecatedFunction -object FunctionCirTreeDeserializer { +object CirTreeFunctionDeserializer { operator fun invoke(function: KmFunction, containingClass: CirContainingClass?, typeResolver: CirTypeResolver): CirTreeFunction? { val functionTypeResolver = typeResolver.create(function.typeParameters) if (function.isFakeOverride() diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ModuleCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeModuleDeserializer.kt similarity index 94% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ModuleCirTreeDeserializer.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeModuleDeserializer.kt index 947770a5119..44452c3f25a 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/ModuleCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeModuleDeserializer.kt @@ -17,8 +17,8 @@ import org.jetbrains.kotlin.commonizer.tree.CirTreeModule import org.jetbrains.kotlin.commonizer.utils.foldToMap import org.jetbrains.kotlin.library.SerializedMetadata -internal class ModuleCirTreeDeserializer( - private val packageDeserializer: PackageCirTreeDeserializer +internal class CirTreeModuleDeserializer( + private val packageDeserializer: CirTreePackageDeserializer ) { operator fun invoke(metadata: SerializedMetadata, typeResolver: CirTypeResolver): CirTreeModule { val module = KlibModuleMetadata.read(SerializedMetadataLibraryProvider(metadata)) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/PackageCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreePackageDeserializer.kt similarity index 87% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/PackageCirTreeDeserializer.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreePackageDeserializer.kt index e81b32a510d..2ef64148a51 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/PackageCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreePackageDeserializer.kt @@ -12,11 +12,11 @@ import org.jetbrains.kotlin.commonizer.mergedtree.mergers.ClassesToProcess import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver import org.jetbrains.kotlin.commonizer.tree.CirTreePackage -internal class PackageCirTreeDeserializer( - private val propertyDeserializer: PropertyCirTreeDeserializer, - private val functionDeserializer: FunctionCirTreeDeserializer, - private val typeAliasDeserializer: TypeAliasCirTreeDeserializer, - private val classDeserializer: ClassCirTreeDeserializer, +internal class CirTreePackageDeserializer( + private val propertyDeserializer: CirTreePropertyDeserializer, + private val functionDeserializer: CirTreeFunctionDeserializer, + private val typeAliasDeserializer: CirTreeTypeAliasDeserializer, + private val classDeserializer: CirTreeClassDeserializer, ) { operator fun invoke( packageName: CirPackageName, diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/PropertyCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreePropertyDeserializer.kt similarity index 97% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/PropertyCirTreeDeserializer.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreePropertyDeserializer.kt index 1c2e81861c3..7d2b3a80379 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/PropertyCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreePropertyDeserializer.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver import org.jetbrains.kotlin.commonizer.tree.CirTreeProperty import org.jetbrains.kotlin.commonizer.utils.isFakeOverride -object PropertyCirTreeDeserializer { +object CirTreePropertyDeserializer { operator fun invoke(property: KmProperty, containingClass: CirContainingClass?, typeResolver: CirTypeResolver): CirTreeProperty? { if (property.isFakeOverride()) return null val propertyTypeResolver = typeResolver.create(property.typeParameters) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/TypeAliasCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeTypeAliasDeserializer.kt similarity index 96% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/TypeAliasCirTreeDeserializer.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeTypeAliasDeserializer.kt index 061b6e77649..824e660b5c0 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/TypeAliasCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/CirTreeTypeAliasDeserializer.kt @@ -14,7 +14,7 @@ import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver import org.jetbrains.kotlin.commonizer.tree.CirTreeTypeAlias -internal object TypeAliasCirTreeDeserializer { +internal object CirTreeTypeAliasDeserializer { operator fun invoke(typeAlias: KmTypeAlias, packageName: CirPackageName, typeResolver: CirTypeResolver): CirTreeTypeAlias { val typeAliasTypeResolver = typeResolver.create(typeAlias.typeParameters) val typeAliasName = CirName.create(typeAlias.name) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/RootCirTreeDeserializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/RootCirTreeDeserializer.kt index 262cdda121c..48459dec550 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/RootCirTreeDeserializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/RootCirTreeDeserializer.kt @@ -7,14 +7,14 @@ package org.jetbrains.kotlin.commonizer.tree.deserializer import org.jetbrains.kotlin.commonizer.CommonizerParameters import org.jetbrains.kotlin.commonizer.TargetProvider +import org.jetbrains.kotlin.commonizer.dependencyClassifiers import org.jetbrains.kotlin.commonizer.getCommonModuleNames -import org.jetbrains.kotlin.commonizer.mergedtree.CirFictitiousFunctionClassifiers import org.jetbrains.kotlin.commonizer.mergedtree.CirProvidedClassifiers import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver import org.jetbrains.kotlin.commonizer.tree.CirTreeRoot internal class RootCirTreeDeserializer( - private val moduleDeserializer: ModuleCirTreeDeserializer + private val moduleDeserializer: CirTreeModuleDeserializer ) { operator fun invoke(parameters: CommonizerParameters, targetProvider: TargetProvider): CirTreeRoot { @@ -24,11 +24,7 @@ internal class RootCirTreeDeserializer( val typeResolver = CirTypeResolver.create( providedClassifiers = CirProvidedClassifiers.of( CirProvidedClassifiers.by(targetProvider.modulesProvider), - CirProvidedClassifiers.by(targetProvider.dependencyModulesProvider), - CirProvidedClassifiers.of( - CirFictitiousFunctionClassifiers, - CirProvidedClassifiers.by(parameters.commonDependencyModulesProvider) - ) + parameters.dependencyClassifiers(targetProvider.target) ) ) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/deserialize.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/deserialize.kt deleted file mode 100644 index c8625d6029f..00000000000 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/deserializer/deserialize.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2010-2021 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.commonizer.tree.deserializer - -import org.jetbrains.kotlin.commonizer.CommonizerParameters -import org.jetbrains.kotlin.commonizer.TargetProvider -import org.jetbrains.kotlin.commonizer.tree.CirTreeRoot - - -private val defaultRootCirTreeDeserializer = RootCirTreeDeserializer( - ModuleCirTreeDeserializer( - packageDeserializer = PackageCirTreeDeserializer( - propertyDeserializer = PropertyCirTreeDeserializer, - functionDeserializer = FunctionCirTreeDeserializer, - typeAliasDeserializer = TypeAliasCirTreeDeserializer, - classDeserializer = ClassCirTreeDeserializer( - propertyDeserializer = PropertyCirTreeDeserializer, - functionDeserializer = FunctionCirTreeDeserializer, - constructorDeserializer = ClassConstructorCirTreeDeserializer - ) - ) - ) -) - -internal fun deserialize(parameters: CommonizerParameters, target: TargetProvider): CirTreeRoot { - return defaultRootCirTreeDeserializer(parameters, target) -} diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/merger/merge.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/mergeCirTree.kt similarity index 98% rename from native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/merger/merge.kt rename to native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/mergeCirTree.kt index 36b1d9cbc62..681b83fb508 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/merger/merge.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/tree/mergeCirTree.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.commonizer.tree.merger +package org.jetbrains.kotlin.commonizer.tree import org.jetbrains.kotlin.commonizer.TargetDependent import org.jetbrains.kotlin.commonizer.cir.CirRoot diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt index bf60281883e..c29c5517545 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt @@ -208,17 +208,16 @@ private class AnalyzedModules( resultsConsumer: ResultsConsumer, manifestDataProvider: NativeManifestDataProvider = MockNativeManifestDataProvider() ) = CommonizerParameters( + outputTarget = SharedCommonizerTarget(leafTargets.toSet()), + manifestProvider = TargetDependent(sharedTarget.withAllAncestors()) { manifestDataProvider }, + dependenciesProvider = TargetDependent(sharedTarget.withAllAncestors()) { dependencyModules[it]?.let(MockModulesProvider::create) }, targetProviders = TargetDependent(leafTargets) { leafTarget -> TargetProvider( target = leafTarget, - modulesProvider = MockModulesProvider.create(originalModules.getValue(leafTarget)), - dependencyModulesProvider = dependencyModules[leafTarget]?.let(MockModulesProvider::create), - manifestProvider = manifestDataProvider + modulesProvider = MockModulesProvider.create(originalModules.getValue(leafTarget)) ) }, resultsConsumer = resultsConsumer, - commonManifestProvider = manifestDataProvider, - commonDependencyModulesProvider = dependencyModules[sharedTarget]?.let(MockModulesProvider::create) ) companion object { diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/TargetDependentTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/TargetDependentTest.kt new file mode 100644 index 00000000000..7d09d0078c2 --- /dev/null +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/TargetDependentTest.kt @@ -0,0 +1,39 @@ +/* + * Copyright 2010-2021 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.commonizer + +import org.junit.Test +import kotlin.test.assertEquals + +class TargetDependentTest { + @Test + fun toMap() { + val targetDependent = TargetDependent(listOf(LeafCommonizerTarget("a"), LeafCommonizerTarget("b"))) { + (it as LeafCommonizerTarget).name + } + + assertEquals( + mapOf(LeafCommonizerTarget("a") as CommonizerTarget to "a", LeafCommonizerTarget("b") as CommonizerTarget to "b"), + targetDependent.toMap() + ) + } + + @Test + fun `create from map`() { + val map = mapOf(LeafCommonizerTarget("a") to "a", LeafCommonizerTarget("b") to "b") + val targetDependent = map.toTargetDependent() + + assertEquals( + listOf(LeafCommonizerTarget("a"), LeafCommonizerTarget("b")), + targetDependent.targets + ) + + @Suppress("useless_cast") + assertEquals( + map.mapKeys { (k, _) -> k as CommonizerTarget }, targetDependent.toMap(), + ) + } +} diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt index c2bf0247c54..ac52745402d 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt @@ -53,7 +53,8 @@ private fun createValidClassifierId(classifierId: String): CirEntityId { internal val MOCK_CLASSIFIERS = CirKnownClassifiers( commonizedNodes = object : CirCommonizedClassifierNodes { - private val MOCK_CLASS_NODE = CirClassNode( + override fun classNode(classId: CirEntityId) = CirClassNode( + classId, CommonizedGroup(0), LockBasedStorageManager.NO_LOCKS.createNullableLazyValue { CirClass.create( @@ -73,7 +74,6 @@ internal val MOCK_CLASSIFIERS = CirKnownClassifiers( } ) - override fun classNode(classId: CirEntityId) = MOCK_CLASS_NODE override fun typeAliasNode(typeAliasId: CirEntityId) = error("This method should not be called") override fun addClassNode(classId: CirEntityId, node: CirClassNode) = error("This method should not be called") override fun addTypeAliasNode(typeAliasId: CirEntityId, node: CirTypeAliasNode) = error("This method should not be called")