From 0a35d750394b6e80cae5a25cc0e28c16aea816a6 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 24 Mar 2021 20:02:15 +0100 Subject: [PATCH] [Commonizer] CommonizerParameters: Require TargetProviders as constructor argument --- .../kotlin/commonizer/CommonizerParameters.kt | 41 ++++++++++--------- .../kotlin/commonizer/TargetProvider.kt | 4 +- .../commonizer/konan/LibraryCommonizer.kt | 27 ++++-------- .../kotlin/commonizer/konan/NativeLibrary.kt | 11 ----- .../mergedtree/mergers/RootMerger.kt | 5 +-- .../AbstractCommonizationFromSourcesTest.kt | 28 ++++++------- .../kotlin/commonizer/CommonizerFacadeTest.kt | 24 ++++++----- .../kotlin/commonizer/utils/mocks.kt | 28 ++++++------- 8 files changed, 71 insertions(+), 97 deletions(-) diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt index 132853c83bf..7f8e2e2d4b0 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/CommonizerParameters.kt @@ -9,34 +9,35 @@ import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider import org.jetbrains.kotlin.commonizer.stats.StatsCollector class CommonizerParameters( + val targetProviders: List, val resultsConsumer: ResultsConsumer, - val manifestDataProvider: TargetDependent, + val commonManifestProvider: NativeManifestDataProvider, val commonDependencyModulesProvider: ModulesProvider? = null, val statsCollector: StatsCollector? = null, val progressLogger: ((String) -> Unit)? = null ) { - // use linked hash map to preserve order - private val _targetProviders = LinkedHashMap() - val targetProviders: List get() = _targetProviders.values.toList() + internal val commonTarget: SharedCommonizerTarget = SharedCommonizerTarget(targetProviders.map { it.target }.toSet()) - fun addTarget(targetProvider: TargetProvider): CommonizerParameters { - require(targetProvider.target !in _targetProviders) { "Target ${targetProvider.target} is already added" } - _targetProviders[targetProvider.target] = targetProvider - - return this - } - - fun getCommonModuleNames(): Set { - if (_targetProviders.size < 2) return emptySet() // too few targets - - val allModuleNames: List> = _targetProviders.values.map { targetProvider -> - targetProvider.modulesProvider.loadModuleInfos().mapTo(HashSet()) { it.name } + internal val manifestDataProvider: TargetDependent + get() = TargetDependent { target -> + if (target == commonTarget) return@TargetDependent commonManifestProvider + this.targetProviders.firstOrNull { it.target == target }?.manifestProvider?.let { return@TargetDependent it } + null } - return allModuleNames.reduce { a, b -> a intersect b } // there are modules that are present in every target +} + +fun CommonizerParameters.getCommonModuleNames(): Set { + if (targetProviders.size < 2) return emptySet() // too few targets + + val allModuleNames: List> = targetProviders.map { targetProvider -> + targetProvider.modulesProvider.loadModuleInfos().mapTo(HashSet()) { it.name } } - fun hasAnythingToCommonize(): Boolean { - return getCommonModuleNames().isNotEmpty() - } + return allModuleNames.reduce { a, b -> a intersect b } // there are modules that are present in every target } + +fun CommonizerParameters.hasAnythingToCommonize(): Boolean { + return getCommonModuleNames().isNotEmpty() +} + diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt index 39d709d1e56..e05566a4721 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/TargetProvider.kt @@ -5,13 +5,15 @@ 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 dependencyModulesProvider: ModulesProvider?, + val manifestProvider: NativeManifestDataProvider ) interface ModulesProvider { 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 c051e2c363a..fd3d781bcea 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt @@ -42,32 +42,23 @@ internal class LibraryCommonizer internal constructor( private fun commonizeAndSaveResults(allLibraries: TargetDependent) { val parameters = CommonizerParameters( + targetProviders = commonTarget.targets.mapNotNull { target -> createTargetProvider(target, allLibraries[target]) }, resultsConsumer = resultsConsumer, - manifestDataProvider = TargetDependentNativeManifestDataProvider(allLibraries), + commonManifestProvider = CommonNativeManifestDataProvider(commonTarget.targets.map { allLibraries[it] }), commonDependencyModulesProvider = DefaultModulesProvider.create(dependencies.getLibraries(commonTarget)), statsCollector = statsCollector, progressLogger = progressLogger::log ) - - commonTarget.targets.forEach { target -> - parameters.addTarget(target, allLibraries[target]) - } - runCommonization(parameters) } - private fun CommonizerParameters.addTarget(target: CommonizerTarget, libraries: NativeLibrariesToCommonize) { - if (libraries.libraries.isEmpty()) return - - val modulesProvider = DefaultModulesProvider.create(libraries) - val dependencyModuleProvider = DefaultModulesProvider.create(dependencies.getLibraries(target)) - - addTarget( - TargetProvider( - target = target, - modulesProvider = modulesProvider, - dependencyModulesProvider = dependencyModuleProvider - ) + private fun createTargetProvider(target: CommonizerTarget, libraries: NativeLibrariesToCommonize): TargetProvider? { + if (libraries.libraries.isEmpty()) return null + return TargetProvider( + target = target, + modulesProvider = DefaultModulesProvider.create(libraries), + dependencyModulesProvider = DefaultModulesProvider.create(dependencies.getLibraries(target)), + manifestProvider = libraries, ) } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeLibrary.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeLibrary.kt index 595cebd358b..f659de37a96 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeLibrary.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeLibrary.kt @@ -17,17 +17,6 @@ interface NativeManifestDataProvider { fun getManifest(libraryName: String): NativeSensitiveManifestData } -internal fun TargetDependentNativeManifestDataProvider( - libraries: TargetDependent -): TargetDependent { - return TargetDependent { target -> - when (target) { - is LeafCommonizerTarget -> libraries[target] - is SharedCommonizerTarget -> CommonNativeManifestDataProvider(target.targets.map { libraries[it] }) - } - } -} - /** * A separate Kotlin/Native library. */ 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 5262e1baa49..0032457c3ac 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 @@ -5,12 +5,9 @@ package org.jetbrains.kotlin.commonizer.mergedtree.mergers -import org.jetbrains.kotlin.commonizer.CommonizerParameters -import org.jetbrains.kotlin.commonizer.CommonizerTarget -import org.jetbrains.kotlin.commonizer.ModulesProvider +import org.jetbrains.kotlin.commonizer.* import org.jetbrains.kotlin.commonizer.mergedtree.* import org.jetbrains.kotlin.commonizer.metadata.CirTypeResolver -import org.jetbrains.kotlin.commonizer.prettyName import org.jetbrains.kotlin.storage.StorageManager internal class RootMerger( diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt index b8eb2d3ded7..195e93574a3 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt @@ -206,24 +206,20 @@ private class AnalyzedModules( fun toCommonizerParameters( resultsConsumer: ResultsConsumer, - manifestDataProvider: TargetDependent = MockNativeManifestDataProvider() + manifestDataProvider: NativeManifestDataProvider = MockNativeManifestDataProvider() ) = CommonizerParameters( - resultsConsumer, manifestDataProvider, - commonDependencyModulesProvider = dependencyModules[sharedTarget]?.let(MockModulesProvider::create) - ).also { parameters -> - - leafTargets.forEach { leafTarget -> - val originalModule = originalModules.getValue(leafTarget) - - parameters.addTarget( - TargetProvider( - target = leafTarget, - modulesProvider = MockModulesProvider.create(originalModule), - dependencyModulesProvider = dependencyModules[leafTarget]?.let(MockModulesProvider::create) - ) + targetProviders = leafTargets.map { leafTarget -> + TargetProvider( + target = leafTarget, + modulesProvider = MockModulesProvider.create(originalModules.getValue(leafTarget)), + dependencyModulesProvider = dependencyModules[leafTarget]?.let(MockModulesProvider::create), + manifestProvider = manifestDataProvider ) - } - } + }, + resultsConsumer = resultsConsumer, + commonManifestProvider = manifestDataProvider, + commonDependencyModulesProvider = dependencyModules[sharedTarget]?.let(MockModulesProvider::create) + ) companion object { fun create( diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt index bc674ec0cfb..8cfff714c99 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt @@ -64,20 +64,22 @@ class CommonizerFacadeTest { ) companion object { + private fun Map>.toCommonizerParameters( resultsConsumer: ResultsConsumer, - manifestDataProvider: TargetDependent = MockNativeManifestDataProvider() - ) = CommonizerParameters(resultsConsumer, manifestDataProvider).also { parameters -> - forEach { (targetName, moduleNames) -> - parameters.addTarget( - TargetProvider( - target = LeafCommonizerTarget(targetName), - modulesProvider = MockModulesProvider.create(moduleNames), - dependencyModulesProvider = null - ) + manifestDataProvider: NativeManifestDataProvider = MockNativeManifestDataProvider() + ) = CommonizerParameters( + targetProviders = map { (targetName, moduleNames) -> + TargetProvider( + target = LeafCommonizerTarget(targetName), + modulesProvider = MockModulesProvider.create(moduleNames), + dependencyModulesProvider = null, + manifestProvider = manifestDataProvider, ) - } - } + }, + resultsConsumer = resultsConsumer, + commonManifestProvider = manifestDataProvider + ) private fun doTestNothingToCommonize(originalModules: Map>) { val results = MockResultsConsumer() 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 b03a524281f..c2bf0247c54 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult import org.jetbrains.kotlin.commonizer.cir.* import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider import org.jetbrains.kotlin.commonizer.konan.NativeSensitiveManifestData -import org.jetbrains.kotlin.commonizer.konan.TargetDependentNativeManifestDataProvider import org.jetbrains.kotlin.commonizer.mergedtree.* import org.jetbrains.kotlin.library.KotlinLibraryVersioning import org.jetbrains.kotlin.library.SerializedMetadata @@ -176,20 +175,17 @@ fun MockNativeManifestDataProvider( exportForwardDeclarations: List = emptyList(), nativeTargets: Collection = emptyList(), shortName: String? = "mock" -): TargetDependent = TargetDependent { - object : NativeManifestDataProvider { - override fun getManifest(libraryName: String): NativeSensitiveManifestData { - return NativeSensitiveManifestData( - uniqueName = uniqueName, - versions = versions, - dependencies = dependencies, - isInterop = isInterop, - packageFqName = packageFqName, - exportForwardDeclarations = exportForwardDeclarations, - nativeTargets = nativeTargets, - shortName = shortName - ) - } +): NativeManifestDataProvider = object : NativeManifestDataProvider { + override fun getManifest(libraryName: String): NativeSensitiveManifestData { + return NativeSensitiveManifestData( + uniqueName = uniqueName, + versions = versions, + dependencies = dependencies, + isInterop = isInterop, + packageFqName = packageFqName, + exportForwardDeclarations = exportForwardDeclarations, + nativeTargets = nativeTargets, + shortName = shortName + ) } - }