Move 'TargetDependent' into commonizer module make it an interface

This commit is contained in:
sebastian.sellmair
2021-03-24 16:15:30 +01:00
parent bce92d824a
commit cdbede09df
10 changed files with 98 additions and 53 deletions
+6 -3
View File
@@ -43,7 +43,7 @@ sourceSets {
* TODO: This version hack on migrating period K/N into repository Kotlin, in new build infrostructure zero maintance claus isn't dropped, * TODO: This version hack on migrating period K/N into repository Kotlin, in new build infrostructure zero maintance claus isn't dropped,
* so for old builds we need to keep this version to string representation till total switch on new infrostructure. * so for old builds we need to keep this version to string representation till total switch on new infrostructure.
*/ */
val konanVersion = object: org.jetbrains.kotlin.konan.CompilerVersion by NativeCompilerDownloader.DEFAULT_KONAN_VERSION { val konanVersion = object : org.jetbrains.kotlin.konan.CompilerVersion by NativeCompilerDownloader.DEFAULT_KONAN_VERSION {
override fun toString(showMeta: Boolean, showBuild: Boolean) = buildString { override fun toString(showMeta: Boolean, showBuild: Boolean) = buildString {
if (major > 1 if (major > 1
|| minor > 5 || minor > 5
@@ -71,12 +71,15 @@ val konanVersion = object: org.jetbrains.kotlin.konan.CompilerVersion by NativeC
} }
} }
override fun toString() = toString(meta != org.jetbrains.kotlin.konan.MetaVersion.RELEASE, override fun toString() = toString(
meta != org.jetbrains.kotlin.konan.MetaVersion.RELEASE) meta != org.jetbrains.kotlin.konan.MetaVersion.RELEASE,
meta != org.jetbrains.kotlin.konan.MetaVersion.RELEASE
)
} }
tasks.register("downloadNativeCompiler") { tasks.register("downloadNativeCompiler") {
doFirst { doFirst {
if (NativeCompilerDownloader(project, konanVersion).compilerDirectory.exists()) return@doFirst
NativeCompilerDownloader(project, konanVersion).downloadIfNeeded() NativeCompilerDownloader(project, konanVersion).downloadIfNeeded()
} }
} }
@@ -1,9 +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
public typealias TargetDependent<T> = Map<CommonizerTarget, T>
@@ -5,13 +5,12 @@
package org.jetbrains.kotlin.commonizer package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.konan.TargetedNativeManifestDataProvider import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider
import org.jetbrains.kotlin.commonizer.stats.StatsCollector import org.jetbrains.kotlin.commonizer.stats.StatsCollector
class CommonizerParameters( class CommonizerParameters(
val resultsConsumer: ResultsConsumer, val resultsConsumer: ResultsConsumer,
val manifestDataProvider: TargetedNativeManifestDataProvider, val manifestDataProvider: TargetDependent<NativeManifestDataProvider>,
// common module dependencies (ex: Kotlin stdlib)
val commonDependencyModulesProvider: ModulesProvider? = null, val commonDependencyModulesProvider: ModulesProvider? = null,
val statsCollector: StatsCollector? = null, val statsCollector: StatsCollector? = null,
val progressLogger: ((String) -> Unit)? = null val progressLogger: ((String) -> Unit)? = null
@@ -0,0 +1,49 @@
/*
* 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.
*/
@file:Suppress("FunctionName")
package org.jetbrains.kotlin.commonizer
sealed interface TargetDependent<T : Any> {
fun getOrNull(target: CommonizerTarget): T?
operator fun get(target: CommonizerTarget): T {
return getOrNull(target) ?: throw NoSuchElementException("Missing element for target ${target.prettyName}")
}
}
internal fun <T : Any> Map<CommonizerTarget, T>.toTargetDependent(): TargetDependent<T> {
return TargetDependent(toMap())
}
internal fun <T : Any> Map<CommonizerTarget, T>.asTargetDependent(): TargetDependent<T> {
return TargetDependent(this)
}
internal fun <T : Any, R : Any> TargetDependent<T>.map(mapper: (T) -> R): TargetDependent<R> {
return TargetDependent { target -> this@map.getOrNull(target)?.let(mapper) }
}
internal fun <T : Any> TargetDependent(map: Map<CommonizerTarget, T>): TargetDependent<T> {
return MapBasedTargetDependent(map)
}
internal fun <T : Any> TargetDependent(factory: (target: CommonizerTarget) -> T?): TargetDependent<T> {
return FactoryBasedTargetDependent(factory)
}
private class MapBasedTargetDependent<T : Any>(private val map: Map<CommonizerTarget, T>) : TargetDependent<T> {
override fun getOrNull(target: CommonizerTarget): T? = map[target]
}
private class FactoryBasedTargetDependent<T : Any>(private val factory: (target: CommonizerTarget) -> T?) : TargetDependent<T> {
private val values = mutableMapOf<CommonizerTarget, Any>()
override fun getOrNull(target: CommonizerTarget): T? {
@Suppress("unchecked_cast")
return values.getOrPut(target) { factory(target) ?: Null }.takeIf { it != Null }?.run { this as T }
}
private object Null
}
@@ -62,7 +62,7 @@ private fun serializeTarget(mergeResult: CirTreeMergeResult, targetIndex: Int, p
val serializedMetadata = with(metadataModule.write(KLIB_FRAGMENT_WRITE_STRATEGY)) { val serializedMetadata = with(metadataModule.write(KLIB_FRAGMENT_WRITE_STRATEGY)) {
SerializedMetadata(header, fragments, fragmentNames) SerializedMetadata(header, fragments, fragmentNames)
} }
val manifestData = parameters.manifestDataProvider.getManifest(target, libraryName) val manifestData = parameters.manifestDataProvider[target].getManifest(libraryName)
parameters.resultsConsumer.consume(target, ModuleResult.Commonized(libraryName, serializedMetadata, manifestData)) parameters.resultsConsumer.consume(target, ModuleResult.Commonized(libraryName, serializedMetadata, manifestData))
} }
@@ -37,20 +37,20 @@ internal class LibraryCommonizer internal constructor(
} }
} }
progressLogger.log("Resolved libraries to be commonized") progressLogger.log("Resolved libraries to be commonized")
return librariesByTargets return TargetDependent(librariesByTargets)
} }
private fun commonizeAndSaveResults(allLibraries: TargetDependent<NativeLibrariesToCommonize>) { private fun commonizeAndSaveResults(allLibraries: TargetDependent<NativeLibrariesToCommonize>) {
val parameters = CommonizerParameters( val parameters = CommonizerParameters(
resultsConsumer = resultsConsumer, resultsConsumer = resultsConsumer,
manifestDataProvider = TargetedNativeManifestDataProvider(allLibraries), manifestDataProvider = TargetDependentNativeManifestDataProvider(allLibraries),
commonDependencyModulesProvider = DefaultModulesProvider.create(dependencies.getLibraries(commonTarget)), commonDependencyModulesProvider = DefaultModulesProvider.create(dependencies.getLibraries(commonTarget)),
statsCollector = statsCollector, statsCollector = statsCollector,
progressLogger = progressLogger::log progressLogger = progressLogger::log
) )
allLibraries.forEach { (target, librariesToCommonize) -> commonTarget.targets.forEach { target ->
parameters.addTarget(target, librariesToCommonize) parameters.addTarget(target, allLibraries[target])
} }
runCommonization(parameters) runCommonization(parameters)
@@ -3,36 +3,29 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:Suppress("FunctionName")
package org.jetbrains.kotlin.commonizer.konan package org.jetbrains.kotlin.commonizer.konan
import com.intellij.util.containers.FactoryMap
import gnu.trove.THashMap import gnu.trove.THashMap
import org.jetbrains.kotlin.commonizer.CommonizerTarget
import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
import org.jetbrains.kotlin.commonizer.TargetDependent import org.jetbrains.kotlin.commonizer.TargetDependent
import org.jetbrains.kotlin.library.KotlinLibrary import org.jetbrains.kotlin.library.KotlinLibrary
fun interface TargetedNativeManifestDataProvider { interface NativeManifestDataProvider {
fun getManifest(target: CommonizerTarget, libraryName: String): NativeSensitiveManifestData
}
internal interface NativeManifestDataProvider {
fun getManifest(libraryName: String): NativeSensitiveManifestData fun getManifest(libraryName: String): NativeSensitiveManifestData
} }
internal fun TargetedNativeManifestDataProvider( internal fun TargetDependentNativeManifestDataProvider(
libraries: TargetDependent<NativeLibrariesToCommonize> libraries: TargetDependent<NativeLibrariesToCommonize>
): TargetedNativeManifestDataProvider { ): TargetDependent<NativeManifestDataProvider> {
val cachedManifestProviders: Map<CommonizerTarget, NativeManifestDataProvider> = FactoryMap.create { target -> return TargetDependent { target ->
when (target) { when (target) {
is LeafCommonizerTarget -> libraries.getValue(target) is LeafCommonizerTarget -> libraries[target]
is SharedCommonizerTarget -> CommonNativeManifestDataProvider(libraries.values) is SharedCommonizerTarget -> CommonNativeManifestDataProvider(target.targets.map { libraries[it] })
} }
} }
return TargetedNativeManifestDataProvider { target, libraryName ->
cachedManifestProviders.getValue(target).getManifest(libraryName)
}
} }
/** /**
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult
import org.jetbrains.kotlin.commonizer.ResultsConsumer.Status import org.jetbrains.kotlin.commonizer.ResultsConsumer.Status
import org.jetbrains.kotlin.commonizer.SourceModuleRoot.Companion.SHARED_TARGET_NAME import org.jetbrains.kotlin.commonizer.SourceModuleRoot.Companion.SHARED_TARGET_NAME
import org.jetbrains.kotlin.commonizer.konan.TargetedNativeManifestDataProvider import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider
import org.jetbrains.kotlin.commonizer.utils.* import org.jetbrains.kotlin.commonizer.utils.*
import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
@@ -205,9 +205,11 @@ private class AnalyzedModules(
} }
fun toCommonizerParameters( fun toCommonizerParameters(
resultsConsumer: ResultsConsumer, manifestDataProvider: TargetedNativeManifestDataProvider = MockNativeManifestDataProvider() resultsConsumer: ResultsConsumer,
manifestDataProvider: TargetDependent<NativeManifestDataProvider> = MockNativeManifestDataProvider()
) = CommonizerParameters( ) = CommonizerParameters(
resultsConsumer, manifestDataProvider, commonDependencyModulesProvider = dependencyModules[sharedTarget]?.let(MockModulesProvider::create) resultsConsumer, manifestDataProvider,
commonDependencyModulesProvider = dependencyModules[sharedTarget]?.let(MockModulesProvider::create)
).also { parameters -> ).also { parameters ->
leafTargets.forEach { leafTarget -> leafTargets.forEach { leafTarget ->
@@ -7,8 +7,7 @@ package org.jetbrains.kotlin.commonizer
import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult
import org.jetbrains.kotlin.commonizer.ResultsConsumer.Status import org.jetbrains.kotlin.commonizer.ResultsConsumer.Status
import org.jetbrains.kotlin.commonizer.konan.CommonNativeManifestDataProvider import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider
import org.jetbrains.kotlin.commonizer.konan.TargetedNativeManifestDataProvider
import org.jetbrains.kotlin.commonizer.utils.MockResultsConsumer import org.jetbrains.kotlin.commonizer.utils.MockResultsConsumer
import org.jetbrains.kotlin.commonizer.utils.MockModulesProvider import org.jetbrains.kotlin.commonizer.utils.MockModulesProvider
import org.jetbrains.kotlin.commonizer.utils.MockNativeManifestDataProvider import org.jetbrains.kotlin.commonizer.utils.MockNativeManifestDataProvider
@@ -66,7 +65,8 @@ class CommonizerFacadeTest {
companion object { companion object {
private fun Map<String, List<String>>.toCommonizerParameters( private fun Map<String, List<String>>.toCommonizerParameters(
resultsConsumer: ResultsConsumer, manifestDataProvider: TargetedNativeManifestDataProvider = MockNativeManifestDataProvider() resultsConsumer: ResultsConsumer,
manifestDataProvider: TargetDependent<NativeManifestDataProvider> = MockNativeManifestDataProvider()
) = CommonizerParameters(resultsConsumer, manifestDataProvider).also { parameters -> ) = CommonizerParameters(resultsConsumer, manifestDataProvider).also { parameters ->
forEach { (targetName, moduleNames) -> forEach { (targetName, moduleNames) ->
parameters.addTarget( parameters.addTarget(
@@ -3,6 +3,8 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/ */
@file:Suppress("TestFunctionName")
package org.jetbrains.kotlin.commonizer.utils package org.jetbrains.kotlin.commonizer.utils
import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer
@@ -13,8 +15,9 @@ import org.jetbrains.kotlin.commonizer.*
import org.jetbrains.kotlin.commonizer.ModulesProvider.ModuleInfo import org.jetbrains.kotlin.commonizer.ModulesProvider.ModuleInfo
import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult
import org.jetbrains.kotlin.commonizer.cir.* 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.NativeSensitiveManifestData
import org.jetbrains.kotlin.commonizer.konan.TargetedNativeManifestDataProvider import org.jetbrains.kotlin.commonizer.konan.TargetDependentNativeManifestDataProvider
import org.jetbrains.kotlin.commonizer.mergedtree.* import org.jetbrains.kotlin.commonizer.mergedtree.*
import org.jetbrains.kotlin.library.KotlinLibraryVersioning import org.jetbrains.kotlin.library.KotlinLibraryVersioning
import org.jetbrains.kotlin.library.SerializedMetadata import org.jetbrains.kotlin.library.SerializedMetadata
@@ -173,15 +176,20 @@ fun MockNativeManifestDataProvider(
exportForwardDeclarations: List<String> = emptyList(), exportForwardDeclarations: List<String> = emptyList(),
nativeTargets: Collection<String> = emptyList(), nativeTargets: Collection<String> = emptyList(),
shortName: String? = "mock" shortName: String? = "mock"
): TargetedNativeManifestDataProvider = TargetedNativeManifestDataProvider { _, _ -> ): TargetDependent<NativeManifestDataProvider> = TargetDependent {
NativeSensitiveManifestData( object : NativeManifestDataProvider {
uniqueName = uniqueName, override fun getManifest(libraryName: String): NativeSensitiveManifestData {
versions = versions, return NativeSensitiveManifestData(
dependencies = dependencies, uniqueName = uniqueName,
isInterop = isInterop, versions = versions,
packageFqName = packageFqName, dependencies = dependencies,
exportForwardDeclarations = exportForwardDeclarations, isInterop = isInterop,
nativeTargets = nativeTargets, packageFqName = packageFqName,
shortName = shortName exportForwardDeclarations = exportForwardDeclarations,
) nativeTargets = nativeTargets,
shortName = shortName
)
}
}
} }