mirror of
https://github.com/jlengrand/kotlin.git
synced 2026-03-10 08:31:29 +00:00
Move 'TargetDependent' into commonizer module make it an interface
This commit is contained in:
@@ -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,
|
||||
* 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 {
|
||||
if (major > 1
|
||||
|| 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,
|
||||
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
|
||||
)
|
||||
}
|
||||
|
||||
tasks.register("downloadNativeCompiler") {
|
||||
doFirst {
|
||||
if (NativeCompilerDownloader(project, konanVersion).compilerDirectory.exists()) return@doFirst
|
||||
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
|
||||
|
||||
import org.jetbrains.kotlin.commonizer.konan.TargetedNativeManifestDataProvider
|
||||
import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider
|
||||
import org.jetbrains.kotlin.commonizer.stats.StatsCollector
|
||||
|
||||
class CommonizerParameters(
|
||||
val resultsConsumer: ResultsConsumer,
|
||||
val manifestDataProvider: TargetedNativeManifestDataProvider,
|
||||
// common module dependencies (ex: Kotlin stdlib)
|
||||
val manifestDataProvider: TargetDependent<NativeManifestDataProvider>,
|
||||
val commonDependencyModulesProvider: ModulesProvider? = null,
|
||||
val statsCollector: StatsCollector? = 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)) {
|
||||
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))
|
||||
}
|
||||
|
||||
|
||||
@@ -37,20 +37,20 @@ internal class LibraryCommonizer internal constructor(
|
||||
}
|
||||
}
|
||||
progressLogger.log("Resolved libraries to be commonized")
|
||||
return librariesByTargets
|
||||
return TargetDependent(librariesByTargets)
|
||||
}
|
||||
|
||||
private fun commonizeAndSaveResults(allLibraries: TargetDependent<NativeLibrariesToCommonize>) {
|
||||
val parameters = CommonizerParameters(
|
||||
resultsConsumer = resultsConsumer,
|
||||
manifestDataProvider = TargetedNativeManifestDataProvider(allLibraries),
|
||||
manifestDataProvider = TargetDependentNativeManifestDataProvider(allLibraries),
|
||||
commonDependencyModulesProvider = DefaultModulesProvider.create(dependencies.getLibraries(commonTarget)),
|
||||
statsCollector = statsCollector,
|
||||
progressLogger = progressLogger::log
|
||||
)
|
||||
|
||||
allLibraries.forEach { (target, librariesToCommonize) ->
|
||||
parameters.addTarget(target, librariesToCommonize)
|
||||
commonTarget.targets.forEach { target ->
|
||||
parameters.addTarget(target, allLibraries[target])
|
||||
}
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
@file:Suppress("FunctionName")
|
||||
|
||||
package org.jetbrains.kotlin.commonizer.konan
|
||||
|
||||
import com.intellij.util.containers.FactoryMap
|
||||
import gnu.trove.THashMap
|
||||
import org.jetbrains.kotlin.commonizer.CommonizerTarget
|
||||
import org.jetbrains.kotlin.commonizer.LeafCommonizerTarget
|
||||
import org.jetbrains.kotlin.commonizer.SharedCommonizerTarget
|
||||
import org.jetbrains.kotlin.commonizer.TargetDependent
|
||||
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||
|
||||
fun interface TargetedNativeManifestDataProvider {
|
||||
fun getManifest(target: CommonizerTarget, libraryName: String): NativeSensitiveManifestData
|
||||
}
|
||||
|
||||
internal interface NativeManifestDataProvider {
|
||||
interface NativeManifestDataProvider {
|
||||
fun getManifest(libraryName: String): NativeSensitiveManifestData
|
||||
}
|
||||
|
||||
internal fun TargetedNativeManifestDataProvider(
|
||||
internal fun TargetDependentNativeManifestDataProvider(
|
||||
libraries: TargetDependent<NativeLibrariesToCommonize>
|
||||
): TargetedNativeManifestDataProvider {
|
||||
val cachedManifestProviders: Map<CommonizerTarget, NativeManifestDataProvider> = FactoryMap.create { target ->
|
||||
): TargetDependent<NativeManifestDataProvider> {
|
||||
return TargetDependent { target ->
|
||||
when (target) {
|
||||
is LeafCommonizerTarget -> libraries.getValue(target)
|
||||
is SharedCommonizerTarget -> CommonNativeManifestDataProvider(libraries.values)
|
||||
is LeafCommonizerTarget -> libraries[target]
|
||||
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.Status
|
||||
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.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies
|
||||
import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl
|
||||
@@ -205,9 +205,11 @@ private class AnalyzedModules(
|
||||
}
|
||||
|
||||
fun toCommonizerParameters(
|
||||
resultsConsumer: ResultsConsumer, manifestDataProvider: TargetedNativeManifestDataProvider = MockNativeManifestDataProvider()
|
||||
resultsConsumer: ResultsConsumer,
|
||||
manifestDataProvider: TargetDependent<NativeManifestDataProvider> = MockNativeManifestDataProvider()
|
||||
) = CommonizerParameters(
|
||||
resultsConsumer, manifestDataProvider, commonDependencyModulesProvider = dependencyModules[sharedTarget]?.let(MockModulesProvider::create)
|
||||
resultsConsumer, manifestDataProvider,
|
||||
commonDependencyModulesProvider = dependencyModules[sharedTarget]?.let(MockModulesProvider::create)
|
||||
).also { parameters ->
|
||||
|
||||
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.Status
|
||||
import org.jetbrains.kotlin.commonizer.konan.CommonNativeManifestDataProvider
|
||||
import org.jetbrains.kotlin.commonizer.konan.TargetedNativeManifestDataProvider
|
||||
import org.jetbrains.kotlin.commonizer.konan.NativeManifestDataProvider
|
||||
import org.jetbrains.kotlin.commonizer.utils.MockResultsConsumer
|
||||
import org.jetbrains.kotlin.commonizer.utils.MockModulesProvider
|
||||
import org.jetbrains.kotlin.commonizer.utils.MockNativeManifestDataProvider
|
||||
@@ -66,7 +65,8 @@ class CommonizerFacadeTest {
|
||||
|
||||
companion object {
|
||||
private fun Map<String, List<String>>.toCommonizerParameters(
|
||||
resultsConsumer: ResultsConsumer, manifestDataProvider: TargetedNativeManifestDataProvider = MockNativeManifestDataProvider()
|
||||
resultsConsumer: ResultsConsumer,
|
||||
manifestDataProvider: TargetDependent<NativeManifestDataProvider> = MockNativeManifestDataProvider()
|
||||
) = CommonizerParameters(resultsConsumer, manifestDataProvider).also { parameters ->
|
||||
forEach { (targetName, moduleNames) ->
|
||||
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.
|
||||
*/
|
||||
|
||||
@file:Suppress("TestFunctionName")
|
||||
|
||||
package org.jetbrains.kotlin.commonizer.utils
|
||||
|
||||
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.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.TargetedNativeManifestDataProvider
|
||||
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
|
||||
@@ -173,15 +176,20 @@ fun MockNativeManifestDataProvider(
|
||||
exportForwardDeclarations: List<String> = emptyList(),
|
||||
nativeTargets: Collection<String> = emptyList(),
|
||||
shortName: String? = "mock"
|
||||
): TargetedNativeManifestDataProvider = TargetedNativeManifestDataProvider { _, _ ->
|
||||
NativeSensitiveManifestData(
|
||||
uniqueName = uniqueName,
|
||||
versions = versions,
|
||||
dependencies = dependencies,
|
||||
isInterop = isInterop,
|
||||
packageFqName = packageFqName,
|
||||
exportForwardDeclarations = exportForwardDeclarations,
|
||||
nativeTargets = nativeTargets,
|
||||
shortName = shortName
|
||||
)
|
||||
): TargetDependent<NativeManifestDataProvider> = 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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user