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

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,
* 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()
}
}

View File

@@ -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>

View File

@@ -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

View File

@@ -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
}

View File

@@ -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))
}

View File

@@ -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)

View File

@@ -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)
}
}
/**

View File

@@ -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 ->

View File

@@ -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(

View File

@@ -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
)
}
}
}