diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt index 522bccfe071..4dccb4543c4 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt @@ -22,6 +22,19 @@ const val KLIB_PROPERTY_INTEROP = "interop" const val KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS = "exportForwardDeclarations" const val KLIB_PROPERTY_NATIVE_TARGETS = "native_targets" +// Commonizer-specific: +/** + * Identity String of the commonizer target representing this artifact. + * This will also include native targets that were absent during commonization + */ +const val KLIB_PROPERTY_COMMONIZER_TARGET = "commonizer_target" + +/** + * Similar to [KLIB_PROPERTY_NATIVE_TARGETS] but this will also preserve targets + * that were unsupported on the host creating this artifact + */ +const val KLIB_PROPERTY_COMMONIZER_NATIVE_TARGETS = "commonizer_native_targets" + /** * Abstractions for getting access to the information stored inside of Kotlin/Native library. */ @@ -31,6 +44,7 @@ interface BaseKotlinLibrary { val libraryFile: File val componentList: List val versions: KotlinLibraryVersioning + // Whether this library is default (provided by distribution)? val isDefault: Boolean val manifestProperties: Properties @@ -80,4 +94,12 @@ val BaseKotlinLibrary.nativeTargets: List get() = manifestProperties.propertyList(KLIB_PROPERTY_NATIVE_TARGETS) val KotlinLibrary.containsErrorCode: Boolean - get() = manifestProperties.getProperty(KLIB_PROPERTY_CONTAINS_ERROR_CODE) == "true" \ No newline at end of file + get() = manifestProperties.getProperty(KLIB_PROPERTY_CONTAINS_ERROR_CODE) == "true" + +val KotlinLibrary.commonizerTarget: String? + get() = manifestProperties.getProperty(KLIB_PROPERTY_COMMONIZER_TARGET) + +val KotlinLibrary.commonizerNativeTargets: List? + get() = if (manifestProperties.containsKey(KLIB_PROPERTY_COMMONIZER_NATIVE_TARGETS)) + manifestProperties.propertyList(KLIB_PROPERTY_COMMONIZER_NATIVE_TARGETS, escapeInQuotes = true) + else null diff --git a/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/CommonizeLibcurlTest.kt b/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/CommonizeLibcurlTest.kt index 4d9cd9de9cc..563c00cda5a 100644 --- a/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/CommonizeLibcurlTest.kt +++ b/native/commonizer-api/test/org/jetbrains/kotlin/commonizer/CommonizeLibcurlTest.kt @@ -81,6 +81,14 @@ class CommonizeLibcurlTest { assertContainsManifestWithContent(x64OutputDirectory, "native_targets=linux_x64") assertContainsManifestWithContent(arm64OutputDirectory, "native_targets=linux_arm64") - assertContainsManifestWithContent(commonOutputDirectory, "native_targets=linux_x64 linux_arm64") + assertContainsManifestWithContent(commonOutputDirectory, "native_targets=linux_arm64 linux_x64") + + assertContainsManifestWithContent(x64OutputDirectory, "commonizer_target=linux_x64") + assertContainsManifestWithContent(arm64OutputDirectory, "commonizer_target=linux_arm64") + + assertContainsManifestWithContent(commonOutputDirectory, "commonizer_native_targets=linux_arm64 linux_x64") + assertContainsManifestWithContent( + commonOutputDirectory, "commonizer_target=${CommonizerTarget(LINUX_X64, LINUX_ARM64).identityString}" + ) } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/UniqueLibraryName.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/UniqueLibraryName.kt new file mode 100644 index 00000000000..545631ad8c9 --- /dev/null +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/UniqueLibraryName.kt @@ -0,0 +1,8 @@ +/* + * 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 + +internal typealias UniqueLibraryName = String diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt index 19dd280c736..89b09c86031 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/facade.kt @@ -105,7 +105,7 @@ private fun serialize(parameters: CommonizerParameters, mergedTree: CirRootNode, val serializedMetadata = with(metadataModule.write(KLIB_FRAGMENT_WRITE_STRATEGY)) { SerializedMetadata(header, fragments, fragmentNames) } - val manifestData = parameters.manifestProvider[target].getManifest(libraryName) + val manifestData = parameters.manifestProvider[target].buildManifest(libraryName) parameters.resultsConsumer.consume(target, ModuleResult.Commonized(libraryName, serializedMetadata, manifestData)) } parameters.resultsConsumer.targetConsumed(target) 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 78140bf6d1d..5b8ddffce36 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/LibraryCommonizer.kt @@ -29,7 +29,7 @@ internal class LibraryCommonizer internal constructor( private fun loadLibraries(): TargetDependent { val libraries = EagerTargetDependent(outputTarget.allLeaves()) { target -> - repository.getLibraries(target).toList().ifNotEmpty(::NativeLibrariesToCommonize) + repository.getLibraries(target).toList().ifNotEmpty { NativeLibrariesToCommonize(target, this) } } libraries.forEachWithTarget { target, librariesOrNull -> @@ -76,8 +76,8 @@ internal class LibraryCommonizer internal constructor( return TargetDependent(outputTarget.withAllAncestors()) { target -> when (target) { is LeafCommonizerTarget -> libraries[target] ?: error("Can't provide manifest for missing target $target") - is SharedCommonizerTarget -> CommonNativeManifestDataProvider( - target.allLeaves().mapNotNull { leafTarget -> libraries.getOrNull(leafTarget) } + is SharedCommonizerTarget -> NativeManifestDataProvider( + target, target.allLeaves().mapNotNull { leafTarget -> libraries.getOrNull(leafTarget) } ) } } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/ModuleSerializer.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/ModuleSerializer.kt index 6637f2187c2..79cb6241d68 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/ModuleSerializer.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/ModuleSerializer.kt @@ -47,13 +47,13 @@ private fun writeLibrary( moduleName = manifestData.uniqueName, versions = manifestData.versions, builtInsPlatform = BuiltInsPlatform.NATIVE, - nativeTargets = emptyList(), // will be overwritten with NativeSensitiveManifestData.applyTo() below + nativeTargets = emptyList(), // will be overwritten with addManifest(manifestData) below nopack = true, shortName = manifestData.shortName, layout = layout ) library.addMetadata(metadata) - manifestData.applyTo(library.base as BaseWriterImpl) + (library.base as BaseWriterImpl).addManifest(manifestData) library.commit() } 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 6145ae54ccd..713fac0af6e 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeLibrary.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeLibrary.kt @@ -8,10 +8,12 @@ package org.jetbrains.kotlin.commonizer.konan import gnu.trove.THashMap +import org.jetbrains.kotlin.commonizer.CommonizerTarget +import org.jetbrains.kotlin.commonizer.UniqueLibraryName import org.jetbrains.kotlin.library.KotlinLibrary interface NativeManifestDataProvider { - fun getManifest(libraryName: String): NativeSensitiveManifestData + fun buildManifest(libraryName: UniqueLibraryName): NativeSensitiveManifestData } /** @@ -26,43 +28,61 @@ internal class NativeLibrary( /** * A collection of Kotlin/Native libraries for a certain Native target. */ -internal class NativeLibrariesToCommonize(val libraries: List) : NativeManifestDataProvider { +internal class NativeLibrariesToCommonize( + private val target: CommonizerTarget, + val libraries: List +) : NativeManifestDataProvider { private val manifestIndex: Map = buildManifestIndex() - override fun getManifest(libraryName: String) = manifestIndex.getValue(libraryName) + override fun buildManifest( + libraryName: String + ): NativeSensitiveManifestData { + return manifestIndex.getValue(libraryName).copy( + commonizerTarget = target + ) + } companion object { - fun create(libraries: List) = NativeLibrariesToCommonize(libraries.map(::NativeLibrary)) + internal fun create(target: CommonizerTarget, libraries: List) = NativeLibrariesToCommonize( + target, libraries.map(::NativeLibrary) + ) } } internal class CommonNativeManifestDataProvider( - libraryGroups: Collection + private val target: CommonizerTarget, + private val manifests: Map> ) : NativeManifestDataProvider { - private val manifestIndex: Map - init { - val iterator = libraryGroups.iterator() - val index = iterator.next().buildManifestIndex() + override fun buildManifest(libraryName: UniqueLibraryName): NativeSensitiveManifestData { + val rawManifests = manifests[libraryName] ?: error("Missing manifests for $libraryName") + check(rawManifests.isNotEmpty()) { "No manifests for $libraryName" } - while (iterator.hasNext()) { - val otherIndex = iterator.next().buildManifestIndex() - otherIndex.forEach { (libraryName, otherManifestData) -> - val manifestData = index[libraryName] - if (manifestData != null) { - // merge manifests - index[libraryName] = manifestData.mergeWith(otherManifestData) - } else { - index[libraryName] = otherManifestData - } - } - } + val isInterop = rawManifests.all { it.isInterop } - manifestIndex = index + return NativeSensitiveManifestData( + uniqueName = libraryName, + versions = rawManifests.first().versions, + dependencies = rawManifests.map { it.dependencies }.reduce { acc, list -> acc.intersect(list).toList() }, + isInterop = isInterop, + packageFqName = rawManifests.first().packageFqName, + exportForwardDeclarations = if (isInterop) rawManifests.map { it.exportForwardDeclarations } + .reduce { acc, list -> acc.intersect(list).toList() } else emptyList(), + nativeTargets = rawManifests.flatMapTo(mutableSetOf()) { it.nativeTargets }, + shortName = rawManifests.first().shortName, + commonizerTarget = target + ) } - - override fun getManifest(libraryName: String) = manifestIndex.getValue(libraryName) } -private fun NativeLibrariesToCommonize.buildManifestIndex(): MutableMap = +internal fun NativeManifestDataProvider(target: CommonizerTarget, libraries: List): NativeManifestDataProvider { + val manifestsByName = libraries + .flatMap { it.libraries } + .groupByTo(THashMap()) { it.manifestData.uniqueName } + .mapValues { (_, libraries) -> libraries.map { it.manifestData } } + + return CommonNativeManifestDataProvider(target, manifestsByName) +} + +private fun NativeLibrariesToCommonize.buildManifestIndex(): MutableMap = libraries.map { it.manifestData }.associateByTo(THashMap()) { it.uniqueName } diff --git a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeSensitiveManifestData.kt b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeSensitiveManifestData.kt index 68d7706d8e7..3c07b821d1d 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeSensitiveManifestData.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/konan/NativeSensitiveManifestData.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.commonizer.konan +import org.jetbrains.kotlin.commonizer.* import org.jetbrains.kotlin.konan.properties.propertyList import org.jetbrains.kotlin.library.* import org.jetbrains.kotlin.library.impl.BaseWriterImpl @@ -14,66 +15,16 @@ import org.jetbrains.kotlin.library.impl.BaseWriterImpl * preserved in commonized libraries (both for "common" and platform-specific library parts). */ data class NativeSensitiveManifestData( - val uniqueName: String, + val uniqueName: UniqueLibraryName, val versions: KotlinLibraryVersioning, val dependencies: List, val isInterop: Boolean, val packageFqName: String?, val exportForwardDeclarations: List, val nativeTargets: Collection, - val shortName: String? + val shortName: String?, + val commonizerTarget: CommonizerTarget?, ) { - fun applyTo(library: BaseWriterImpl) { - library.manifestProperties[KLIB_PROPERTY_UNIQUE_NAME] = uniqueName - - // note: versions can't be added here - - fun addOptionalProperty(name: String, condition: Boolean, value: () -> String) = - if (condition) - library.manifestProperties[name] = value() - else - library.manifestProperties.remove(name) - - addOptionalProperty(KLIB_PROPERTY_DEPENDS, dependencies.isNotEmpty()) { dependencies.joinToString(separator = " ") } - addOptionalProperty(KLIB_PROPERTY_INTEROP, isInterop) { "true" } - addOptionalProperty(KLIB_PROPERTY_PACKAGE, packageFqName != null) { packageFqName!! } - addOptionalProperty(KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS, exportForwardDeclarations.isNotEmpty() || isInterop) { - exportForwardDeclarations.joinToString(" ") - } - addOptionalProperty(KLIB_PROPERTY_NATIVE_TARGETS, nativeTargets.isNotEmpty()) { - nativeTargets.joinToString(" ") - } - addOptionalProperty(KLIB_PROPERTY_SHORT_NAME, shortName != null) { shortName!! } - } - - fun mergeWith(other: NativeSensitiveManifestData): NativeSensitiveManifestData { - if (this === other) return this - - check(uniqueName == other.uniqueName) - - // Merge algorithm: - // - Unite native target lists. - // - Intersect dependency lists. - // - Boolean and 'isInterop'. - // - If both libs are 'isInterop' then intersect exported forward declaration lists. - // - Other properties can be taken from 'this' manifest. - - val bothAreInterop = isInterop && other.isInterop - - return NativeSensitiveManifestData( - uniqueName = uniqueName, - versions = versions, - dependencies = (dependencies intersect other.dependencies).toList(), - isInterop = bothAreInterop, - packageFqName = packageFqName, - exportForwardDeclarations = if (bothAreInterop) (exportForwardDeclarations intersect other.exportForwardDeclarations).toList() else emptyList(), - nativeTargets = HashSet().apply { - addAll(nativeTargets) - addAll(other.nativeTargets) - }, - shortName = shortName - ) - } companion object { fun readFrom(library: KotlinLibrary) = NativeSensitiveManifestData( @@ -84,7 +35,41 @@ data class NativeSensitiveManifestData( packageFqName = library.packageFqName, exportForwardDeclarations = library.exportForwardDeclarations, nativeTargets = library.nativeTargets, - shortName = library.shortName + shortName = library.shortName, + commonizerTarget = library.commonizerTarget?.let(::parseCommonizerTargetOrNull), ) } } + +private inline fun BaseWriterImpl.addOptionalProperty(name: String, condition: Boolean, value: () -> String) { + if (condition) manifestProperties[name] = value() + else manifestProperties.remove(name) +} + +fun BaseWriterImpl.addManifest(manifest: NativeSensitiveManifestData) { + manifestProperties[KLIB_PROPERTY_UNIQUE_NAME] = manifest.uniqueName + + // note: versions can't be added here + + addOptionalProperty(KLIB_PROPERTY_DEPENDS, manifest.dependencies.isNotEmpty()) { manifest.dependencies.joinToString(separator = " ") } + addOptionalProperty(KLIB_PROPERTY_INTEROP, manifest.isInterop) { "true" } + addOptionalProperty(KLIB_PROPERTY_PACKAGE, manifest.packageFqName != null) { manifest.packageFqName!! } + addOptionalProperty(KLIB_PROPERTY_EXPORT_FORWARD_DECLARATIONS, manifest.exportForwardDeclarations.isNotEmpty() || manifest.isInterop) { + manifest.exportForwardDeclarations.joinToString(" ") + } + + addOptionalProperty(KLIB_PROPERTY_NATIVE_TARGETS, manifest.nativeTargets.isNotEmpty()) { + manifest.nativeTargets.sorted().joinToString(" ") + } + + addOptionalProperty(KLIB_PROPERTY_SHORT_NAME, manifest.shortName != null) { manifest.shortName!! } + + addOptionalProperty(KLIB_PROPERTY_COMMONIZER_TARGET, manifest.commonizerTarget != null) { + manifest.commonizerTarget?.identityString ?: error("Unexpected missing 'commonizerTarget'") + } + + addOptionalProperty(KLIB_PROPERTY_COMMONIZER_NATIVE_TARGETS, manifest.commonizerTarget != null) { + manifest.commonizerTarget?.konanTargets?.map { it.name }?.sorted()?.joinToString(" ") + ?: error("Unexpected missing 'commonizerTarget'") + } +} 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 11d2d71775a..f5d308bc998 100644 --- a/native/commonizer/src/org/jetbrains/kotlin/commonizer/repository/FilesRepository.kt +++ b/native/commonizer/src/org/jetbrains/kotlin/commonizer/repository/FilesRepository.kt @@ -20,7 +20,10 @@ internal class FilesRepository( private val librariesByKonanTargets: Map, Set> by lazy { libraryFiles .map(libraryLoader::invoke) - .groupBy { library -> library.manifestData.nativeTargets.map(::konanTargetOrThrow).toSet() } + .groupBy { library -> + library.manifestData.commonizerTarget?.konanTargets + ?: library.manifestData.nativeTargets.map(::konanTargetOrThrow).toSet() + } .mapValues { (_, list) -> list.toSet() } } diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt index c29c5517545..6beb7b5cc25 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractCommonizationFromSourcesTest.kt @@ -206,10 +206,10 @@ private class AnalyzedModules( fun toCommonizerParameters( resultsConsumer: ResultsConsumer, - manifestDataProvider: NativeManifestDataProvider = MockNativeManifestDataProvider() + manifestDataProvider: (CommonizerTarget) -> NativeManifestDataProvider = { MockNativeManifestDataProvider(it) } ) = CommonizerParameters( outputTarget = SharedCommonizerTarget(leafTargets.toSet()), - manifestProvider = TargetDependent(sharedTarget.withAllAncestors()) { manifestDataProvider }, + manifestProvider = TargetDependent(sharedTarget.withAllAncestors(), manifestDataProvider), dependenciesProvider = TargetDependent(sharedTarget.withAllAncestors()) { dependencyModules[it]?.let(MockModulesProvider::create) }, targetProviders = TargetDependent(leafTargets) { leafTarget -> TargetProvider( diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractInlineSourcesCommonizationTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractInlineSourcesCommonizationTest.kt index 19886973d06..dd169d0d4a4 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractInlineSourcesCommonizationTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/AbstractInlineSourcesCommonizationTest.kt @@ -148,11 +148,11 @@ abstract class AbstractInlineSourcesCommonizationTest : KtInlineSourceCommonizer private fun Parameters.toCommonizerParameters( resultsConsumer: ResultsConsumer, - manifestDataProvider: NativeManifestDataProvider = MockNativeManifestDataProvider() + manifestDataProvider: (CommonizerTarget) -> NativeManifestDataProvider = { MockNativeManifestDataProvider(it) } ): CommonizerParameters { return CommonizerParameters( outputTarget = outputTarget, - manifestProvider = TargetDependent(outputTarget.withAllAncestors()) { manifestDataProvider }, + manifestProvider = TargetDependent(outputTarget.withAllAncestors(), manifestDataProvider), dependenciesProvider = TargetDependent(outputTarget.withAllAncestors()) { target -> val explicitDependencies = dependencies.getOrNull(target).orEmpty().map { module -> createModuleDescriptor(module) } val implicitDependencies = listOfNotNull(if (target == outputTarget) DefaultBuiltIns.Instance.builtInsModule else null) diff --git a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt index ecf10290ca3..bbcc9aa7456 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/CommonizerFacadeTest.kt @@ -67,7 +67,7 @@ class CommonizerFacadeTest { private fun Map>.toCommonizerParameters( resultsConsumer: ResultsConsumer, - manifestDataProvider: NativeManifestDataProvider = MockNativeManifestDataProvider() + manifestDataProvider: (CommonizerTarget) -> NativeManifestDataProvider = { MockNativeManifestDataProvider(it) } ): CommonizerParameters { val targetDependentModuleNames = mapKeys { (targetName, _) -> LeafCommonizerTarget(targetName) }.toTargetDependent() val sharedTarget = SharedCommonizerTarget(targetDependentModuleNames.targets.toSet()) @@ -75,7 +75,7 @@ class CommonizerFacadeTest { return CommonizerParameters( outputTarget = sharedTarget, dependenciesProvider = TargetDependent(sharedTarget.withAllAncestors()) { null }, - manifestProvider = TargetDependent(sharedTarget.withAllAncestors()) { manifestDataProvider }, + manifestProvider = TargetDependent(sharedTarget.withAllAncestors(), manifestDataProvider), targetProviders = targetDependentModuleNames.map { target, moduleNames -> TargetProvider( target = target, 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 d6e9289c02f..fb2244fd8e3 100644 --- a/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt +++ b/native/commonizer/tests/org/jetbrains/kotlin/commonizer/utils/mocks.kt @@ -9,8 +9,6 @@ package org.jetbrains.kotlin.commonizer.utils import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataMonolithicSerializer import org.jetbrains.kotlin.backend.common.serialization.metadata.KlibMetadataVersion -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl -import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.commonizer.* import org.jetbrains.kotlin.commonizer.ModulesProvider.ModuleInfo import org.jetbrains.kotlin.commonizer.ResultsConsumer.ModuleResult @@ -18,6 +16,8 @@ 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.mergedtree.* +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.library.KotlinLibraryVersioning import org.jetbrains.kotlin.library.SerializedMetadata import org.jetbrains.kotlin.storage.LockBasedStorageManager @@ -148,7 +148,7 @@ internal class MockResultsConsumer : ResultsConsumer { override fun consume(target: CommonizerTarget, moduleResult: ModuleResult) { check(!this::status.isInitialized) - check(target !in finishedTargets) { "$target already finished"} + check(target !in finishedTargets) { "$target already finished" } val moduleResults: ModuleResults = _modulesByTargets.getOrPut(target) { ModuleResults() } val oldResult = moduleResults.put(moduleResult.libraryName, moduleResult) check(oldResult == null) // to avoid accidental overwriting @@ -169,6 +169,7 @@ internal class MockResultsConsumer : ResultsConsumer { } fun MockNativeManifestDataProvider( + target: CommonizerTarget, uniqueName: String = "mock", versions: KotlinLibraryVersioning = KotlinLibraryVersioning(null, null, null, null, null), dependencies: List = emptyList(), @@ -178,7 +179,7 @@ fun MockNativeManifestDataProvider( nativeTargets: Collection = emptyList(), shortName: String? = "mock" ): NativeManifestDataProvider = object : NativeManifestDataProvider { - override fun getManifest(libraryName: String): NativeSensitiveManifestData { + override fun buildManifest(libraryName: UniqueLibraryName): NativeSensitiveManifestData { return NativeSensitiveManifestData( uniqueName = uniqueName, versions = versions, @@ -187,7 +188,8 @@ fun MockNativeManifestDataProvider( packageFqName = packageFqName, exportForwardDeclarations = exportForwardDeclarations, nativeTargets = nativeTargets, - shortName = shortName + shortName = shortName, + commonizerTarget = target, ) } }