[kpm] Introduce GradleKpm* naming convention (1/2)

All Gradle specific kpm entities shall be disambiguated by using
the `GradleKpm` prefix. For example `MyEntity` shall now be called
`GradleKpmMyEntity` and a subclass would be called like
`GradleKpmSpecialMyEntity`
This commit is contained in:
sebastian.sellmair
2022-05-24 14:30:16 +02:00
committed by Space
parent e55f00c3d9
commit dcd47a89dd
144 changed files with 1651 additions and 1573 deletions
@@ -14,4 +14,4 @@ import org.jetbrains.kotlin.project.model.*
*/ */
interface GradleKpmCompilerPlugin : Plugin<Project> { interface GradleKpmCompilerPlugin : Plugin<Project> {
val kpmCompilerPlugin: KpmCompilerPlugin val kpmCompilerPlugin: KpmCompilerPlugin
} }
@@ -0,0 +1,15 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.publish.maven.MavenPublication
interface GradleKpmSingleMavenPublishedModuleHolder {
fun assignMavenPublication(publication: MavenPublication)
fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit)
val defaultPublishedModuleSuffix: String?
val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider
}
@@ -0,0 +1,46 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.project.model.LanguageSettings
interface GradleKpmVariantCompilationData<T : KotlinCommonOptions> : KotlinCompilationData<T> {
override val owner: GradleKpmVariant
override val project: Project get() = owner.containingModule.project
override val compilationPurpose: String
get() = owner.containingModule.name
override val compilationClassifier: String
get() = owner.name
override val output: KotlinCompilationOutput
get() = owner.compilationOutputs
override val compileKotlinTaskName: String
override val compileAllTaskName: String
override val kotlinSourceDirectoriesByFragmentName: Map<String, SourceDirectorySet>
override val compileDependencyFiles: FileCollection
get() = owner.compileDependencyFiles
override val languageSettings: LanguageSettings
get() = owner.languageSettings
override val platformType: KotlinPlatformType
get() = owner.platformType
override val ownModuleName: String
}
@@ -38,34 +38,3 @@ interface KotlinCompilationData<T : KotlinCommonOptions> {
val friendPaths: Iterable<FileCollection> val friendPaths: Iterable<FileCollection>
} }
interface KotlinVariantCompilationData<T : KotlinCommonOptions> : KotlinCompilationData<T> {
override val owner: KpmGradleVariant
override val project: Project get() = owner.containingModule.project
override val compilationPurpose: String
get() = owner.containingModule.name
override val compilationClassifier: String
get() = owner.name
override val output: KotlinCompilationOutput
get() = owner.compilationOutputs
override val compileKotlinTaskName: String
override val compileAllTaskName: String
override val kotlinSourceDirectoriesByFragmentName: Map<String, SourceDirectorySet>
override val compileDependencyFiles: FileCollection
get() = owner.compileDependencyFiles
override val languageSettings: LanguageSettings
get() = owner.languageSettings
override val platformType: KotlinPlatformType
get() = owner.platformType
override val ownModuleName: String
}
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
interface KotlinDependencyConfigurations { interface GradleKpmDependencyConfigurations {
val apiConfiguration: Configuration val apiConfiguration: Configuration
val implementationConfiguration: Configuration val implementationConfiguration: Configuration
val compileOnlyConfiguration: Configuration val compileOnlyConfiguration: Configuration
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfigurations { interface GradleKpmFragmentDependencyConfigurations : GradleKpmDependencyConfigurations {
/** This configuration includes the dependencies from the refines-parents */ /** This configuration includes the dependencies from the refines-parents */
val transitiveApiConfiguration: Configuration val transitiveApiConfiguration: Configuration
@@ -25,7 +25,7 @@ interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfiguration
override val transitiveApiConfiguration: Configuration, override val transitiveApiConfiguration: Configuration,
override val transitiveImplementationConfiguration: Configuration, override val transitiveImplementationConfiguration: Configuration,
override val transitiveRuntimeOnlyConfiguration: Configuration override val transitiveRuntimeOnlyConfiguration: Configuration
) : KotlinFragmentDependencyConfigurations ) : GradleKpmFragmentDependencyConfigurations
companion object { companion object {
fun create( fun create(
@@ -36,7 +36,7 @@ interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfiguration
transitiveApiConfiguration: Configuration, transitiveApiConfiguration: Configuration,
transitiveImplementationConfiguration: Configuration, transitiveImplementationConfiguration: Configuration,
transitiveRuntimeOnlyConfiguration: Configuration transitiveRuntimeOnlyConfiguration: Configuration
): KotlinFragmentDependencyConfigurations = Impl( ): GradleKpmFragmentDependencyConfigurations = Impl(
apiConfiguration = apiConfiguration, apiConfiguration = apiConfiguration,
implementationConfiguration = implementationConfiguration, implementationConfiguration = implementationConfiguration,
compileOnlyConfiguration = compileOnlyConfiguration, compileOnlyConfiguration = compileOnlyConfiguration,
@@ -18,10 +18,10 @@ import org.jetbrains.kotlin.tooling.core.MutableExtras
import org.jetbrains.kotlin.tooling.core.closure import org.jetbrains.kotlin.tooling.core.closure
import org.jetbrains.kotlin.tooling.core.withClosure import org.jetbrains.kotlin.tooling.core.withClosure
interface KpmGradleFragment : KpmFragment, HasKotlinDependencies, KotlinFragmentDependencyConfigurations, Named { interface GradleKpmFragment : KpmFragment, HasKotlinDependencies, GradleKpmFragmentDependencyConfigurations, Named {
override val kotlinSourceRoots: SourceDirectorySet override val kotlinSourceRoots: SourceDirectorySet
override val containingModule: KpmGradleModule override val containingModule: GradleKpmModule
override fun getName(): String = fragmentName override fun getName(): String = fragmentName
@@ -32,16 +32,16 @@ interface KpmGradleFragment : KpmFragment, HasKotlinDependencies, KotlinFragment
val extras: MutableExtras val extras: MutableExtras
fun refines(other: KpmGradleFragment) fun refines(other: GradleKpmFragment)
fun refines(other: NamedDomainObjectProvider<KpmGradleFragment>) fun refines(other: NamedDomainObjectProvider<GradleKpmFragment>)
override val declaredRefinesDependencies: Iterable<KpmGradleFragment> override val declaredRefinesDependencies: Iterable<GradleKpmFragment>
override val refinesClosure: Set<KpmGradleFragment> override val refinesClosure: Set<GradleKpmFragment>
get() = this.closure { it.declaredRefinesDependencies } get() = this.closure { it.declaredRefinesDependencies }
override val withRefinesClosure: Set<KpmGradleFragment> override val withRefinesClosure: Set<GradleKpmFragment>
get() = this.withClosure { it.declaredRefinesDependencies } get() = this.withClosure { it.declaredRefinesDependencies }
override fun dependencies(configureClosure: Closure<Any?>) = override fun dependencies(configureClosure: Closure<Any?>) =
@@ -69,8 +69,8 @@ interface KpmGradleFragment : KpmFragment, HasKotlinDependencies, KotlinFragment
listOf(transitiveApiConfiguration.name, transitiveImplementationConfiguration.name) listOf(transitiveApiConfiguration.name, transitiveImplementationConfiguration.name)
} }
val KpmGradleFragment.path: String val GradleKpmFragment.path: String
get() = "${project.path}/${containingModule.name}/$fragmentName" get() = "${project.path}/${containingModule.name}/$fragmentName"
val KpmGradleFragment.containingVariants: Set<KpmGradleVariant> val GradleKpmFragment.containingVariants: Set<GradleKpmVariant>
get() = containingModule.variantsContainingFragment(this).map { it as KpmGradleVariant }.toSet() get() = containingModule.variantsContainingFragment(this).map { it as GradleKpmVariant }.toSet()
@@ -16,14 +16,14 @@ import org.jetbrains.kotlin.project.model.KpmModule
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
import org.jetbrains.kotlin.project.model.KpmCompilerPlugin import org.jetbrains.kotlin.project.model.KpmCompilerPlugin
interface KpmGradleModule : KpmModule, Named, HasKotlinDependencies { interface GradleKpmModule : KpmModule, Named, HasKotlinDependencies {
val project: Project val project: Project
val moduleClassifier: String? val moduleClassifier: String?
override val fragments: ExtensiblePolymorphicDomainObjectContainer<KpmGradleFragment> override val fragments: ExtensiblePolymorphicDomainObjectContainer<GradleKpmFragment>
// TODO DSL & build script model: find a way to create a flexible typed view on fragments? // TODO DSL & build script model: find a way to create a flexible typed view on fragments?
override val variants: NamedDomainObjectSet<KpmGradleVariant> override val variants: NamedDomainObjectSet<GradleKpmVariant>
override val plugins: Set<KpmCompilerPlugin> override val plugins: Set<KpmCompilerPlugin>
@@ -47,10 +47,10 @@ interface KpmGradleModule : KpmModule, Named, HasKotlinDependencies {
// DSL // DSL
val common: KpmGradleFragment val common: GradleKpmFragment
get() = fragments.getByName(KpmGradleFragment.COMMON_FRAGMENT_NAME) get() = fragments.getByName(GradleKpmFragment.COMMON_FRAGMENT_NAME)
fun common(configure: KpmGradleFragment.() -> Unit) = fun common(configure: GradleKpmFragment.() -> Unit) =
common.configure() common.configure()
override fun dependencies(configure: KotlinDependencyHandler.() -> Unit) = override fun dependencies(configure: KotlinDependencyHandler.() -> Unit) =
@@ -8,12 +8,11 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.publish.maven.MavenPublication
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationOutput
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.project.model.KpmVariant import org.jetbrains.kotlin.project.model.KpmVariant
interface KpmGradleVariant : KpmGradleFragment, KpmVariant { interface GradleKpmVariant : GradleKpmFragment, KpmVariant {
val platformType: KotlinPlatformType val platformType: KotlinPlatformType
// TODO generalize with KotlinCompilation? // TODO generalize with KotlinCompilation?
@@ -33,7 +32,7 @@ interface KpmGradleVariant : KpmGradleFragment, KpmVariant {
val gradleVariantNames: Set<String> val gradleVariantNames: Set<String>
} }
interface KpmGradleVariantWithRuntime : KpmGradleVariant { interface GradleKpmVariantWithRuntime : GradleKpmVariant {
// TODO deduplicate with KotlinCompilation? // TODO deduplicate with KotlinCompilation?
val runtimeDependenciesConfiguration: Configuration val runtimeDependenciesConfiguration: Configuration
@@ -45,7 +44,7 @@ interface KpmGradleVariantWithRuntime : KpmGradleVariant {
val runtimeElementsConfiguration: Configuration val runtimeElementsConfiguration: Configuration
} }
interface KpmNativeVariant : KpmGradleVariant { interface GradleKpmNativeVariant : GradleKpmVariant {
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.native get() = KotlinPlatformType.native
@@ -54,13 +53,6 @@ interface KpmNativeVariant : KpmGradleVariant {
var enableEndorsedLibraries: Boolean var enableEndorsedLibraries: Boolean
} }
interface SingleMavenPublishedModuleHolder {
fun assignMavenPublication(publication: MavenPublication)
fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit)
val defaultPublishedModuleSuffix: String?
val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider
}
interface PublishedModuleCoordinatesProvider { interface PublishedModuleCoordinatesProvider {
val group: String val group: String
val name: String val name: String
@@ -45,7 +45,7 @@ val generateKpmNativeVariants by generator(
listOf(generateMppTargetContainerWithPresets, generateAbstractBinaryContainer, generateKpmNativeVariants).forEach { listOf(generateMppTargetContainerWithPresets, generateAbstractBinaryContainer, generateKpmNativeVariants).forEach {
it.systemProperty( it.systemProperty(
"org.jetbrains.kotlin.generators.gradle.dsl.outputSourceRoot", "org.jetbrains.kotlin.generators.gradle.dsl.outputSourceRoot",
project(":kotlin-gradle-plugin").projectDir.resolve("src/main/kotlin").absolutePath project(":kotlin-gradle-plugin").projectDir.resolve("src/common/kotlin").absolutePath
) )
} }
@@ -41,7 +41,7 @@ fun kpmNativeVariantsSourceCode() = """
${kpmVariantClassFunction().indented(skipFirstLine = true)} ${kpmVariantClassFunction().indented(skipFirstLine = true)}
""".trimIndent() """.trimIndent()
private val fileName = "KpmNativeVariants.kt" private val fileName = "nativeVariants.kt"
private val packageName = "org.jetbrains.kotlin.gradle.plugin.mpp.pm20" private val packageName = "org.jetbrains.kotlin.gradle.plugin.mpp.pm20"
@@ -53,13 +53,13 @@ private fun variantClasses() = allKonanTargets()
private fun variantClass(konanTarget: KonanTarget) = """ private fun variantClass(konanTarget: KonanTarget) = """
open class ${konanTarget.variantClassName} @Inject constructor( open class ${konanTarget.variantClassName} @Inject constructor(
containingModule: KotlinGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.${konanTarget.className}, konanTarget = KonanTarget.${konanTarget.className},
@@ -69,7 +69,7 @@ private fun variantClass(konanTarget: KonanTarget) = """
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.${konanTarget.className}, ${konanTarget.variantClassName}::class.java, ::${konanTarget.variantClassName} KonanTarget.${konanTarget.className}, ${konanTarget.variantClassName}::class.java, ::${konanTarget.variantClassName}
) )
} }
@@ -81,7 +81,7 @@ private fun kpmVariantClassFunction(): String {
.joinToString("\n") { "KonanTarget.${it.className} -> ${it.variantClassName}::class.java" } .joinToString("\n") { "KonanTarget.${it.className} -> ${it.variantClassName}::class.java" }
return """ return """
internal fun kpmVariantClass(konanTarget: KonanTarget): Class<out KotlinNativeVariantInternal>? = when (konanTarget) { internal fun kpmNativeVariantClass(konanTarget: KonanTarget): Class<out GradleKpmNativeVariantInternal>? = when (konanTarget) {
${konanTargetToVariant.indented(nSpaces = 12, skipFirstLine = true)} ${konanTargetToVariant.indented(nSpaces = 12, skipFirstLine = true)}
else -> null else -> null
} }
@@ -98,6 +98,6 @@ private fun allVariantConstructors() = allKonanTargets()
private val KonanTarget.variantClassName private val KonanTarget.variantClassName
get() = presetName get() = presetName
.capitalizeUS() .capitalizeUS()
.let { "Kotlin${it}Variant" } .let { "GradleKpm${it}Variant" }
private val KonanTarget.className get() = javaClass.simpleName private val KonanTarget.className get() = javaClass.simpleName
@@ -17,8 +17,8 @@ import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.deserialize import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.deserialize
import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.serialize import org.jetbrains.kotlin.gradle.kpm.idea.testFixtures.serialize
import org.jetbrains.kotlin.gradle.plugin.KotlinPm20PluginWrapper import org.jetbrains.kotlin.gradle.plugin.KotlinPm20PluginWrapper
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmIosX64Variant import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmIosX64Variant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmLinuxX64Variant import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmLinuxX64Variant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.jvm import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.jvm
import org.jetbrains.kotlin.tooling.core.extrasKeyOf import org.jetbrains.kotlin.tooling.core.extrasKeyOf
@@ -49,8 +49,8 @@ class BackwardsCompatibilityDeserializationTest {
kotlinExtension.mainAndTest { kotlinExtension.mainAndTest {
jvm jvm
val native = fragments.create("native") val native = fragments.create("native")
val linux = fragments.create<KpmLinuxX64Variant>("linuxX64") val linux = fragments.create<GradleKpmLinuxX64Variant>("linuxX64")
val ios = fragments.create<KpmIosX64Variant>("iosX64") val ios = fragments.create<GradleKpmIosX64Variant>("iosX64")
native.refines(common) native.refines(common)
linux.refines(native) linux.refines(native)
ios.refines(native) ios.refines(native)
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.gradle package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask
import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask.Companion.taskNameForKotlinModule import org.jetbrains.kotlin.gradle.tooling.BuildKotlinToolingMetadataTask.Companion.taskNameForKotlinModule
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
@@ -29,7 +29,7 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
private val buildKotlinToolingMetadataTaskName get() = private val buildKotlinToolingMetadataTaskName get() =
if (isKpmModelMappingEnabled) { if (isKpmModelMappingEnabled) {
taskNameForKotlinModule(KpmGradleModule.MAIN_MODULE_NAME) taskNameForKotlinModule(GradleKpmModule.MAIN_MODULE_NAME)
} else { } else {
BuildKotlinToolingMetadataTask.defaultTaskName BuildKotlinToolingMetadataTask.defaultTaskName
} }
@@ -122,7 +122,7 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
with(transformProjectWithPluginsDsl("kpm-multi-module-published")) { with(transformProjectWithPluginsDsl("kpm-multi-module-published")) {
val expectedMetadataByModule = mapOf<String, KotlinToolingMetadata.() -> Unit>( val expectedMetadataByModule = mapOf<String, KotlinToolingMetadata.() -> Unit>(
KpmGradleModule.MAIN_MODULE_NAME to { GradleKpmModule.MAIN_MODULE_NAME to {
val nativeTarget = projectTargets.single { it.platformType == KotlinPlatformType.native.name } val nativeTarget = projectTargets.single { it.platformType == KotlinPlatformType.native.name }
assertEquals(KonanTarget.LINUX_X64.name, nativeTarget.extras.native?.konanTarget) assertEquals(KonanTarget.LINUX_X64.name, nativeTarget.extras.native?.konanTarget)
}, },
@@ -17,12 +17,12 @@ kotlin {
// feel free to add more modules, variants and fragments // feel free to add more modules, variants and fragments
mainAndTest { mainAndTest {
jvm jvm
val linuxX64 by fragments.creating(KpmLinuxX64Variant::class) val linuxX64 by fragments.creating(GradleKpmLinuxX64Variant::class)
} }
val secondaryModule by modules.creating { val secondaryModule by modules.creating {
jvm jvm
val linuxArm64 by fragments.creating(KpmLinuxArm64Variant::class) val linuxArm64 by fragments.creating(GradleKpmLinuxArm64Variant::class)
makePublic() makePublic()
} }
@@ -34,7 +34,7 @@ kotlin {
val integrationTest by modules.creating { val integrationTest by modules.creating {
jvm jvm
val linuxX64 by fragments.creating(KpmLinuxX64Variant::class) val linuxX64 by fragments.creating(GradleKpmLinuxX64Variant::class)
} }
} }
@@ -11,7 +11,7 @@ repositories {
mavenCentral() mavenCentral()
} }
plugins.apply(GradleKpmPluginWithTransientPluginOptions::class.java) plugins.apply(KpmGradlePluginWithTransientPluginOptions::class.java)
configure<KotlinPm20ProjectExtension> { configure<KotlinPm20ProjectExtension> {
main { main {
@@ -38,7 +38,7 @@ class KpmPluginWithTransientPluginOptions(
override fun forPlatformCompilation(variant: KpmVariant) = pluginData() override fun forPlatformCompilation(variant: KpmVariant) = pluginData()
} }
class GradleKpmPluginWithTransientPluginOptions : GradleKpmCompilerPlugin { class KpmGradlePluginWithTransientPluginOptions : GradleKpmCompilerPlugin {
private lateinit var project: Project private lateinit var project: Project
override fun apply(target: Project) { override fun apply(target: Project) {
@@ -6,13 +6,13 @@
package org.jetbrains.kotlin.gradle.android package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.tooling.core.extrasKeyOf import org.jetbrains.kotlin.tooling.core.extrasKeyOf
import java.io.File import java.io.File
import java.io.Serializable import java.io.Serializable
internal val androidDslKey = extrasKeyOf<AndroidDsl>() internal val androidDslKey = extrasKeyOf<AndroidDsl>()
val KpmGradleFragment.androidDsl: AndroidDsl? get() = this.extras[androidDslKey] val GradleKpmFragment.androidDsl: AndroidDsl? get() = this.extras[androidDslKey]
class AndroidDsl : Serializable { class AndroidDsl : Serializable {
var compileSdk = 0 var compileSdk = 0
@@ -20,8 +20,8 @@ import org.jetbrains.kotlin.gradle.kpm.external.createExternalJvmVariant
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
fun KpmGradleModule.createKotlinAndroidVariant(androidVariant: BaseVariant) { fun GradleKpmModule.createKotlinAndroidVariant(androidVariant: BaseVariant) {
val androidOutgoingArtifacts = FragmentArtifacts<KpmJvmVariant> { val androidOutgoingArtifacts = GradleKpmConfigurationArtifactsSetup<GradleKpmJvmVariant> {
variants.create("classes") { variant -> variants.create("classes") { variant ->
variant.attributes.attribute(AndroidArtifacts.ARTIFACT_TYPE, AndroidArtifacts.ArtifactType.CLASSES_JAR.type) variant.attributes.attribute(AndroidArtifacts.ARTIFACT_TYPE, AndroidArtifacts.ArtifactType.CLASSES_JAR.type)
variant.artifact(project.provider { fragment.compilationOutputs.classesDirs.singleFile }) { variant.artifact(project.provider { fragment.compilationOutputs.classesDirs.singleFile }) {
@@ -37,16 +37,16 @@ fun KpmGradleModule.createKotlinAndroidVariant(androidVariant: BaseVariant) {
} }
} }
val androidElementsAttributes = FragmentAttributes<KpmJvmVariant> { val androidElementsAttributes = GradleKpmConfigurationAttributesSetup<GradleKpmJvmVariant> {
attribute(BuildTypeAttr.ATTRIBUTE, project.objects.named(androidVariant.buildType.name)) attribute(BuildTypeAttr.ATTRIBUTE, project.objects.named(androidVariant.buildType.name))
attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, project.objects.named(TargetJvmEnvironment.ANDROID)) attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, project.objects.named(TargetJvmEnvironment.ANDROID))
} }
val kotlinVariant = createExternalJvmVariant( val kotlinVariant = createExternalJvmVariant(
"android${androidVariant.buildType.name.replaceFirstChar { it.uppercase() }}", KotlinJvmVariantConfig( "android${androidVariant.buildType.name.replaceFirstChar { it.uppercase() }}", GradleKpmJvmVariantConfig(
/* Only swap out configuration that is used. Default setup shall still be applied */ /* Only swap out configuration that is used. Default setup shall still be applied */
compileDependencies = (DefaultKotlinCompileDependenciesDefinition + compileDependencies = (DefaultKotlinCompileDependenciesDefinition +
FragmentAttributes<KpmGradleFragment> { GradleKpmConfigurationAttributesSetup<GradleKpmFragment> {
namedAttribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.ANDROID) namedAttribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.ANDROID)
attribute(KotlinPlatformType.attribute, KotlinPlatformType.androidJvm) attribute(KotlinPlatformType.attribute, KotlinPlatformType.androidJvm)
}) })
@@ -63,8 +63,8 @@ fun KpmGradleModule.createKotlinAndroidVariant(androidVariant: BaseVariant) {
runtimeElements = DefaultKotlinRuntimeElementsDefinition + androidElementsAttributes + androidOutgoingArtifacts, runtimeElements = DefaultKotlinRuntimeElementsDefinition + androidElementsAttributes + androidOutgoingArtifacts,
/* For now: Just publish 'release' (non-debuggable) variants */ /* For now: Just publish 'release' (non-debuggable) variants */
publicationConfigurator = if (androidVariant.buildType.isDebuggable) KotlinPublicationConfigurator.NoPublication else publicationConfigurator = if (androidVariant.buildType.isDebuggable) GradleKpmPublicationConfigurator.NoPublication else
KotlinPublicationConfigurator.SingleVariantPublication GradleKpmPublicationConfigurator.SingleVariantPublication
) )
) )
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.gradle.android package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragmentInternal import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentInternal
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
val KpmGradleModule.androidCommon: KpmGradleFragmentInternal val GradleKpmModule.androidCommon: GradleKpmFragmentInternal
get() = (fragments.findByName("androidCommon") ?: fragments.create("androidCommon") { fragment -> get() = (fragments.findByName("androidCommon") ?: fragments.create("androidCommon") { fragment ->
fragment.refines(common) fragment.refines(common)
}) as KpmGradleFragmentInternal }) as GradleKpmFragmentInternal
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.gradle.android package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
val KotlinPm20ProjectExtension.instrumentedTest val KotlinPm20ProjectExtension.instrumentedTest
get() = modules.maybeCreate("instrumentedTest") get() = modules.maybeCreate("instrumentedTest")
fun KotlinPm20ProjectExtension.instrumentedTest(configure: KpmGradleModule.() -> Unit) { fun KotlinPm20ProjectExtension.instrumentedTest(configure: GradleKpmModule.() -> Unit) {
instrumentedTest.apply(configure) instrumentedTest.apply(configure)
} }
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPro
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.DefaultKpmGradleProjectModelContainer import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmDefaultProjectModelContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
import org.jetbrains.kotlin.gradle.targets.js.calculateJsCompilerType import org.jetbrains.kotlin.gradle.targets.js.calculateJsCompilerType
@@ -113,7 +113,7 @@ open class KotlinProjectExtension @Inject constructor(project: Project) : Kotlin
internal val kpmModelContainer by lazy { internal val kpmModelContainer by lazy {
if (project.kotlinPropertiesProvider.experimentalKpmModelMapping) { if (project.kotlinPropertiesProvider.experimentalKpmModelMapping) {
DefaultKpmGradleProjectModelContainer.create(project) GradleKpmDefaultProjectModelContainer.create(project)
} else error("Model mapping is not enabled.") } else error("Model mapping is not enabled.")
} }
} }
@@ -22,8 +22,8 @@ import org.jetbrains.kotlin.gradle.execution.KotlinAggregateExecutionSource
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.kpmModules
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
@@ -134,8 +134,8 @@ internal fun configureStdlibDefaultDependency(project: Project) = with(project)
private fun addStdlibToKpmProject( private fun addStdlibToKpmProject(
project: Project project: Project
) { ) {
project.kpmModules.matching { it.name == KpmGradleModule.MAIN_MODULE_NAME }.configureEach { main -> project.kpmModules.matching { it.name == GradleKpmModule.MAIN_MODULE_NAME }.configureEach { main ->
main.fragments.matching { it.name == KpmGradleFragment.COMMON_FRAGMENT_NAME }.configureEach { common -> main.fragments.matching { it.name == GradleKpmFragment.COMMON_FRAGMENT_NAME }.configureEach { common ->
common.dependencies { common.dependencies {
api(project.kotlinDependency("kotlin-stdlib-common", project.topLevelExtension.coreLibrariesVersion)) api(project.kotlinDependency("kotlin-stdlib-common", project.topLevelExtension.coreLibrariesVersion))
} }
@@ -22,15 +22,15 @@ val KotlinPm20ProjectExtension.ideaKotlinProjectModelBuilder: IdeaKotlinProjectM
get() = this.ideaKotlinProjectModelBuilder get() = this.ideaKotlinProjectModelBuilder
@ExternalVariantApi @ExternalVariantApi
fun KpmGradleModule.createExternalJvmVariant( fun GradleKpmModule.createExternalJvmVariant(
name: String, name: String,
config: KotlinJvmVariantConfig config: GradleKpmJvmVariantConfig
): KpmJvmVariant { ): GradleKpmJvmVariant {
val variant = KotlinJvmVariantFactory(this, config).create(name) val variant = GradleKpmJvmVariantFactory(this, config).create(name)
fragments.add(variant) fragments.add(variant)
return variant return variant
} }
@ExternalVariantApi @ExternalVariantApi
val KpmGradleVariantInternal.compilationData val GradleKpmVariantInternal.compilationData
get() = this.compilationData get() = this.compilationData
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinPlatformDependencyResolver.ArtifactResolution import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinPlatformDependencyResolver.ArtifactResolution
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.* import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.FragmentAttributes import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationAttributesSetup
@DslMarker @DslMarker
@ExternalVariantApi @ExternalVariantApi
@@ -35,7 +35,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
private val additionalDependencies = mutableListOf<IdeaKotlinDependencyResolver>() private val additionalDependencies = mutableListOf<IdeaKotlinDependencyResolver>()
@ExternalVariantPlatformDependencyResolutionDsl @ExternalVariantPlatformDependencyResolutionDsl
var platformResolutionAttributes: FragmentAttributes<KpmGradleFragment>? = null var platformResolutionAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment>? = null
@ExternalVariantPlatformDependencyResolutionDsl @ExternalVariantPlatformDependencyResolutionDsl
class ArtifactViewDslHandle( class ArtifactViewDslHandle(
@@ -43,11 +43,11 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
var binaryType: String var binaryType: String
) { ) {
@ExternalVariantPlatformDependencyResolutionDsl @ExternalVariantPlatformDependencyResolutionDsl
var attributes: FragmentAttributes<KpmGradleFragment> = FragmentAttributes { } var attributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment> = GradleKpmConfigurationAttributesSetup.None
@ExternalVariantPlatformDependencyResolutionDsl @ExternalVariantPlatformDependencyResolutionDsl
fun attributes(setAttributes: KotlinGradleFragmentConfigurationAttributesContext<KpmGradleFragment>.() -> Unit) { fun attributes(setAttributes: GradleKpmConfigurationAttributesSetupContext<GradleKpmFragment>.() -> Unit) {
attributes += FragmentAttributes(setAttributes) attributes += GradleKpmConfigurationAttributesSetup(setAttributes)
} }
} }
@@ -64,9 +64,9 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
@ExternalVariantPlatformDependencyResolutionDsl @ExternalVariantPlatformDependencyResolutionDsl
fun withPlatformResolutionAttributes( fun withPlatformResolutionAttributes(
setAttributes: KotlinGradleFragmentConfigurationAttributesContext<KpmGradleFragment>.() -> Unit setAttributes: GradleKpmConfigurationAttributesSetupContext<GradleKpmFragment>.() -> Unit
) { ) {
val additionalAttributes = FragmentAttributes(setAttributes) val additionalAttributes = GradleKpmConfigurationAttributesSetup(setAttributes)
this.platformResolutionAttributes = platformResolutionAttributes?.plus(additionalAttributes) ?: additionalAttributes this.platformResolutionAttributes = platformResolutionAttributes?.plus(additionalAttributes) ?: additionalAttributes
} }
@@ -76,7 +76,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
} }
@ExternalVariantPlatformDependencyResolutionDsl @ExternalVariantPlatformDependencyResolutionDsl
fun additionalDependencies(dependencyProvider: (KpmGradleFragment) -> List<IdeaKotlinDependency>) { fun additionalDependencies(dependencyProvider: (GradleKpmFragment) -> List<IdeaKotlinDependency>) {
this.additionalDependencies += IdeaKotlinDependencyResolver { fragment -> dependencyProvider(fragment).toSet() } this.additionalDependencies += IdeaKotlinDependencyResolver { fragment -> dependencyProvider(fragment).toSet() }
} }
@@ -130,7 +130,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
return parentConstraint and this.constraint return parentConstraint and this.constraint
} }
private fun buildPlatformResolutionAttributes(): FragmentAttributes<KpmGradleFragment>? { private fun buildPlatformResolutionAttributes(): GradleKpmConfigurationAttributesSetup<GradleKpmFragment>? {
val parentAttributes = parent?.buildPlatformResolutionAttributes() ?: return this.platformResolutionAttributes val parentAttributes = parent?.buildPlatformResolutionAttributes() ?: return this.platformResolutionAttributes
return parentAttributes + (this.platformResolutionAttributes ?: return parentAttributes) return parentAttributes + (this.platformResolutionAttributes ?: return parentAttributes)
} }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
/** /**
* An [IdeaKotlinDependencyEffect] is invoked last in the dependency resolution pipeline. * An [IdeaKotlinDependencyEffect] is invoked last in the dependency resolution pipeline.
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
* that the dependency resolution result is final. * that the dependency resolution result is final.
*/ */
fun interface IdeaKotlinDependencyEffect { fun interface IdeaKotlinDependencyEffect {
operator fun invoke(fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency>) operator fun invoke(fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>)
} }
fun IdeaKotlinDependencyResolver.withEffect(effect: IdeaKotlinDependencyEffect) = IdeaKotlinDependencyResolver { fragment -> fun IdeaKotlinDependencyResolver.withEffect(effect: IdeaKotlinDependencyEffect) = IdeaKotlinDependencyResolver { fragment ->
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.path import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.path
internal object IdeaKotlinDependencyLogger : IdeaKotlinDependencyEffect { internal object IdeaKotlinDependencyLogger : IdeaKotlinDependencyEffect {
override fun invoke( override fun invoke(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency> fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
) { ) {
val fragmentPathRegex = fragment.project.properties["idea.kotlin.log.dependencies"]?.toString() ?: return val fragmentPathRegex = fragment.project.properties["idea.kotlin.log.dependencies"]?.toString() ?: return
if (!fragment.path.matches(Regex(fragmentPathRegex))) return if (!fragment.path.matches(Regex(fragmentPathRegex))) return
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
fun interface IdeaKotlinDependencyResolver { fun interface IdeaKotlinDependencyResolver {
fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency>
object Empty : IdeaKotlinDependencyResolver { object Empty : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> = emptySet() override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> = emptySet()
} }
} }
@@ -48,7 +48,7 @@ operator fun IdeaKotlinDependencyResolver.plus(
private class CompositeIdeaKotlinDependencyResolver( private class CompositeIdeaKotlinDependencyResolver(
val children: List<IdeaKotlinDependencyResolver> val children: List<IdeaKotlinDependencyResolver>
) : IdeaKotlinDependencyResolver { ) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return children.flatMap { child -> child.resolve(fragment) }.toSet() return children.flatMap { child -> child.resolve(fragment) }.toSet()
} }
} }
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
/** /**
* An [IdeaKotlinDependencyTransformer] will be invoked after all [IdeaKotlinDependencyResolver] finished. * An [IdeaKotlinDependencyTransformer] will be invoked after all [IdeaKotlinDependencyResolver] finished.
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
*/ */
fun interface IdeaKotlinDependencyTransformer { fun interface IdeaKotlinDependencyTransformer {
fun transform( fun transform(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency> fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency> ): Set<IdeaKotlinDependency>
} }
@@ -54,7 +54,7 @@ private class CompositeIdeaKotlinDependencyTransformer(
val transformers: List<IdeaKotlinDependencyTransformer> val transformers: List<IdeaKotlinDependencyTransformer>
) : IdeaKotlinDependencyTransformer { ) : IdeaKotlinDependencyTransformer {
override fun transform( override fun transform(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency> fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency> { ): Set<IdeaKotlinDependency> {
return transformers.fold(dependencies) { currentDependencies, transformer -> transformer.transform(fragment, currentDependencies) } return transformers.fold(dependencies) { currentDependencies, transformer -> transformer.transform(fragment, currentDependencies) }
} }
@@ -8,12 +8,12 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.tooling.core.emptyExtras import org.jetbrains.kotlin.tooling.core.emptyExtras
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinFragment(fragment: KpmGradleFragment): IdeaKotlinFragment { internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinFragment(fragment: GradleKpmFragment): IdeaKotlinFragment {
return if (fragment is KpmGradleVariant) buildIdeaKotlinVariant(fragment) return if (fragment is GradleKpmVariant) buildIdeaKotlinVariant(fragment)
else buildIdeaKotlinFragment(fragment) else buildIdeaKotlinFragment(fragment)
} }
private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragment: KpmGradleFragment): IdeaKotlinFragment { private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragment: GradleKpmFragment): IdeaKotlinFragment {
return IdeaKotlinFragmentImpl( return IdeaKotlinFragmentImpl(
coordinates = IdeaKotlinFragmentCoordinates(fragment), coordinates = IdeaKotlinFragmentCoordinates(fragment),
platforms = fragment.containingVariants.map { variant -> IdeaKotlinPlatform(variant) }.toSet(), platforms = fragment.containingVariants.map { variant -> IdeaKotlinPlatform(variant) }.toSet(),
@@ -25,7 +25,7 @@ private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragme
) )
} }
private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinVariant(variant: KpmGradleVariant): IdeaKotlinVariant { private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinVariant(variant: GradleKpmVariant): IdeaKotlinVariant {
return IdeaKotlinVariantImpl( return IdeaKotlinVariantImpl(
fragment = buildIdeaKotlinFragment(variant), fragment = buildIdeaKotlinFragment(variant),
platform = IdeaKotlinPlatform(variant), platform = IdeaKotlinPlatform(variant),
@@ -5,9 +5,9 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal fun IdeaKotlinFragmentCoordinates(fragment: KpmGradleFragment): IdeaKotlinFragmentCoordinates { internal fun IdeaKotlinFragmentCoordinates(fragment: GradleKpmFragment): IdeaKotlinFragmentCoordinates {
return IdeaKotlinFragmentCoordinatesImpl( return IdeaKotlinFragmentCoordinatesImpl(
module = IdeaKotlinModuleCoordinates(fragment.containingModule), module = IdeaKotlinModuleCoordinates(fragment.containingModule),
fragmentName = fragment.name fragmentName = fragment.name
@@ -7,25 +7,25 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.FragmentGranularMetadataResolverFactory import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule.Companion.moduleName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule.Companion.moduleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.currentBuildId import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleDependency import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleDependency
internal class IdeaKotlinGranularFragmentDependencyResolver( internal class IdeaKotlinGranularFragmentDependencyResolver(
private val fragmentGranularMetadataResolverFactory: FragmentGranularMetadataResolverFactory private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver { ) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<ChooseVisibleSourceSets>() .filterIsInstance<ChooseVisibleSourceSets>()
.flatMap { resolution -> resolve(fragment, resolution) } .flatMap { resolution -> resolve(fragment, resolution) }
.toSet() .toSet()
} }
private fun resolve(fragment: KpmGradleFragment, resolution: ChooseVisibleSourceSets): Iterable<IdeaKotlinDependency> { private fun resolve(fragment: GradleKpmFragment, resolution: ChooseVisibleSourceSets): Iterable<IdeaKotlinDependency> {
val gradleProjectIdentifier = resolution.dependency.id as? ProjectComponentIdentifier ?: return emptyList() val gradleProjectIdentifier = resolution.dependency.id as? ProjectComponentIdentifier ?: return emptyList()
val kotlinModuleIdentifier = resolution.dependency.toModuleDependency().moduleIdentifier val kotlinModuleIdentifier = resolution.dependency.toKpmModuleDependency().moduleIdentifier
return resolution.allVisibleSourceSetNames.map { visibleFragmentName -> return resolution.allVisibleSourceSetNames.map { visibleFragmentName ->
IdeaKotlinFragmentDependencyImpl( IdeaKotlinFragmentDependencyImpl(
type = if ( type = if (
@@ -9,25 +9,25 @@ import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.JarMetadataProvider import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.JarMetadataProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ProjectMetadataProvider import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.ChooseVisibleSourceSets.MetadataProvider.ProjectMetadataProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.FragmentGranularMetadataResolverFactory import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule.Companion.moduleName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule.Companion.moduleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleDependency import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleDependency
import org.jetbrains.kotlin.gradle.utils.withTemporaryDirectory import org.jetbrains.kotlin.gradle.utils.withTemporaryDirectory
internal class IdeaKotlinMetadataBinaryDependencyResolver( internal class IdeaKotlinMetadataBinaryDependencyResolver(
private val fragmentGranularMetadataResolverFactory: FragmentGranularMetadataResolverFactory private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver { ) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<ChooseVisibleSourceSets>() .filterIsInstance<ChooseVisibleSourceSets>()
.flatMap { resolution -> resolve(fragment, resolution) } .flatMap { resolution -> resolve(fragment, resolution) }
.toSet() .toSet()
} }
private fun resolve(fragment: KpmGradleFragment, resolution: ChooseVisibleSourceSets): Iterable<IdeaKotlinDependency> { private fun resolve(fragment: GradleKpmFragment, resolution: ChooseVisibleSourceSets): Iterable<IdeaKotlinDependency> {
val gradleModuleIdentifier = resolution.dependency.id as? ModuleComponentIdentifier ?: return emptySet() val gradleModuleIdentifier = resolution.dependency.id as? ModuleComponentIdentifier ?: return emptySet()
val kotlinModuleIdentifier = resolution.dependency.toModuleDependency().moduleIdentifier val kotlinModuleIdentifier = resolution.dependency.toKpmModuleDependency().moduleIdentifier
/* Project to project metadata dependencies shall be resolved as source dependencies, somewhere else */ /* Project to project metadata dependencies shall be resolved as source dependencies, somewhere else */
val metadataProvider = when (resolution.metadataProvider) { val metadataProvider = when (resolution.metadataProvider) {
@@ -5,18 +5,18 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.path import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.path
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
internal object IdeaKotlinMissingFileDependencyLogger : IdeaKotlinDependencyEffect { internal object IdeaKotlinMissingFileDependencyLogger : IdeaKotlinDependencyEffect {
override fun invoke(fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency>) { override fun invoke(fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>) {
dependencies.filterIsInstance<IdeaKotlinResolvedBinaryDependency>() dependencies.filterIsInstance<IdeaKotlinResolvedBinaryDependency>()
.filter { !it.binaryFile.exists() } .filter { !it.binaryFile.exists() }
.ifNotEmpty { fragment.project.logger.warn(buildWarningMessage(fragment, this)) } .ifNotEmpty { fragment.project.logger.warn(buildWarningMessage(fragment, this)) }
} }
private fun buildWarningMessage(fragment: KpmGradleFragment, dependencies: List<IdeaKotlinResolvedBinaryDependency>) = buildString { private fun buildWarningMessage(fragment: GradleKpmFragment, dependencies: List<IdeaKotlinResolvedBinaryDependency>) = buildString {
append("[WARNING] ${fragment.path}: Missing dependency files") append("[WARNING] ${fragment.path}: Missing dependency files")
dependencies.forEach { dependency -> dependencies.forEach { dependency ->
appendLine(dependency.binaryFile) appendLine(dependency.binaryFile)
@@ -5,9 +5,9 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinModule(module: KpmGradleModule): IdeaKotlinModule { internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinModule(module: GradleKpmModule): IdeaKotlinModule {
return IdeaKotlinModuleImpl( return IdeaKotlinModuleImpl(
coordinates = IdeaKotlinModuleCoordinates(module), coordinates = IdeaKotlinModuleCoordinates(module),
fragments = module.fragments.toList().map { fragment -> IdeaKotlinFragment(fragment) } fragments = module.fragments.toList().map { fragment -> IdeaKotlinFragment(fragment) }
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.currentBuildId import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
internal fun IdeaKotlinModuleCoordinates(module: KpmGradleModule): IdeaKotlinModuleCoordinates { internal fun IdeaKotlinModuleCoordinates(module: GradleKpmModule): IdeaKotlinModuleCoordinates {
return IdeaKotlinModuleCoordinatesImpl( return IdeaKotlinModuleCoordinatesImpl(
buildId = module.project.currentBuildId().name, buildId = module.project.currentBuildId().name,
projectPath = module.project.path, projectPath = module.project.path,
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.commonizer.KonanDistribution
import org.jetbrains.kotlin.commonizer.platformLibsDir import org.jetbrains.kotlin.commonizer.platformLibsDir
import org.jetbrains.kotlin.compilerRunner.konanHome import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmNativeVariantInternal import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmNativeVariantInternal
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants
import org.jetbrains.kotlin.library.ToolingSingleFileKlibResolveStrategy import org.jetbrains.kotlin.library.ToolingSingleFileKlibResolveStrategy
import org.jetbrains.kotlin.library.resolveSingleFileKlib import org.jetbrains.kotlin.library.resolveSingleFileKlib
@@ -20,9 +20,9 @@ import org.jetbrains.kotlin.library.uniqueName
import java.io.File import java.io.File
internal class IdeaKotlinNativePlatformDependencyResolver : IdeaKotlinDependencyResolver { internal class IdeaKotlinNativePlatformDependencyResolver : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
val konanTargets = fragment.containingVariants val konanTargets = fragment.containingVariants
.map { it as? KpmNativeVariantInternal ?: return emptySet() } .map { it as? GradleKpmNativeVariantInternal ?: return emptySet() }
.map { it.konanTarget } .map { it.konanTarget }
.toSet() .toSet()
@@ -9,10 +9,10 @@ import org.jetbrains.kotlin.commonizer.KonanDistribution
import org.jetbrains.kotlin.commonizer.stdlib import org.jetbrains.kotlin.commonizer.stdlib
import org.jetbrains.kotlin.compilerRunner.konanHome import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal object IdeaKotlinNativeStdlibDependencyResolver : IdeaKotlinDependencyResolver { internal object IdeaKotlinNativeStdlibDependencyResolver : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return setOf( return setOf(
IdeaKotlinResolvedBinaryDependencyImpl( IdeaKotlinResolvedBinaryDependencyImpl(
binaryType = IdeaKotlinDependency.CLASSPATH_BINARY_TYPE, binaryType = IdeaKotlinDependency.CLASSPATH_BINARY_TYPE,
@@ -6,16 +6,15 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.gradle.api.artifacts.component.ModuleComponentIdentifier import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.KeepOriginalDependency import org.jetbrains.kotlin.gradle.plugin.mpp.MetadataDependencyResolution.KeepOriginalDependency
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.FragmentGranularMetadataResolverFactory import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName
internal class IdeaKotlinOriginalMetadataDependencyResolver( internal class IdeaKotlinOriginalMetadataDependencyResolver(
private val fragmentGranularMetadataResolverFactory: FragmentGranularMetadataResolverFactory private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver { ) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
val dependencyIdentifiers = fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions val dependencyIdentifiers = fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<KeepOriginalDependency>() .filterIsInstance<KeepOriginalDependency>()
.mapNotNull { resolution -> resolution.dependency.id as? ModuleComponentIdentifier } .mapNotNull { resolution -> resolution.dependency.id as? ModuleComponentIdentifier }
@@ -14,11 +14,11 @@ import org.jetbrains.kotlin.konan.target.HostManager
@Suppress("unused") @Suppress("unused")
/* Receiver acts as scope, or key to that function */ /* Receiver acts as scope, or key to that function */
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinPlatform(variant: KpmGradleVariant): IdeaKotlinPlatform { internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinPlatform(variant: GradleKpmVariant): IdeaKotlinPlatform {
when (variant) { when (variant) {
is KpmJvmVariant -> return IdeaKotlinPlatform.jvm(variant.compilationData.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name) is GradleKpmJvmVariant -> return IdeaKotlinPlatform.jvm(variant.compilationData.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name)
is KpmNativeVariantInternal -> return IdeaKotlinPlatform.native(variant.konanTarget.name) is GradleKpmNativeVariantInternal -> return IdeaKotlinPlatform.native(variant.konanTarget.name)
is LegacyMappedVariant -> when (val compilation = variant.compilation) { is GradleKpmLegacyMappedVariant -> when (val compilation = variant.compilation) {
is KotlinJvmCompilation -> return IdeaKotlinPlatform.jvm(compilation.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name) is KotlinJvmCompilation -> return IdeaKotlinPlatform.jvm(compilation.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name)
is KotlinJvmAndroidCompilation -> return IdeaKotlinPlatform.jvm(compilation.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name) is KotlinJvmAndroidCompilation -> return IdeaKotlinPlatform.jvm(compilation.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name)
is KotlinNativeCompilation -> return IdeaKotlinPlatform.native(compilation.konanTarget.name) is KotlinNativeCompilation -> return IdeaKotlinPlatform.native(compilation.konanTarget.name)
@@ -14,13 +14,13 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.internal.resolve.ModuleVersionResolveException import org.gradle.internal.resolve.ModuleVersionResolveException
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinPlatformDependencyResolver.* import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinPlatformDependencyResolver.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.FragmentAttributes import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationAttributesSetup
/** /**
* Resolves 'platform' binary dependencies for a given variant or fragment. * Resolves 'platform' binary dependencies for a given variant or fragment.
* 'platform' binaries refer to actually linkable/executable artifacts (like .class files bundled as jar, or linkable native klibs) * 'platform' binaries refer to actually linkable/executable artifacts (like .class files bundled as jar, or linkable native klibs)
* This resolver is capable of resolving those artifacts even for non-variant "platform-like" fragments. * This resolver is capable of resolving those artifacts even for non-variant "platform-like" fragments.
* It will then use the [KpmGradleFragment.transitiveApiConfiguration] and [KpmGradleFragment.transitiveImplementationConfiguratione]'s * It will then use the [GradleKpmFragment.transitiveApiConfiguration] and [GradleKpmFragment.transitiveImplementationConfiguratione]'s
* to resolve those binaries. See [IdeaKotlinPlatformDependencyResolver.ArtifactResolution.PlatformFragment] * to resolve those binaries. See [IdeaKotlinPlatformDependencyResolver.ArtifactResolution.PlatformFragment]
*/ */
class IdeaKotlinPlatformDependencyResolver( class IdeaKotlinPlatformDependencyResolver(
@@ -30,28 +30,28 @@ class IdeaKotlinPlatformDependencyResolver(
sealed class ArtifactResolution { sealed class ArtifactResolution {
/** /**
* Resolve the artifacts from a [KpmGradleVariant] using its [KpmGradleVariant.compileDependenciesConfiguration], * Resolve the artifacts from a [GradleKpmVariant] using its [GradleKpmVariant.compileDependenciesConfiguration],
* which already knows how to resolve platform artifacts. * which already knows how to resolve platform artifacts.
* @param artifactViewAttributes: Additional attributes that will be used to create an [ArtifactView] for resolving the dependencies. * @param artifactViewAttributes: Additional attributes that will be used to create an [ArtifactView] for resolving the dependencies.
*/ */
data class Variant( data class Variant(
internal val artifactViewAttributes: FragmentAttributes<KpmGradleFragment> = FragmentAttributes { } internal val artifactViewAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment> = GradleKpmConfigurationAttributesSetup.None
) : ArtifactResolution() ) : ArtifactResolution()
/** /**
* Capable of resolving artifacts from a plain [KpmGradleFragment] which does not have to implement [KpmGradleVariant]. * Capable of resolving artifacts from a plain [GradleKpmFragment] which does not have to implement [GradleKpmVariant].
* Such fragments are called 'platform-like', since they still resolve the linkable platform dependencies. * Such fragments are called 'platform-like', since they still resolve the linkable platform dependencies.
* @param platformResolutionAttributes: Attributes describing how to resolve platform artifacts in general. * @param platformResolutionAttributes: Attributes describing how to resolve platform artifacts in general.
* @param artifactViewAttributes: Additional attributes that will be used to create an [ArtifactView] for * @param artifactViewAttributes: Additional attributes that will be used to create an [ArtifactView] for
* resolving the dependencies * resolving the dependencies
*/ */
data class PlatformFragment( data class PlatformFragment(
internal val platformResolutionAttributes: FragmentAttributes<KpmGradleFragment>, internal val platformResolutionAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment>,
internal val artifactViewAttributes: FragmentAttributes<KpmGradleFragment> = FragmentAttributes { }, internal val artifactViewAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment> = GradleKpmConfigurationAttributesSetup { },
) : ArtifactResolution() ) : ArtifactResolution()
} }
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinBinaryDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinBinaryDependency> {
val artifacts = artifactResolution.createArtifactView(fragment)?.artifacts ?: return emptySet() val artifacts = artifactResolution.createArtifactView(fragment)?.artifacts ?: return emptySet()
val unresolvedDependencies = artifacts.failures val unresolvedDependencies = artifacts.failures
@@ -87,15 +87,15 @@ private val ComponentIdentifier.ideaKotlinBinaryCoordinates: IdeaKotlinBinaryCoo
else -> null else -> null
} }
private fun ArtifactResolution.createArtifactView(fragment: KpmGradleFragment): ArtifactView? { private fun ArtifactResolution.createArtifactView(fragment: GradleKpmFragment): ArtifactView? {
return when (this) { return when (this) {
is ArtifactResolution.Variant -> createVariantArtifactView(fragment) is ArtifactResolution.Variant -> createVariantArtifactView(fragment)
is ArtifactResolution.PlatformFragment -> createPlatformFragmentArtifactView(fragment) is ArtifactResolution.PlatformFragment -> createPlatformFragmentArtifactView(fragment)
} }
} }
private fun ArtifactResolution.Variant.createVariantArtifactView(fragment: KpmGradleFragment): ArtifactView? { private fun ArtifactResolution.Variant.createVariantArtifactView(fragment: GradleKpmFragment): ArtifactView? {
if (fragment !is KpmGradleVariant) return null if (fragment !is GradleKpmVariant) return null
return fragment.compileDependenciesConfiguration.incoming.artifactView { view -> return fragment.compileDependenciesConfiguration.incoming.artifactView { view ->
view.isLenient = true view.isLenient = true
view.componentFilter { id -> id !is ProjectComponentIdentifier } view.componentFilter { id -> id !is ProjectComponentIdentifier }
@@ -103,7 +103,7 @@ private fun ArtifactResolution.Variant.createVariantArtifactView(fragment: KpmGr
} }
} }
private fun ArtifactResolution.PlatformFragment.createPlatformFragmentArtifactView(fragment: KpmGradleFragment): ArtifactView { private fun ArtifactResolution.PlatformFragment.createPlatformFragmentArtifactView(fragment: GradleKpmFragment): ArtifactView {
val fragmentCompileDependencies = fragment.project.configurations.detachedConfiguration() val fragmentCompileDependencies = fragment.project.configurations.detachedConfiguration()
fragmentCompileDependencies.dependencies.addAll( fragmentCompileDependencies.dependencies.addAll(
@@ -7,7 +7,7 @@ import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.FragmentConstraint import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinProjectModelBuilder.FragmentConstraint
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.native import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType.native
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants
import org.jetbrains.kotlin.project.model.KpmVariant import org.jetbrains.kotlin.project.model.KpmVariant
@@ -94,7 +94,7 @@ interface IdeaKotlinProjectModelBuilder {
* Used for scoping [IdeaKotlinDependencyResolver], [IdeaKotlinDependencyTransformer] and [IdeaKotlinDependencyEffect] * Used for scoping [IdeaKotlinDependencyResolver], [IdeaKotlinDependencyTransformer] and [IdeaKotlinDependencyEffect]
*/ */
fun interface FragmentConstraint { fun interface FragmentConstraint {
operator fun invoke(fragment: KpmGradleFragment): Boolean operator fun invoke(fragment: GradleKpmFragment): Boolean
companion object { companion object {
val unconstrained = FragmentConstraint { true } val unconstrained = FragmentConstraint { true }
@@ -8,7 +8,7 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi import org.jetbrains.kotlin.gradle.kpm.external.ExternalVariantApi
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.FragmentGranularMetadataResolverFactory import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
import org.jetbrains.kotlin.tooling.core.UnsafeApi import org.jetbrains.kotlin.tooling.core.UnsafeApi
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.tooling.core.UnsafeApi
internal fun IdeaKotlinProjectModelBuilder.Companion.default( internal fun IdeaKotlinProjectModelBuilder.Companion.default(
extension: KotlinPm20ProjectExtension extension: KotlinPm20ProjectExtension
) = IdeaKotlinProjectModelBuilderImpl(extension).apply { ) = IdeaKotlinProjectModelBuilderImpl(extension).apply {
val fragmentMetadataResolverFactory = FragmentGranularMetadataResolverFactory() val fragmentMetadataResolverFactory = GradleKpmFragmentGranularMetadataResolverFactory()
registerDependencyResolver( registerDependencyResolver(
resolver = IdeaKotlinRefinesDependencyResolver, resolver = IdeaKotlinRefinesDependencyResolver,
@@ -5,13 +5,13 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal object IdeaKotlinRefinesDependencyResolver : IdeaKotlinDependencyResolver { internal object IdeaKotlinRefinesDependencyResolver : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> = fragment.refinesClosure override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> = fragment.refinesClosure
.map { refinesDependencyFragment -> createRefinesDependency(refinesDependencyFragment) }.toSet() .map { refinesDependencyFragment -> createRefinesDependency(refinesDependencyFragment) }.toSet()
private fun createRefinesDependency(fragment: KpmGradleFragment): IdeaKotlinDependency { private fun createRefinesDependency(fragment: GradleKpmFragment): IdeaKotlinDependency {
return IdeaKotlinFragmentDependencyImpl( return IdeaKotlinFragmentDependencyImpl(
type = IdeaKotlinFragmentDependency.Type.Refines, type = IdeaKotlinFragmentDependency.Type.Refines,
coordinates = IdeaKotlinFragmentCoordinates(fragment) coordinates = IdeaKotlinFragmentCoordinates(fragment)
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants
internal object IdeaKotlinSinglePlatformStdlibCommonFilter : IdeaKotlinDependencyTransformer { internal object IdeaKotlinSinglePlatformStdlibCommonFilter : IdeaKotlinDependencyTransformer {
@@ -13,7 +13,7 @@ internal object IdeaKotlinSinglePlatformStdlibCommonFilter : IdeaKotlinDependenc
private val stdlibCoordinatesModules = setOf("kotlin-stdlib-common", "kotlin-test-common", "kotlin-test-annotations-common") private val stdlibCoordinatesModules = setOf("kotlin-stdlib-common", "kotlin-test-common", "kotlin-test-annotations-common")
override fun transform( override fun transform(
fragment: KpmGradleFragment, fragment: GradleKpmFragment,
dependencies: Set<IdeaKotlinDependency> dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency> { ): Set<IdeaKotlinDependency> {
val platforms = fragment.containingVariants.map { it.platformType }.toSet() val platforms = fragment.containingVariants.map { it.platformType }.toSet()
@@ -14,13 +14,13 @@ import org.gradle.api.component.Artifact
import org.gradle.jvm.JvmLibrary import org.gradle.jvm.JvmLibrary
import org.gradle.language.base.artifact.SourcesArtifact import org.gradle.language.base.artifact.SourcesArtifact
import org.gradle.language.java.artifact.JavadocArtifact import org.gradle.language.java.artifact.JavadocArtifact
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleVariant import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName
internal class IdeaKotlinSourcesAndDocumentationResolver : IdeaKotlinDependencyResolver { internal class IdeaKotlinSourcesAndDocumentationResolver : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> { override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
if (fragment is KpmGradleVariant) { if (fragment is GradleKpmVariant) {
return resolve(fragment.project, fragment.compileDependenciesConfiguration) return resolve(fragment.project, fragment.compileDependenciesConfiguration)
} }
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.gradle.kpm.idea package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
internal object IdeaKotlinUnusedSourcesAndDocumentationFilter : IdeaKotlinDependencyTransformer { internal object IdeaKotlinUnusedSourcesAndDocumentationFilter : IdeaKotlinDependencyTransformer {
override fun transform( override fun transform(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency> fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency> { ): Set<IdeaKotlinDependency> {
val sourcesAndDocumentationDependencies = dependencies val sourcesAndDocumentationDependencies = dependencies
.filterIsInstance<IdeaKotlinResolvedBinaryDependency>() .filterIsInstance<IdeaKotlinResolvedBinaryDependency>()
@@ -43,7 +43,7 @@ import java.util.concurrent.Callable
interface CompilationDetails<T : KotlinCommonOptions> { interface CompilationDetails<T : KotlinCommonOptions> {
val target: KotlinTarget val target: KotlinTarget
val compileDependencyFilesHolder: DependencyFilesHolder val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder
val kotlinDependenciesHolder: HasKotlinDependencies val kotlinDependenciesHolder: HasKotlinDependencies
@@ -66,7 +66,7 @@ interface CompilationDetails<T : KotlinCommonOptions> {
} }
interface CompilationDetailsWithRuntime<T : KotlinCommonOptions> : CompilationDetails<T> { interface CompilationDetailsWithRuntime<T : KotlinCommonOptions> : CompilationDetails<T> {
val runtimeDependencyFilesHolder: DependencyFilesHolder val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder
} }
internal val CompilationDetails<*>.associateCompilationsClosure: Iterable<CompilationDetails<*>> internal val CompilationDetails<*>.associateCompilationsClosure: Iterable<CompilationDetails<*>>
@@ -98,7 +98,7 @@ open class DefaultCompilationDetails<T : KotlinCommonOptions>(
) )
) )
override val compileDependencyFilesHolder: DependencyFilesHolder = project.newDependencyFilesHolder( override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder(
lowerCamelCaseName( lowerCamelCaseName(
target.disambiguationClassifier, target.disambiguationClassifier,
compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(), compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(),
@@ -328,7 +328,7 @@ open class DefaultCompilationDetailsWithRuntime<T : KotlinCommonOptions>(
compilationPurpose: String, compilationPurpose: String,
createKotlinOptions: DefaultCompilationDetails<*>.() -> T createKotlinOptions: DefaultCompilationDetails<*>.() -> T
) : DefaultCompilationDetails<T>(target, compilationPurpose, createKotlinOptions), CompilationDetailsWithRuntime<T> { ) : DefaultCompilationDetails<T>(target, compilationPurpose, createKotlinOptions), CompilationDetailsWithRuntime<T> {
override val runtimeDependencyFilesHolder: DependencyFilesHolder = project.newDependencyFilesHolder( override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder(
lowerCamelCaseName( lowerCamelCaseName(
target.disambiguationClassifier, target.disambiguationClassifier,
compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(), compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(),
@@ -346,7 +346,7 @@ open class NativeCompilationDetails(
compilationPurpose, compilationPurpose,
createKotlinOptions createKotlinOptions
) { ) {
override val compileDependencyFilesHolder: DependencyFilesHolder = project.newDependencyFilesHolder( override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder(
lowerCamelCaseName( lowerCamelCaseName(
target.disambiguationClassifier, target.disambiguationClassifier,
compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(), compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(),
@@ -402,8 +402,8 @@ internal open class MetadataMappedCompilationDetails<T : KotlinCommonOptions>(
override val target: KotlinMetadataTarget, override val target: KotlinMetadataTarget,
final override val compilationData: AbstractKotlinFragmentMetadataCompilationData<T> final override val compilationData: AbstractKotlinFragmentMetadataCompilationData<T>
) : CompilationDetails<T> { ) : CompilationDetails<T> {
override val compileDependencyFilesHolder: DependencyFilesHolder = override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder =
DependencyFilesHolder.ofMetadataCompilationDependencies(compilationData) GradleKpmDependencyFilesHolder.ofMetadataCompilationDependencies(compilationData)
override val kotlinDependenciesHolder: HasKotlinDependencies override val kotlinDependenciesHolder: HasKotlinDependencies
get() = compilationData.fragment get() = compilationData.fragment
@@ -432,7 +432,7 @@ internal open class MetadataMappedCompilationDetails<T : KotlinCommonOptions>(
} }
internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>( internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
open val variant: KpmGradleVariantInternal, open val variant: GradleKpmVariantInternal,
override val target: KotlinTarget override val target: KotlinTarget
) : CompilationDetails<T> { ) : CompilationDetails<T> {
@@ -458,8 +458,8 @@ internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
override val associateCompilations: Set<CompilationDetails<*>> get() = emptySet() override val associateCompilations: Set<CompilationDetails<*>> get() = emptySet()
override val compileDependencyFilesHolder: DependencyFilesHolder override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = DependencyFilesHolder.ofVariantCompileDependencies(variant) get() = GradleKpmDependencyFilesHolder.ofVariantCompileDependencies(variant)
override val kotlinDependenciesHolder: HasKotlinDependencies override val kotlinDependenciesHolder: HasKotlinDependencies
get() = variant get() = variant
@@ -469,12 +469,12 @@ internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
} }
internal open class VariantMappedCompilationDetailsWithRuntime<T : KotlinCommonOptions>( internal open class VariantMappedCompilationDetailsWithRuntime<T : KotlinCommonOptions>(
override val variant: KpmGradleVariantWithRuntimeInternal, override val variant: GradleKpmVariantWithRuntimeInternal,
target: KotlinTarget target: KotlinTarget
) : VariantMappedCompilationDetails<T>(variant, target), ) : VariantMappedCompilationDetails<T>(variant, target),
CompilationDetailsWithRuntime<T> { CompilationDetailsWithRuntime<T> {
override val runtimeDependencyFilesHolder: DependencyFilesHolder override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = DependencyFilesHolder.ofVariantRuntimeDependencies(variant) get() = GradleKpmDependencyFilesHolder.ofVariantRuntimeDependencies(variant)
} }
internal class WithJavaCompilationDetails<T : KotlinCommonOptions>( internal class WithJavaCompilationDetails<T : KotlinCommonOptions>(
@@ -490,14 +490,14 @@ internal class WithJavaCompilationDetails<T : KotlinCommonOptions>(
override val output: KotlinCompilationOutput by lazy { KotlinWithJavaCompilationOutput(compilation) } override val output: KotlinCompilationOutput by lazy { KotlinWithJavaCompilationOutput(compilation) }
override val compileDependencyFilesHolder: DependencyFilesHolder override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = object : DependencyFilesHolder { get() = object : GradleKpmDependencyFilesHolder {
override val dependencyConfigurationName: String by javaSourceSet::compileClasspathConfigurationName override val dependencyConfigurationName: String by javaSourceSet::compileClasspathConfigurationName
override var dependencyFiles: FileCollection by javaSourceSet::compileClasspath override var dependencyFiles: FileCollection by javaSourceSet::compileClasspath
} }
override val runtimeDependencyFilesHolder: DependencyFilesHolder override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = object : DependencyFilesHolder { get() = object : GradleKpmDependencyFilesHolder {
override val dependencyConfigurationName: String by javaSourceSet::runtimeClasspathConfigurationName override val dependencyConfigurationName: String by javaSourceSet::runtimeClasspathConfigurationName
override var dependencyFiles: FileCollection by javaSourceSet::runtimeClasspath override var dependencyFiles: FileCollection by javaSourceSet::runtimeClasspath
} }
@@ -13,7 +13,7 @@ import org.gradle.api.artifacts.ProjectDependency
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.directoryNpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.directoryNpmDependency
@@ -74,7 +74,7 @@ class DefaultKotlinDependencyHandler(
dependencyNotation: Any dependencyNotation: Any
): Dependency? { ): Dependency? {
val dependency = when (dependencyNotation) { val dependency = when (dependencyNotation) {
is KpmGradleModule -> project.dependencies.create(dependencyNotation.project).apply { is GradleKpmModule -> project.dependencies.create(dependencyNotation.project).apply {
(this as ModuleDependency).capabilities { (this as ModuleDependency).capabilities {
if (dependencyNotation.moduleClassifier != null) { if (dependencyNotation.moduleClassifier != null) {
it.requireCapability(ComputedCapability.fromModule(dependencyNotation)) it.requireCapability(ComputedCapability.fromModule(dependencyNotation))
@@ -19,6 +19,8 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.representsProject
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
@@ -32,7 +34,7 @@ class ProjectStructureMetadataModuleBuilder {
component: ResolvedComponentResult, component: ResolvedComponentResult,
metadata: KotlinProjectStructureMetadata metadata: KotlinProjectStructureMetadata
): KpmModule { ): KpmModule {
val moduleData = KpmBasicModule(component.toSingleModuleIdentifier()).apply { val moduleData = KpmBasicModule(component.toSingleKpmModuleIdentifier()).apply {
metadata.sourceSetNamesByVariantName.keys.forEach { variantName -> metadata.sourceSetNamesByVariantName.keys.forEach { variantName ->
fragments.add(KpmBasicVariant(this@apply, variantName)) fragments.add(KpmBasicVariant(this@apply, variantName))
} }
@@ -69,7 +71,7 @@ class ProjectStructureMetadataModuleBuilder {
} }
} }
} }
return KpmExternalImportedModule( return GradleKpmExternalImportedModule(
moduleData, moduleData,
metadata, metadata,
moduleData.fragments.filterTo(mutableSetOf()) { it.fragmentName in metadata.hostSpecificSourceSets } moduleData.fragments.filterTo(mutableSetOf()) { it.fragmentName in metadata.hostSpecificSourceSets }
@@ -77,7 +79,7 @@ class ProjectStructureMetadataModuleBuilder {
} }
fun getModule(component: ResolvedComponentResult, projectStructureMetadata: KotlinProjectStructureMetadata): KpmModule { fun getModule(component: ResolvedComponentResult, projectStructureMetadata: KotlinProjectStructureMetadata): KpmModule {
val moduleId = component.toSingleModuleIdentifier() val moduleId = component.toSingleKpmModuleIdentifier()
return modulesCache.getOrPut(moduleId) { return modulesCache.getOrPut(moduleId) {
buildModuleFromProjectStructureMetadata( buildModuleFromProjectStructureMetadata(
component, component,
@@ -188,7 +190,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp
// FIXME: Kotlin/Native implementation-effective-api dependencies are missing here. Introduce dependency scopes // FIXME: Kotlin/Native implementation-effective-api dependencies are missing here. Introduce dependency scopes
requestedDependencies(project, sourceSet, listOf(KotlinDependencyScope.API_SCOPE)).forEach { requestedDependencies(project, sourceSet, listOf(KotlinDependencyScope.API_SCOPE)).forEach {
val moduleDependency = it.toModuleDependency(project) val moduleDependency = it.toKpmModuleDependency(project)
fragment.declaredModuleDependencies.add(moduleDependency) fragment.declaredModuleDependencies.add(moduleDependency)
} }
} }
@@ -236,7 +238,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp
} }
} }
internal fun Dependency.toModuleDependency( internal fun Dependency.toKpmModuleDependency(
project: Project project: Project
): KpmModuleDependency { ): KpmModuleDependency {
return KpmModuleDependency( return KpmModuleDependency(
@@ -261,30 +263,30 @@ internal fun Dependency.toModuleDependency(
private fun KpmBasicModule.fragmentByName(name: String) = private fun KpmBasicModule.fragmentByName(name: String) =
fragments.single { it.fragmentName == name } fragments.single { it.fragmentName == name }
class CachingModuleVariantResolver(private val actualResolver: ModuleVariantResolver) : ModuleVariantResolver { class KpmCachingModuleVariantResolver(private val actualResolver: KpmModuleVariantResolver) : KpmModuleVariantResolver {
private val resultCacheByRequestingVariant: MutableMap<org.jetbrains.kotlin.project.model.KpmVariant, MutableMap<KpmModule, VariantResolution>> = mutableMapOf() private val resultCacheByRequestingVariant: MutableMap<KpmVariant, MutableMap<KpmModule, KpmVariantResolution>> = mutableMapOf()
override fun getChosenVariant(requestingVariant: org.jetbrains.kotlin.project.model.KpmVariant, dependencyModule: KpmModule): VariantResolution { override fun getChosenVariant(requestingVariant: KpmVariant, dependencyModule: KpmModule): KpmVariantResolution {
val resultCache = resultCacheByRequestingVariant.getOrPut(requestingVariant) { mutableMapOf() } val resultCache = resultCacheByRequestingVariant.getOrPut(requestingVariant) { mutableMapOf() }
return resultCache.getOrPut(dependencyModule) { actualResolver.getChosenVariant(requestingVariant, dependencyModule) } return resultCache.getOrPut(dependencyModule) { actualResolver.getChosenVariant(requestingVariant, dependencyModule) }
} }
} }
class GradleModuleVariantResolver : ModuleVariantResolver { class KpmGradleModuleVariantResolver : KpmModuleVariantResolver {
override fun getChosenVariant(requestingVariant: org.jetbrains.kotlin.project.model.KpmVariant, dependencyModule: KpmModule): VariantResolution { override fun getChosenVariant(requestingVariant: KpmVariant, dependencyModule: KpmModule): KpmVariantResolution {
// TODO maybe improve this behavior? Currently it contradicts dependency resolution in that it may return a chosen variant for an // TODO maybe improve this behavior? Currently it contradicts dependency resolution in that it may return a chosen variant for an
// unrequested dependency. This workaround is needed for synthetic modules which were not produced from module metadata, so maybe // unrequested dependency. This workaround is needed for synthetic modules which were not produced from module metadata, so maybe
// those modules should be marked somehow // those modules should be marked somehow
if (dependencyModule is KpmExternalPlainModule) { if (dependencyModule is GradleKpmExternalPlainModule) {
return VariantResolution.fromMatchingVariants( return KpmVariantResolution.fromMatchingVariants(
requestingVariant, requestingVariant,
dependencyModule, dependencyModule,
listOf(dependencyModule.singleVariant) listOf(dependencyModule.singleVariant)
) )
} }
if (requestingVariant !is KpmGradleVariant) { if (requestingVariant !is GradleKpmVariant) {
return VariantResolution.Unknown(requestingVariant, dependencyModule) return KpmVariantResolution.Unknown(requestingVariant, dependencyModule)
} }
val module = requestingVariant.containingModule val module = requestingVariant.containingModule
@@ -300,9 +302,9 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
// FIXME check composite builds, it's likely that resolvedVariantProvider fails on them? // FIXME check composite builds, it's likely that resolvedVariantProvider fails on them?
val resolvedGradleVariantName = resolvedVariantProvider.getResolvedVariantName(dependencyModuleId, compileClasspath) val resolvedGradleVariantName = resolvedVariantProvider.getResolvedVariantName(dependencyModuleId, compileClasspath)
val kotlinVariantName = when (dependencyModule) { val kotlinVariantName = when (dependencyModule) {
is KpmGradleModule -> { is GradleKpmModule -> {
dependencyModule.variants.singleOrNull { resolvedGradleVariantName in it.gradleVariantNames }?.name dependencyModule.variants.singleOrNull { resolvedGradleVariantName in it.gradleVariantNames }?.name
?: return VariantResolution.Unknown(requestingVariant, dependencyModule) ?: return KpmVariantResolution.Unknown(requestingVariant, dependencyModule)
} }
else -> resolvedGradleVariantName?.let(::kotlinVariantNameFromPublishedVariantName) else -> resolvedGradleVariantName?.let(::kotlinVariantNameFromPublishedVariantName)
} }
@@ -310,15 +312,15 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
val resultVariant = dependencyModule.variants.singleOrNull { it.fragmentName == kotlinVariantName } val resultVariant = dependencyModule.variants.singleOrNull { it.fragmentName == kotlinVariantName }
return if (resultVariant == null) return if (resultVariant == null)
VariantResolution.NoVariantMatch(requestingVariant, dependencyModule) KpmVariantResolution.KpmNoVariantMatch(requestingVariant, dependencyModule)
else else
VariantResolution.VariantMatch(requestingVariant, dependencyModule, resultVariant) KpmVariantResolution.KpmVariantMatch(requestingVariant, dependencyModule, resultVariant)
} }
private fun getCompileDependenciesConfigurationForVariant(project: Project, requestingVariant: org.jetbrains.kotlin.project.model.KpmVariant): Configuration = private fun getCompileDependenciesConfigurationForVariant(project: Project, requestingVariant: KpmVariant): Configuration =
when { when {
project.hasKpmModel -> { project.hasKpmModel -> {
(requestingVariant as KpmGradleVariant).compileDependenciesConfiguration (requestingVariant as GradleKpmVariant).compileDependenciesConfiguration
} }
else -> { else -> {
val targets = val targets =
@@ -342,10 +344,10 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
} }
companion object { companion object {
fun getForCurrentBuild(project: Project): ModuleVariantResolver { fun getForCurrentBuild(project: Project): KpmModuleVariantResolver {
val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.variantResolver.${project.getKotlinPluginVersion()}" val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.variantResolver.${project.getKotlinPluginVersion()}"
return project.getOrPutRootProjectProperty(extraPropertyName) { return project.getOrPutRootProjectProperty(extraPropertyName) {
CachingModuleVariantResolver(GradleModuleVariantResolver()) KpmCachingModuleVariantResolver(KpmGradleModuleVariantResolver())
} }
} }
} }
@@ -80,10 +80,10 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
setupKpmModulesPublication(project) setupKpmModulesPublication(project)
registerDefaultVariantFactories(project) registerDefaultVariantFactories(project)
with(project.kpmModules) { with(project.kpmModules) {
create(KpmGradleModule.MAIN_MODULE_NAME) { create(GradleKpmModule.MAIN_MODULE_NAME) {
it.makePublic() it.makePublic()
} }
create(KpmGradleModule.TEST_MODULE_NAME) create(GradleKpmModule.TEST_MODULE_NAME)
} }
} }
@@ -282,7 +282,7 @@ internal fun applyUserDefinedAttributes(target: AbstractKotlinTarget) {
private fun applyUserDefinedAttributesWithKpm( private fun applyUserDefinedAttributesWithKpm(
target: AbstractKotlinTarget, target: AbstractKotlinTarget,
) { ) {
fun copyAttributesToVariant(variant: KpmGradleVariant, from: AttributeContainer) { fun copyAttributesToVariant(variant: GradleKpmVariant, from: AttributeContainer) {
variant.gradleVariantNames.forEach { configurationOrVariantName -> variant.gradleVariantNames.forEach { configurationOrVariantName ->
val configuration = variant.project.configurations.findByName(configurationOrVariantName) val configuration = variant.project.configurations.findByName(configurationOrVariantName)
?: return@forEach ?: return@forEach
@@ -307,7 +307,7 @@ private fun applyUserDefinedAttributesWithKpm(
} }
// Also handle the legacy-mapped variants, which are not accessible through the compilations in the loop above // Also handle the legacy-mapped variants, which are not accessible through the compilations in the loop above
project.kpmModules.getByName(KpmGradleModule.MAIN_MODULE_NAME).variants.withType(LegacyMappedVariant::class.java).all { variant -> project.kpmModules.getByName(GradleKpmModule.MAIN_MODULE_NAME).variants.withType(GradleKpmLegacyMappedVariant::class.java).all { variant ->
val compilation = variant.compilation val compilation = variant.compilation
copyAttributesToVariant(variant, compilation.attributes) copyAttributesToVariant(variant, compilation.attributes)
} }
@@ -14,7 +14,7 @@ import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.Nested import org.gradle.api.tasks.Nested
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.hasKpmModel
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope
@@ -190,7 +190,7 @@ internal fun buildKotlinProjectStructureMetadata(project: Project): KotlinProjec
) )
} }
internal fun buildProjectStructureMetadata(module: KpmGradleModule): KotlinProjectStructureMetadata { internal fun buildProjectStructureMetadata(module: GradleKpmModule): KotlinProjectStructureMetadata {
val kotlinVariantToGradleVariantNames = module.variants.associate { it.name to it.gradleVariantNames } val kotlinVariantToGradleVariantNames = module.variants.associate { it.name to it.gradleVariantNames }
fun <T> expandVariantKeys(map: Map<String, T>) = fun <T> expandVariantKeys(map: Map<String, T>) =
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.dsl.topLevelExtension import org.jetbrains.kotlin.gradle.dsl.topLevelExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.getValue
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
import org.jetbrains.kotlin.project.model.KpmLocalModuleIdentifier import org.jetbrains.kotlin.project.model.KpmLocalModuleIdentifier
@@ -10,7 +10,7 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.artifacts.result.ResolvedComponentResult import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleModuleIdentifier import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
internal fun MppDependencyProjectStructureMetadataExtractor.Factory.create( internal fun MppDependencyProjectStructureMetadataExtractor.Factory.create(
@@ -25,7 +25,7 @@ internal fun MppDependencyProjectStructureMetadataExtractor.Factory.create(
FIXME this loses information about auxiliary module deps FIXME this loses information about auxiliary module deps
TODO check how this code works with multi-capability resolutions, TODO check how this code works with multi-capability resolutions,
*/ */
moduleIdentifier = resolvedComponentResult.toSingleModuleIdentifier(), moduleIdentifier = resolvedComponentResult.toSingleKpmModuleIdentifier(),
configuration = configuration, configuration = configuration,
resolveViaAvailableAt = resolveViaAvailableAt, resolveViaAvailableAt = resolveViaAvailableAt,
resolvedComponentResult = resolvedComponentResult, resolvedComponentResult = resolvedComponentResult,
@@ -14,8 +14,8 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.artifacts.result.ResolvedVariantResult import org.gradle.api.artifacts.result.ResolvedVariantResult
import org.gradle.api.attributes.Usage import org.gradle.api.attributes.Usage
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleIdentifiers import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleIdentifiers
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleModuleIdentifier import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier
import org.jetbrains.kotlin.gradle.plugin.usageByName import org.jetbrains.kotlin.gradle.plugin.usageByName
import org.jetbrains.kotlin.gradle.utils.getOrPut import org.jetbrains.kotlin.gradle.utils.getOrPut
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
@@ -112,13 +112,13 @@ internal class ResolvedMppVariantsProvider private constructor(private val proje
if (isMpp) { if (isMpp) {
result.add(component) result.add(component)
component.dependents.forEach { dependent -> component.dependents.forEach { dependent ->
dependent.requested.toModuleIdentifiers().forEach { moduleId -> dependent.requested.toKpmModuleIdentifiers().forEach { moduleId ->
val moduleEntry = getEntryForModule(moduleId) val moduleEntry = getEntryForModule(moduleId)
moduleEntry.resolvedVariantsByConfiguration[configuration] = listOf(dependent.resolvedVariant) moduleEntry.resolvedVariantsByConfiguration[configuration] = listOf(dependent.resolvedVariant)
moduleEntry.dependenciesByConfiguration[configuration] = component.dependencies moduleEntry.dependenciesByConfiguration[configuration] = component.dependencies
.filterIsInstance<ResolvedDependencyResult>() .filterIsInstance<ResolvedDependencyResult>()
.map { dependency -> dependency.selected.toSingleModuleIdentifier() } .map { dependency -> dependency.selected.toSingleKpmModuleIdentifier() }
if (component.id is ProjectComponentIdentifier) { if (component.id is ProjectComponentIdentifier) {
// Then the platform variant chosen for this module is definitely inside the module itself: // Then the platform variant chosen for this module is definitely inside the module itself:
@@ -165,11 +165,11 @@ internal class ResolvedMppVariantsProvider private constructor(private val proje
artifactResolutionMode: ArtifactResolutionMode artifactResolutionMode: ArtifactResolutionMode
) { ) {
val mppModuleIds = mppComponentIds.flatMapTo(mutableSetOf()) { componentId -> val mppModuleIds = mppComponentIds.flatMapTo(mutableSetOf()) { componentId ->
componentId.toModuleIdentifiers() componentId.toKpmModuleIdentifiers()
} }
mppComponentIds.forEach { componentId -> mppComponentIds.forEach { componentId ->
componentId.toModuleIdentifiers().forEach { moduleId -> componentId.toKpmModuleIdentifiers().forEach { moduleId ->
val moduleEntry = getEntryForModule(moduleId) val moduleEntry = getEntryForModule(moduleId)
val artifact = artifacts[componentId] val artifact = artifacts[componentId]
when { when {
@@ -12,7 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles import org.jetbrains.kotlin.gradle.plugin.KotlinCompilationToRunnableFiles
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleModuleIdentifier import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import java.io.File import java.io.File
@@ -57,7 +57,7 @@ internal class SourceSetVisibilityProvider(
val compilations = CompilationSourceSetUtil.compilationsBySourceSets(project).getValue(visibleFrom) val compilations = CompilationSourceSetUtil.compilationsBySourceSets(project).getValue(visibleFrom)
val component = resolvedRootMppDependency ?: resolvedMetadataDependency val component = resolvedRootMppDependency ?: resolvedMetadataDependency
val mppModuleIdentifier = component.toSingleModuleIdentifier() val mppModuleIdentifier = component.toSingleKpmModuleIdentifier()
val firstConfigurationByVariant = mutableMapOf<String, Configuration>() val firstConfigurationByVariant = mutableMapOf<String, Configuration>()
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages.producerRuntimeUsage
import org.jetbrains.kotlin.gradle.plugin.usageByName import org.jetbrains.kotlin.gradle.plugin.usageByName
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
val KotlinFragmentPlatformAttributes = FragmentAttributes<KpmGradleVariant> { val GradleKpmPlatformAttributes = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
if (isGradleVersionAtLeast(7, 0) && fragment.platformType == KotlinPlatformType.jvm) { if (isGradleVersionAtLeast(7, 0) && fragment.platformType == KotlinPlatformType.jvm) {
namedAttribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.STANDARD_JVM) namedAttribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.STANDARD_JVM)
} }
@@ -28,26 +28,26 @@ val KotlinFragmentPlatformAttributes = FragmentAttributes<KpmGradleVariant> {
attribute(KotlinPlatformType.attribute, fragment.platformType) attribute(KotlinPlatformType.attribute, fragment.platformType)
} }
val KotlinFragmentConsumerApiUsageAttribute = FragmentAttributes<KpmGradleVariant> { val GradleKpmConsumerApiUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
attribute(USAGE_ATTRIBUTE, consumerApiUsage(project, fragment.platformType)) attribute(USAGE_ATTRIBUTE, consumerApiUsage(project, fragment.platformType))
} }
val KotlinFragmentProducerApiUsageAttribute = FragmentAttributes<KpmGradleVariant> { val GradleKpmProducerApiUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
attribute(USAGE_ATTRIBUTE, producerApiUsage(fragment.project, fragment.platformType)) attribute(USAGE_ATTRIBUTE, producerApiUsage(fragment.project, fragment.platformType))
} }
val KotlinFragmentConsumerRuntimeUsageAttribute = FragmentAttributes<KpmGradleVariant> { val GradleKpmConsumerRuntimeUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
attribute(USAGE_ATTRIBUTE, consumerRuntimeUsage(fragment.project, fragment.platformType)) attribute(USAGE_ATTRIBUTE, consumerRuntimeUsage(fragment.project, fragment.platformType))
} }
val KotlinFragmentProducerRuntimeUsageAttribute = FragmentAttributes<KpmGradleVariant> { val GradleKpmProducerRuntimeUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
attribute(USAGE_ATTRIBUTE, producerRuntimeUsage(fragment.project, fragment.platformType)) attribute(USAGE_ATTRIBUTE, producerRuntimeUsage(fragment.project, fragment.platformType))
} }
val KotlinFragmentMetadataUsageAttribute = FragmentAttributes<KpmGradleFragment> { val GradleKpmMetadataUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmFragment> {
attribute(USAGE_ATTRIBUTE, fragment.project.usageByName(KotlinUsages.KOTLIN_METADATA)) attribute(USAGE_ATTRIBUTE, fragment.project.usageByName(KotlinUsages.KOTLIN_METADATA))
} }
val KotlinFragmentKonanTargetAttribute = FragmentAttributes<KpmNativeVariantInternal> { val GradleKpmKonanTargetAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmNativeVariantInternal> {
attributes.attribute(KotlinNativeTarget.konanTargetAttribute, fragment.konanTarget.name) attributes.attribute(KotlinNativeTarget.konanTargetAttribute, fragment.konanTarget.name)
} }
@@ -8,79 +8,78 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.attributes.Bundling import org.gradle.api.attributes.Bundling
import org.gradle.api.attributes.Category import org.gradle.api.attributes.Category
val DefaultKotlinCompileDependenciesDefinition = GradleKpmConfigurationSetup(
val DefaultKotlinCompileDependenciesDefinition = KotlinGradleFragmentConfigurationDefinition( provider = GradleKpmConfigurationProvider {
provider = ConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("compileDependencies")).apply { project.configurations.maybeCreate(disambiguateName("compileDependencies")).apply {
isCanBeConsumed = false isCanBeConsumed = false
isCanBeResolved = true isCanBeResolved = true
} }
}, },
relations = FragmentConfigurationRelation { relations = GradleKpmConfigurationRelationSetup {
extendsFrom(dependencies.transitiveApiConfiguration) extendsFrom(dependencies.transitiveApiConfiguration)
extendsFrom(dependencies.transitiveImplementationConfiguration) extendsFrom(dependencies.transitiveImplementationConfiguration)
}, },
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerApiUsageAttribute attributes = GradleKpmPlatformAttributes + GradleKpmConsumerApiUsageAttribute
) )
val DefaultKotlinRuntimeDependenciesDefinition = ConfigurationDefinition( val DefaultKotlinRuntimeDependenciesDefinition = GradleKpmConfigurationSetup(
provider = ConfigurationProvider { provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("runtimeDependencies")).apply { project.configurations.maybeCreate(disambiguateName("runtimeDependencies")).apply {
isCanBeConsumed = false isCanBeConsumed = false
isCanBeResolved = true isCanBeResolved = true
} }
}, },
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerRuntimeUsageAttribute, attributes = GradleKpmPlatformAttributes + GradleKpmConsumerRuntimeUsageAttribute,
relations = FragmentConfigurationRelation { relations = GradleKpmConfigurationRelationSetup {
extendsFrom(dependencies.transitiveApiConfiguration) extendsFrom(dependencies.transitiveApiConfiguration)
extendsFrom(dependencies.transitiveImplementationConfiguration) extendsFrom(dependencies.transitiveImplementationConfiguration)
extendsFrom(dependencies.transitiveRuntimeOnlyConfiguration) extendsFrom(dependencies.transitiveRuntimeOnlyConfiguration)
} }
) )
val DefaultKotlinApiElementsDefinition = ConfigurationDefinition( val DefaultKotlinApiElementsDefinition = GradleKpmConfigurationSetup(
provider = ConfigurationProvider { provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("apiElements")).apply { project.configurations.maybeCreate(disambiguateName("apiElements")).apply {
isCanBeResolved = false isCanBeResolved = false
isCanBeConsumed = false isCanBeConsumed = false
module.ifMadePublic { isCanBeConsumed = true } module.ifMadePublic { isCanBeConsumed = true }
} }
}, },
relations = FragmentConfigurationRelation { extendsFrom(dependencies.transitiveApiConfiguration) }, relations = GradleKpmConfigurationRelationSetup { extendsFrom(dependencies.transitiveApiConfiguration) },
capabilities = KotlinFragmentModuleCapability, capabilities = GradleKpmModuleCapability,
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerApiUsageAttribute + FragmentAttributes { attributes = GradleKpmPlatformAttributes + GradleKpmProducerApiUsageAttribute + GradleKpmConfigurationAttributesSetup {
attribute(Category.CATEGORY_ATTRIBUTE, fragment.project.objects.named(Category::class.java, Category.LIBRARY)) attribute(Category.CATEGORY_ATTRIBUTE, fragment.project.objects.named(Category::class.java, Category.LIBRARY))
attribute(Bundling.BUNDLING_ATTRIBUTE, fragment.project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) attribute(Bundling.BUNDLING_ATTRIBUTE, fragment.project.objects.named(Bundling::class.java, Bundling.EXTERNAL))
}, },
) )
val DefaultKotlinRuntimeElementsDefinition = ConfigurationDefinition( val DefaultKotlinRuntimeElementsDefinition = GradleKpmConfigurationSetup(
provider = ConfigurationProvider { provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("runtimeElements")).apply { project.configurations.maybeCreate(disambiguateName("runtimeElements")).apply {
isCanBeResolved = false isCanBeResolved = false
isCanBeConsumed = false isCanBeConsumed = false
module.ifMadePublic { isCanBeConsumed = true } module.ifMadePublic { isCanBeConsumed = true }
} }
}, },
relations = FragmentConfigurationRelation { relations = GradleKpmConfigurationRelationSetup {
extendsFrom(dependencies.transitiveApiConfiguration) extendsFrom(dependencies.transitiveApiConfiguration)
extendsFrom(dependencies.transitiveImplementationConfiguration) extendsFrom(dependencies.transitiveImplementationConfiguration)
extendsFrom(dependencies.transitiveRuntimeOnlyConfiguration) extendsFrom(dependencies.transitiveRuntimeOnlyConfiguration)
}, },
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerRuntimeUsageAttribute + FragmentAttributes { attributes = GradleKpmPlatformAttributes + GradleKpmProducerRuntimeUsageAttribute + GradleKpmConfigurationAttributesSetup {
attribute(Category.CATEGORY_ATTRIBUTE, fragment.project.objects.named(Category::class.java, Category.LIBRARY)) attribute(Category.CATEGORY_ATTRIBUTE, fragment.project.objects.named(Category::class.java, Category.LIBRARY))
attribute(Bundling.BUNDLING_ATTRIBUTE, fragment.project.objects.named(Bundling::class.java, Bundling.EXTERNAL)) attribute(Bundling.BUNDLING_ATTRIBUTE, fragment.project.objects.named(Bundling::class.java, Bundling.EXTERNAL))
}, },
capabilities = KotlinFragmentModuleCapability capabilities = GradleKpmModuleCapability
) )
val DefaultKotlinHostSpecificMetadataElementsDefinition = ConfigurationDefinition( val DefaultKotlinHostSpecificMetadataElementsDefinition = GradleKpmConfigurationSetup(
provider = ConfigurationProvider { provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("hostSpecificMetadataElements")).apply { project.configurations.maybeCreate(disambiguateName("hostSpecificMetadataElements")).apply {
isCanBeResolved = false isCanBeResolved = false
isCanBeConsumed = false isCanBeConsumed = false
} }
}, },
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentKonanTargetAttribute + KotlinFragmentMetadataUsageAttribute, attributes = GradleKpmPlatformAttributes + GradleKpmKonanTargetAttribute + GradleKpmMetadataUsageAttribute,
artifacts = KotlinFragmentHostSpecificMetadataArtifact artifacts = GradleKpmHostSpecificMetadataArtifact
) )
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.project.model.* import org.jetbrains.kotlin.project.model.*
internal fun resolvableMetadataConfiguration( internal fun resolvableMetadataConfiguration(
module: KpmGradleModule module: GradleKpmModule
) = module.project.configurations.getByName(module.resolvableMetadataConfigurationName) ) = module.project.configurations.getByName(module.resolvableMetadataConfigurationName)
internal fun configurationToResolveMetadataDependencies(project: Project, requestingModule: KpmModule): Configuration = internal fun configurationToResolveMetadataDependencies(project: Project, requestingModule: KpmModule): Configuration =
when { when {
project.hasKpmModel -> resolvableMetadataConfiguration(requestingModule as KpmGradleModule) project.hasKpmModel -> resolvableMetadataConfiguration(requestingModule as GradleKpmModule)
else -> resolvableMetadataConfiguration( else -> resolvableMetadataConfiguration(
project, project,
project.kotlinExtension.sourceSets, // take dependencies from all source sets; TODO introduce consistency scopes? project.kotlinExtension.sourceSets, // take dependencies from all source sets; TODO introduce consistency scopes?
@@ -29,34 +29,34 @@ internal fun configurationToResolveMetadataDependencies(project: Project, reques
} }
class KpmGradleDependencyGraphResolver( class GradleKpmDependencyGraphResolver(
private val moduleResolver: KpmModuleDependencyResolver private val moduleResolver: KpmModuleDependencyResolver
) : KpmDependencyGraphResolver { ) : KpmDependencyGraphResolver {
private fun configurationToResolve(requestingModule: KpmGradleModule): Configuration = private fun configurationToResolve(requestingModule: GradleKpmModule): Configuration =
configurationToResolveMetadataDependencies(requestingModule.project, requestingModule) configurationToResolveMetadataDependencies(requestingModule.project, requestingModule)
override fun resolveDependencyGraph(requestingModule: KpmModule): KpmDependencyGraphResolution { override fun resolveDependencyGraph(requestingModule: KpmModule): KpmDependencyGraphResolution {
if (requestingModule !is KpmGradleModule) if (requestingModule !is GradleKpmModule)
return KpmDependencyGraphResolution.Unknown(requestingModule) return KpmDependencyGraphResolution.Unknown(requestingModule)
return resolveAsGraph(requestingModule) return resolveAsGraph(requestingModule)
} }
private fun resolveAsGraph(requestingModule: KpmGradleModule): KpmGradleDependencyGraph { private fun resolveAsGraph(requestingModule: GradleKpmModule): GradleKpmDependencyGraph {
val nodeByModuleId = mutableMapOf<KpmModuleIdentifier, GradleDependencyGraphNode>() val nodeByModuleId = mutableMapOf<KpmModuleIdentifier, GradleKpmDependencyGraphNode>()
fun getKotlinModuleFromComponentResult(component: ResolvedComponentResult): KpmModule = fun getKotlinModuleFromComponentResult(component: ResolvedComponentResult): KpmModule =
moduleResolver.resolveDependency(requestingModule, component.toModuleDependency()) moduleResolver.resolveDependency(requestingModule, component.toKpmModuleDependency())
?: buildSyntheticPlainModule( ?: buildSyntheticPlainModule(
component, component,
component.variants.singleOrNull()?.displayName ?: "default", component.variants.singleOrNull()?.displayName ?: "default",
) )
fun nodeFromModule(componentResult: ResolvedComponentResult, kpmModule: KpmModule): GradleDependencyGraphNode { fun nodeFromModule(componentResult: ResolvedComponentResult, kpmModule: KpmModule): GradleKpmDependencyGraphNode {
val id = kpmModule.moduleIdentifier val id = kpmModule.moduleIdentifier
return nodeByModuleId.getOrPut(id) { return nodeByModuleId.getOrPut(id) {
val metadataSourceComponent = val metadataSourceComponent =
(kpmModule as? KpmExternalImportedModule) (kpmModule as? GradleKpmExternalImportedModule)
?.takeIf { it.hasLegacyMetadataModule } ?.takeIf { it.hasLegacyMetadataModule }
?.let { (componentResult.dependencies.singleOrNull() as? ResolvedDependencyResult)?.selected } ?.let { (componentResult.dependencies.singleOrNull() as? ResolvedDependencyResult)?.selected }
?: componentResult ?: componentResult
@@ -68,8 +68,8 @@ class KpmGradleDependencyGraphResolver(
.filterIsInstance<ResolvedDependencyResult>() .filterIsInstance<ResolvedDependencyResult>()
// This filter statement is used to only visit the dependencies of the variant(s) of the requested Kotlin module and not // This filter statement is used to only visit the dependencies of the variant(s) of the requested Kotlin module and not
// other variants. This prevents infinite recursion when visiting multiple Kotlin modules within one Gradle components // other variants. This prevents infinite recursion when visiting multiple Kotlin modules within one Gradle components
.filter { dependency -> dependency.requested.toModuleIdentifiers().any { it in dependenciesRequestedByModule } } .filter { dependency -> dependency.requested.toKpmModuleIdentifiers().any { it in dependenciesRequestedByModule } }
.flatMap { dependency -> dependency.requested.toModuleIdentifiers().map { id -> id to dependency.selected } } .flatMap { dependency -> dependency.requested.toKpmModuleIdentifiers().map { id -> id to dependency.selected } }
.toMap() .toMap()
val fragmentDependencies = kpmModule.fragments.associateWith { it.declaredModuleDependencies } val fragmentDependencies = kpmModule.fragments.associateWith { it.declaredModuleDependencies }
@@ -81,7 +81,7 @@ class KpmGradleDependencyGraphResolver(
} }
} }
GradleDependencyGraphNode( GradleKpmDependencyGraphNode(
kpmModule, kpmModule,
componentResult, componentResult,
metadataSourceComponent, metadataSourceComponent,
@@ -90,24 +90,23 @@ class KpmGradleDependencyGraphResolver(
} }
} }
return KpmGradleDependencyGraph( return GradleKpmDependencyGraph(
requestingModule, requestingModule,
nodeFromModule(configurationToResolve(requestingModule).incoming.resolutionResult.root, requestingModule) nodeFromModule(configurationToResolve(requestingModule).incoming.resolutionResult.root, requestingModule)
) )
} }
} }
class GradleDependencyGraphNode( class GradleKpmDependencyGraphNode(
override val module: KpmModule, override val module: KpmModule,
val selectedComponent: ResolvedComponentResult, val selectedComponent: ResolvedComponentResult,
/** If the Kotlin module description was provided by a different component, such as with legacy publishing layout using *-metadata /** If the Kotlin module description was provided by a different component, such as with legacy publishing layout using *-metadata
* modules, then this property points to the other component. */ * modules, then this property points to the other component. */
val metadataSourceComponent: ResolvedComponentResult?, val metadataSourceComponent: ResolvedComponentResult?,
override val dependenciesByFragment: Map<KpmFragment, Iterable<GradleDependencyGraphNode>> override val dependenciesByFragment: Map<KpmFragment, Iterable<GradleKpmDependencyGraphNode>>
) : KpmDependencyGraphNode(module, dependenciesByFragment) ) : KpmDependencyGraphNode(module, dependenciesByFragment)
class KpmGradleDependencyGraph( class GradleKpmDependencyGraph(
override val requestingModule: KpmGradleModule, override val requestingModule: GradleKpmModule,
override val root: GradleDependencyGraphNode override val root: GradleKpmDependencyGraphNode
) : KpmDependencyGraphResolution.KpmDependencyGraph(requestingModule, root) ) : KpmDependencyGraphResolution.KpmDependencyGraph(requestingModule, root)
@@ -16,60 +16,15 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.utils.getOrPutRootProjectProperty import org.jetbrains.kotlin.gradle.utils.getOrPutRootProjectProperty
import org.jetbrains.kotlin.project.model.* import org.jetbrains.kotlin.project.model.*
import org.jetbrains.kotlin.project.model.KpmVariant
import java.util.*
class KpmCachingModuleDependencyResolver(private val actualResolver: KpmModuleDependencyResolver) : KpmModuleDependencyResolver { class GradleKpmModuleDependencyResolver(
private val cacheByRequestingModule = WeakHashMap<KpmModule, MutableMap<KpmModuleDependency, KpmModule?>>() private val gradleComponentResultResolver: GradleKpmComponentResultCachingResolver,
private fun cacheForRequestingModule(requestingModule: KpmModule) =
cacheByRequestingModule.getOrPut(requestingModule) { mutableMapOf() }
override fun resolveDependency(requestingModule: KpmModule, moduleDependency: KpmModuleDependency): KpmModule? =
cacheForRequestingModule(requestingModule).getOrPut(moduleDependency) {
actualResolver.resolveDependency(requestingModule, moduleDependency)
}
}
open class GradleComponentResultCachingResolver {
private val cachedResultsByRequestingModule = mutableMapOf<KpmGradleModule, Map<KpmModuleIdentifier, ResolvedComponentResult>>()
protected open fun configurationToResolve(requestingModule: KpmGradleModule): Configuration =
configurationToResolveMetadataDependencies(requestingModule.project, requestingModule)
protected open fun resolveDependencies(module: KpmGradleModule): Map<KpmModuleIdentifier, ResolvedComponentResult> {
val allComponents = configurationToResolve(module).incoming.resolutionResult.allComponents
// FIXME handle multi-component results
return allComponents.flatMap { component -> component.toModuleIdentifiers().map { it to component } }.toMap()
}
private fun getResultsForModule(module: KpmGradleModule): Map<KpmModuleIdentifier, ResolvedComponentResult> =
cachedResultsByRequestingModule.getOrPut(module) { resolveDependencies(module) }
fun resolveModuleDependencyAsComponentResult(
requestingModule: KpmGradleModule,
moduleDependency: KpmModuleDependency
): ResolvedComponentResult? =
getResultsForModule(requestingModule)[moduleDependency.moduleIdentifier]
companion object {
fun getForCurrentBuild(project: Project): GradleComponentResultCachingResolver {
val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.gradleComponentResolver.${project.getKotlinPluginVersion()}"
return project.getOrPutRootProjectProperty(extraPropertyName) {
GradleComponentResultCachingResolver()
}
}
}
}
class KpmGradleModuleDependencyResolver(
private val gradleComponentResultResolver: GradleComponentResultCachingResolver,
private val projectStructureMetadataModuleBuilder: ProjectStructureMetadataModuleBuilder, private val projectStructureMetadataModuleBuilder: ProjectStructureMetadataModuleBuilder,
private val projectModuleBuilder: GradleProjectModuleBuilder private val projectModuleBuilder: GradleProjectModuleBuilder
) : KpmModuleDependencyResolver { ) : KpmModuleDependencyResolver {
override fun resolveDependency(requestingModule: KpmModule, moduleDependency: KpmModuleDependency): KpmModule? { override fun resolveDependency(requestingModule: KpmModule, moduleDependency: KpmModuleDependency): KpmModule? {
require(requestingModule is KpmGradleModule) require(requestingModule is GradleKpmModule)
val project = requestingModule.project val project = requestingModule.project
val component = gradleComponentResultResolver.resolveModuleDependencyAsComponentResult(requestingModule, moduleDependency) val component = gradleComponentResultResolver.resolveModuleDependencyAsComponentResult(requestingModule, moduleDependency)
@@ -101,11 +56,11 @@ class KpmGradleModuleDependencyResolver(
fun getForCurrentBuild(project: Project): KpmModuleDependencyResolver { fun getForCurrentBuild(project: Project): KpmModuleDependencyResolver {
val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.moduleResolver.${project.getKotlinPluginVersion()}" val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.moduleResolver.${project.getKotlinPluginVersion()}"
return project.getOrPutRootProjectProperty(extraPropertyName) { return project.getOrPutRootProjectProperty(extraPropertyName) {
val componentResultResolver = GradleComponentResultCachingResolver.getForCurrentBuild(project) val componentResultResolver = GradleKpmComponentResultCachingResolver.getForCurrentBuild(project)
val metadataModuleBuilder = ProjectStructureMetadataModuleBuilder() val metadataModuleBuilder = ProjectStructureMetadataModuleBuilder()
val projectModuleBuilder = GradleProjectModuleBuilder(true) val projectModuleBuilder = GradleProjectModuleBuilder(true)
KpmCachingModuleDependencyResolver( GradleKpmCachingModuleDependencyResolver(
KpmGradleModuleDependencyResolver(componentResultResolver, metadataModuleBuilder, projectModuleBuilder) GradleKpmModuleDependencyResolver(componentResultResolver, metadataModuleBuilder, projectModuleBuilder)
) )
} }
} }
@@ -117,21 +72,21 @@ class KpmGradleModuleDependencyResolver(
internal fun buildSyntheticPlainModule( internal fun buildSyntheticPlainModule(
resolvedComponentResult: ResolvedComponentResult, resolvedComponentResult: ResolvedComponentResult,
singleVariantName: String, singleVariantName: String,
): KpmExternalPlainModule { ): GradleKpmExternalPlainModule {
val moduleDependency = resolvedComponentResult.toModuleDependency() val moduleDependency = resolvedComponentResult.toKpmModuleDependency()
return KpmExternalPlainModule(KpmBasicModule(moduleDependency.moduleIdentifier).apply { return GradleKpmExternalPlainModule(KpmBasicModule(moduleDependency.moduleIdentifier).apply {
KpmBasicVariant(this@apply, singleVariantName, DefaultLanguageSettingsBuilder()).apply { KpmBasicVariant(this@apply, singleVariantName, DefaultLanguageSettingsBuilder()).apply {
fragments.add(this) fragments.add(this)
this.declaredModuleDependencies.addAll( this.declaredModuleDependencies.addAll(
resolvedComponentResult.dependencies resolvedComponentResult.dependencies
.filterIsInstance<ResolvedDependencyResult>() .filterIsInstance<ResolvedDependencyResult>()
.map { it.selected.toModuleDependency() } .map { it.selected.toKpmModuleDependency() }
) )
} }
}) })
} }
internal class KpmExternalPlainModule(private val moduleData: KpmBasicModule) : KpmModule by moduleData { internal class GradleKpmExternalPlainModule(private val moduleData: KpmBasicModule) : KpmModule by moduleData {
override fun toString(): String = "external plain $moduleData" override fun toString(): String = "external plain $moduleData"
val singleVariant: KpmVariant val singleVariant: KpmVariant
@@ -139,7 +94,7 @@ internal class KpmExternalPlainModule(private val moduleData: KpmBasicModule) :
?: error("synthetic $moduleData was expected to have a single variant, got: ${moduleData.variants}") ?: error("synthetic $moduleData was expected to have a single variant, got: ${moduleData.variants}")
} }
internal class KpmExternalImportedModule( internal class GradleKpmExternalImportedModule(
private val moduleData: KpmBasicModule, private val moduleData: KpmBasicModule,
val projectStructureMetadata: KotlinProjectStructureMetadata, val projectStructureMetadata: KotlinProjectStructureMetadata,
val hostSpecificFragments: Set<KpmFragment> val hostSpecificFragments: Set<KpmFragment>
@@ -149,28 +104,28 @@ internal class KpmExternalImportedModule(
override fun toString(): String = "imported $moduleData" override fun toString(): String = "imported $moduleData"
} }
private fun ModuleComponentIdentifier.toSingleModuleIdentifier(classifier: String? = null): KpmMavenModuleIdentifier = private fun ModuleComponentIdentifier.toSingleKpmModuleIdentifier(classifier: String? = null): KpmMavenModuleIdentifier =
KpmMavenModuleIdentifier(moduleIdentifier.group, moduleIdentifier.name, classifier) KpmMavenModuleIdentifier(moduleIdentifier.group, moduleIdentifier.name, classifier)
internal fun ComponentIdentifier.matchesModule(module: KpmModule): Boolean = internal fun ComponentIdentifier.matchesModule(module: KpmModule): Boolean =
matchesModuleIdentifier(module.moduleIdentifier) matchesModuleIdentifier(module.moduleIdentifier)
internal fun ResolvedComponentResult.toModuleIdentifiers(): List<KpmModuleIdentifier> { internal fun ResolvedComponentResult.toKpmModuleIdentifiers(): List<KpmModuleIdentifier> {
val classifiers = moduleClassifiersFromCapabilities(variants.flatMap { it.capabilities }) val classifiers = moduleClassifiersFromCapabilities(variants.flatMap { it.capabilities })
return classifiers.map { moduleClassifier -> toModuleIdentifier(moduleClassifier) } return classifiers.map { moduleClassifier -> toKpmModuleIdentifier(moduleClassifier) }
} }
// FIXME this mapping doesn't have enough information to choose auxiliary modules // FIXME this mapping doesn't have enough information to choose auxiliary modules
internal fun ResolvedComponentResult.toSingleModuleIdentifier(): KpmModuleIdentifier { internal fun ResolvedComponentResult.toSingleKpmModuleIdentifier(): KpmModuleIdentifier {
val classifiers = moduleClassifiersFromCapabilities(variants.flatMap { it.capabilities }) val classifiers = moduleClassifiersFromCapabilities(variants.flatMap { it.capabilities })
val moduleClassifier = classifiers.single() // FIXME handle multiple capabilities val moduleClassifier = classifiers.single() // FIXME handle multiple capabilities
return toModuleIdentifier(moduleClassifier) return toKpmModuleIdentifier(moduleClassifier)
} }
private fun ResolvedComponentResult.toModuleIdentifier(moduleClassifier: String?): KpmModuleIdentifier { private fun ResolvedComponentResult.toKpmModuleIdentifier(moduleClassifier: String?): KpmModuleIdentifier {
return when (val id = id) { return when (val id = id) {
is ProjectComponentIdentifier -> KpmLocalModuleIdentifier(id.build.name, id.projectPath, moduleClassifier) is ProjectComponentIdentifier -> KpmLocalModuleIdentifier(id.build.name, id.projectPath, moduleClassifier)
is ModuleComponentIdentifier -> id.toSingleModuleIdentifier() is ModuleComponentIdentifier -> id.toSingleKpmModuleIdentifier()
else -> KpmMavenModuleIdentifier(moduleVersion?.group.orEmpty(), moduleVersion?.name.orEmpty(), moduleClassifier) else -> KpmMavenModuleIdentifier(moduleVersion?.group.orEmpty(), moduleVersion?.name.orEmpty(), moduleClassifier)
} }
} }
@@ -180,7 +135,7 @@ internal fun moduleClassifiersFromCapabilities(capabilities: Iterable<Capability
return if (classifierCapabilities.none()) listOf(null) else classifierCapabilities.map { it.name.substringAfterLast("..") /*FIXME invent a more stable scheme*/ } return if (classifierCapabilities.none()) listOf(null) else classifierCapabilities.map { it.name.substringAfterLast("..") /*FIXME invent a more stable scheme*/ }
} }
internal fun ComponentSelector.toModuleIdentifiers(): Iterable<KpmModuleIdentifier> { internal fun ComponentSelector.toKpmModuleIdentifiers(): Iterable<KpmModuleIdentifier> {
val moduleClassifiers = moduleClassifiersFromCapabilities(requestedCapabilities) val moduleClassifiers = moduleClassifiersFromCapabilities(requestedCapabilities)
return when (this) { return when (this) {
is ProjectComponentSelector -> moduleClassifiers.map { KpmLocalModuleIdentifier(buildName, projectPath, it) } is ProjectComponentSelector -> moduleClassifiers.map { KpmLocalModuleIdentifier(buildName, projectPath, it) }
@@ -189,9 +144,9 @@ internal fun ComponentSelector.toModuleIdentifiers(): Iterable<KpmModuleIdentifi
} }
} }
internal fun ResolvedComponentResult.toModuleDependency(): KpmModuleDependency = KpmModuleDependency(toSingleModuleIdentifier()) internal fun ResolvedComponentResult.toKpmModuleDependency(): KpmModuleDependency = KpmModuleDependency(toSingleKpmModuleIdentifier())
internal fun ComponentSelector.toModuleDependency(): KpmModuleDependency { internal fun ComponentSelector.toKpmModuleDependency(): KpmModuleDependency {
val moduleId = toModuleIdentifiers().single() // FIXME handle multiple val moduleId = toKpmModuleIdentifiers().single() // FIXME handle multiple
return KpmModuleDependency(moduleId) return KpmModuleDependency(moduleId)
} }
@@ -206,7 +161,7 @@ internal fun ComponentIdentifier.matchesModuleIdentifier(id: KpmModuleIdentifier
} }
is KpmMavenModuleIdentifier -> { is KpmMavenModuleIdentifier -> {
val componentId = this as? ModuleComponentIdentifier val componentId = this as? ModuleComponentIdentifier
componentId?.toSingleModuleIdentifier() == id componentId?.toSingleKpmModuleIdentifier() == id
} }
else -> false else -> false
} }
@@ -14,9 +14,9 @@ import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
import java.io.File import java.io.File
import java.util.* import java.util.*
internal class FragmentGranularMetadataResolver( internal class GradleKpmFragmentGranularMetadataResolver(
private val requestingFragment: KpmGradleFragment, private val requestingFragment: GradleKpmFragment,
private val refinesParentResolvers: Lazy<Iterable<FragmentGranularMetadataResolver>> private val refinesParentResolvers: Lazy<Iterable<GradleKpmFragmentGranularMetadataResolver>>
) { ) {
val resolutions: Iterable<MetadataDependencyResolution> by lazy { val resolutions: Iterable<MetadataDependencyResolution> by lazy {
doResolveMetadataDependencies() doResolveMetadataDependencies()
@@ -26,33 +26,33 @@ internal class FragmentGranularMetadataResolver(
get() = requestingFragment.containingModule.project get() = requestingFragment.containingModule.project
private val parentResultsByModuleIdentifier: Map<KpmModuleIdentifier, List<MetadataDependencyResolution>> by lazy { private val parentResultsByModuleIdentifier: Map<KpmModuleIdentifier, List<MetadataDependencyResolution>> by lazy {
refinesParentResolvers.value.flatMap { it.resolutions }.groupBy { it.dependency.toSingleModuleIdentifier() } refinesParentResolvers.value.flatMap { it.resolutions }.groupBy { it.dependency.toSingleKpmModuleIdentifier() }
} }
private val moduleResolver = KpmGradleModuleDependencyResolver.getForCurrentBuild(project) private val moduleResolver = GradleKpmModuleDependencyResolver.getForCurrentBuild(project)
private val variantResolver = GradleModuleVariantResolver.getForCurrentBuild(project) private val variantResolver = KpmGradleModuleVariantResolver.getForCurrentBuild(project)
private val fragmentResolver = DefaultModuleFragmentsResolver(variantResolver) private val fragmentResolver = KpmDefaultFragmentsResolver(variantResolver)
private val dependencyGraphResolver = KpmGradleDependencyGraphResolver(moduleResolver) private val dependencyGraphResolver = GradleKpmDependencyGraphResolver(moduleResolver)
private fun doResolveMetadataDependencies(): Iterable<MetadataDependencyResolution> { private fun doResolveMetadataDependencies(): Iterable<MetadataDependencyResolution> {
val configurationToResolve = configurationToResolveMetadataDependencies(project, requestingFragment.containingModule) val configurationToResolve = configurationToResolveMetadataDependencies(project, requestingFragment.containingModule)
val resolvedComponentsByModuleId = val resolvedComponentsByModuleId =
configurationToResolve.incoming.resolutionResult.allComponents.associateBy { it.toSingleModuleIdentifier() } configurationToResolve.incoming.resolutionResult.allComponents.associateBy { it.toSingleKpmModuleIdentifier() }
val resolvedDependenciesByModuleId = val resolvedDependenciesByModuleId =
configurationToResolve.incoming.resolutionResult.allDependencies.filterIsInstance<ResolvedDependencyResult>() configurationToResolve.incoming.resolutionResult.allDependencies.filterIsInstance<ResolvedDependencyResult>()
.flatMap { dependency -> dependency.requested.toModuleIdentifiers().map { id -> id to dependency } }.toMap() .flatMap { dependency -> dependency.requested.toKpmModuleIdentifiers().map { id -> id to dependency } }.toMap()
val dependencyGraph = dependencyGraphResolver.resolveDependencyGraph(requestingFragment.containingModule) val dependencyGraph = dependencyGraphResolver.resolveDependencyGraph(requestingFragment.containingModule)
if (dependencyGraph is KpmDependencyGraphResolution.Unknown) if (dependencyGraph is KpmDependencyGraphResolution.Unknown)
error("unexpected failure in dependency graph resolution for $requestingFragment in $project") error("unexpected failure in dependency graph resolution for $requestingFragment in $project")
dependencyGraph as KpmGradleDependencyGraph // refactor the type hierarchy to avoid this downcast? FIXME? dependencyGraph as GradleKpmDependencyGraph // refactor the type hierarchy to avoid this downcast? FIXME?
val fragmentsToInclude = requestingFragment.withRefinesClosure val fragmentsToInclude = requestingFragment.withRefinesClosure
val requestedDependencies = dependencyGraph.root.dependenciesByFragment.filterKeys { it in fragmentsToInclude }.values.flatten() val requestedDependencies = dependencyGraph.root.dependenciesByFragment.filterKeys { it in fragmentsToInclude }.values.flatten()
val visited = mutableSetOf<GradleDependencyGraphNode>() val visited = mutableSetOf<GradleKpmDependencyGraphNode>()
val fragmentResolutionQueue = ArrayDeque<GradleDependencyGraphNode>(requestedDependencies) val fragmentResolutionQueue = ArrayDeque<GradleKpmDependencyGraphNode>(requestedDependencies)
val results = mutableSetOf<MetadataDependencyResolution>() val results = mutableSetOf<MetadataDependencyResolution>()
@@ -63,7 +63,7 @@ internal class FragmentGranularMetadataResolver(
val dependencyModule = dependencyNode.module val dependencyModule = dependencyNode.module
val fragmentVisibility = fragmentResolver.getChosenFragments(requestingFragment, dependencyModule) val fragmentVisibility = fragmentResolver.getChosenFragments(requestingFragment, dependencyModule)
val chosenFragments = fragmentVisibility as? FragmentResolution.ChosenFragments val chosenFragments = fragmentVisibility as? KpmFragmentResolution.ChosenFragments
val visibleFragments = chosenFragments?.visibleFragments?.toList().orEmpty() val visibleFragments = chosenFragments?.visibleFragments?.toList().orEmpty()
val visibleTransitiveDependencies = val visibleTransitiveDependencies =
@@ -74,7 +74,7 @@ internal class FragmentGranularMetadataResolver(
val resolvedComponentResult = dependencyNode.selectedComponent val resolvedComponentResult = dependencyNode.selectedComponent
val isResolvedAsProject = resolvedComponentResult.toProjectOrNull(project) val isResolvedAsProject = resolvedComponentResult.toProjectOrNull(project)
val result = when (dependencyModule) { val result = when (dependencyModule) {
is KpmExternalPlainModule -> { is GradleKpmExternalPlainModule -> {
MetadataDependencyResolution.KeepOriginalDependency(resolvedComponentResult, isResolvedAsProject) MetadataDependencyResolution.KeepOriginalDependency(resolvedComponentResult, isResolvedAsProject)
} }
else -> run { else -> run {
@@ -83,7 +83,7 @@ internal class FragmentGranularMetadataResolver(
val visibleFragmentNames = visibleFragments.map { it.fragmentName }.toSet() val visibleFragmentNames = visibleFragments.map { it.fragmentName }.toSet()
val visibleFragmentNamesExcludingVisibleByParents = val visibleFragmentNamesExcludingVisibleByParents =
visibleFragmentNames.minus(fragmentsNamesVisibleByParents(metadataSourceComponent.toSingleModuleIdentifier())) visibleFragmentNames.minus(fragmentsNamesVisibleByParents(metadataSourceComponent.toSingleKpmModuleIdentifier()))
/* /*
We can safely assume that a metadata extractor can be created, because the project structure metadata already We can safely assume that a metadata extractor can be created, because the project structure metadata already
@@ -96,7 +96,7 @@ internal class FragmentGranularMetadataResolver(
"the presence of a proper Kotlin Module" "the presence of a proper Kotlin Module"
) )
val projectStructureMetadata = (dependencyModule as? KpmExternalImportedModule)?.projectStructureMetadata val projectStructureMetadata = (dependencyModule as? GradleKpmExternalImportedModule)?.projectStructureMetadata
?: checkNotNull(projectStructureMetadataExtractor.getProjectStructureMetadata()) ?: checkNotNull(projectStructureMetadataExtractor.getProjectStructureMetadata())
@@ -111,7 +111,7 @@ internal class FragmentGranularMetadataResolver(
projectStructureMetadata = projectStructureMetadata, projectStructureMetadata = projectStructureMetadata,
primaryArtifactFile = projectStructureMetadataExtractor.primaryArtifactFile, primaryArtifactFile = projectStructureMetadataExtractor.primaryArtifactFile,
hostSpecificArtifactsBySourceSet = if ( hostSpecificArtifactsBySourceSet = if (
dependencyModule is KpmExternalImportedModule && chosenFragments != null dependencyModule is GradleKpmExternalImportedModule && chosenFragments != null
) resolveHostSpecificMetadataArtifacts(dependencyModule, chosenFragments) else emptyMap(), ) resolveHostSpecificMetadataArtifacts(dependencyModule, chosenFragments) else emptyMap(),
).asMetadataProvider() ).asMetadataProvider()
} }
@@ -147,21 +147,21 @@ internal class FragmentGranularMetadataResolver(
} }
private fun resolveHostSpecificMetadataArtifacts( private fun resolveHostSpecificMetadataArtifacts(
dependencyModule: KpmExternalImportedModule, dependencyModule: GradleKpmExternalImportedModule,
chosenFragments: FragmentResolution.ChosenFragments, chosenFragments: KpmFragmentResolution.ChosenFragments,
): Map<String, File> { ): Map<String, File> {
val visibleFragments = chosenFragments.visibleFragments val visibleFragments = chosenFragments.visibleFragments
val variantResolutions = chosenFragments.variantResolutions val variantResolutions = chosenFragments.variantResolutions
val hostSpecificFragments = dependencyModule.hostSpecificFragments val hostSpecificFragments = dependencyModule.hostSpecificFragments
return visibleFragments.intersect(hostSpecificFragments).mapNotNull { hostSpecificFragment -> return visibleFragments.intersect(hostSpecificFragments).mapNotNull { hostSpecificFragment ->
val relevantVariantResolution = variantResolutions val relevantVariantResolution = variantResolutions
.filterIsInstance<VariantResolution.VariantMatch>() .filterIsInstance<KpmVariantResolution.KpmVariantMatch>()
// find some of our variants that resolved a dependency's variant containing the fragment // find some of our variants that resolved a dependency's variant containing the fragment
.find { hostSpecificFragment in it.chosenVariant.withRefinesClosure } .find { hostSpecificFragment in it.chosenVariant.withRefinesClosure }
// resolve the dependencies of that variant getting the host-specific metadata artifact // resolve the dependencies of that variant getting the host-specific metadata artifact
relevantVariantResolution?.let { resolution -> relevantVariantResolution?.let { resolution ->
val configurationResolvingPlatformVariant = val configurationResolvingPlatformVariant =
(resolution.requestingVariant as KpmGradleVariant).compileDependenciesConfiguration (resolution.requestingVariant as GradleKpmVariant).compileDependenciesConfiguration
val hostSpecificArtifact = ResolvedMppVariantsProvider.get(project) val hostSpecificArtifact = ResolvedMppVariantsProvider.get(project)
.getHostSpecificMetadataArtifactByRootModule( .getHostSpecificMetadataArtifactByRootModule(
dependencyModule.moduleIdentifier, dependencyModule.moduleIdentifier,
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
internal class FragmentGranularMetadataResolverFactory { internal class GradleKpmFragmentGranularMetadataResolverFactory {
private val resolvers = mutableMapOf<KpmGradleFragment, FragmentGranularMetadataResolver>() private val resolvers = mutableMapOf<GradleKpmFragment, GradleKpmFragmentGranularMetadataResolver>()
fun getOrCreate(fragment: KpmGradleFragment): FragmentGranularMetadataResolver = resolvers.getOrPut(fragment) { fun getOrCreate(fragment: GradleKpmFragment): GradleKpmFragmentGranularMetadataResolver = resolvers.getOrPut(fragment) {
FragmentGranularMetadataResolver(fragment, lazy { GradleKpmFragmentGranularMetadataResolver(fragment, lazy {
fragment.refinesClosure.map { refinesFragment -> fragment.refinesClosure.map { refinesFragment ->
getOrCreate(refinesFragment) getOrCreate(refinesFragment)
} }
@@ -13,30 +13,30 @@ import java.io.File
typealias SourceRoots = Iterable<File> typealias SourceRoots = Iterable<File>
typealias SourceRootsProvider = Provider<out SourceRoots> typealias SourceRootsProvider = Provider<out SourceRoots>
typealias MultipleSourceRootsProvider = Provider<out Iterable<SourceRootsProvider>> typealias MultipleSourceRootsProvider = Provider<out Iterable<SourceRootsProvider>>
typealias SourceRootsProvidersByFragment = Map<KpmGradleFragment, SourceRootsProvider> typealias SourceRootsProvidersByFragment = Map<GradleKpmFragment, SourceRootsProvider>
/** Note: the API is [Provider]-based rather than FileCollection-based because FileCollection API erases the internal structure of the /** Note: the API is [Provider]-based rather than FileCollection-based because FileCollection API erases the internal structure of the
* file sets, and this internal structure is currently needed for correctly inferring Java source roots from the sources added to the * file sets, and this internal structure is currently needed for correctly inferring Java source roots from the sources added to the
* JVM compilations (it is important to pass sources in SourceDirectorySets) */ * JVM compilations (it is important to pass sources in SourceDirectorySets) */
open class FragmentSourcesProvider { open class GradleKpmFragmentSourcesProvider {
protected open fun getSourcesFromFragmentsAsMap( protected open fun getSourcesFromFragmentsAsMap(
fragments: Iterable<KpmGradleFragment> fragments: Iterable<GradleKpmFragment>
): SourceRootsProvidersByFragment = ): SourceRootsProvidersByFragment =
fragments.associateWith { it.project.provider { it.kotlinSourceRoots } } fragments.associateWith { it.project.provider { it.kotlinSourceRoots } }
open fun getFragmentOwnSources(fragment: KpmGradleFragment): SourceRootsProvider = open fun getFragmentOwnSources(fragment: GradleKpmFragment): SourceRootsProvider =
getSourcesFromFragmentsAsMap(listOf(fragment)).values.single() getSourcesFromFragmentsAsMap(listOf(fragment)).values.single()
open fun getAllFragmentSourcesAsMap(module: KpmGradleModule): SourceRootsProvidersByFragment = open fun getAllFragmentSourcesAsMap(module: GradleKpmModule): SourceRootsProvidersByFragment =
getSourcesFromFragmentsAsMap(module.fragments) getSourcesFromFragmentsAsMap(module.fragments)
open fun getSourcesFromRefinesClosureAsMap(fragment: KpmGradleFragment): SourceRootsProvidersByFragment = open fun getSourcesFromRefinesClosureAsMap(fragment: GradleKpmFragment): SourceRootsProvidersByFragment =
getSourcesFromFragmentsAsMap(fragment.withRefinesClosure) getSourcesFromFragmentsAsMap(fragment.withRefinesClosure)
open fun getSourcesFromRefinesClosure(fragment: KpmGradleFragment): MultipleSourceRootsProvider = open fun getSourcesFromRefinesClosure(fragment: GradleKpmFragment): MultipleSourceRootsProvider =
fragment.project.provider { getSourcesFromRefinesClosureAsMap(fragment).values } fragment.project.provider { getSourcesFromRefinesClosureAsMap(fragment).values }
open fun getCommonSourcesFromRefinesClosure(fragment: KpmGradleFragment): MultipleSourceRootsProvider { open fun getCommonSourcesFromRefinesClosure(fragment: GradleKpmFragment): MultipleSourceRootsProvider {
val containingModule = fragment.containingModule val containingModule = fragment.containingModule
val project = containingModule.project val project = containingModule.project
getSourcesFromRefinesClosureAsMap(fragment) getSourcesFromRefinesClosureAsMap(fragment)
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.jetbrains.kotlin.project.model.KpmModule
import org.jetbrains.kotlin.project.model.KpmModuleDependency
import org.jetbrains.kotlin.project.model.KpmModuleDependencyResolver
import java.util.*
class GradleKpmCachingModuleDependencyResolver(private val actualResolver: KpmModuleDependencyResolver) : KpmModuleDependencyResolver {
private val cacheByRequestingModule = WeakHashMap<KpmModule, MutableMap<KpmModuleDependency, KpmModule?>>()
private fun cacheForRequestingModule(requestingModule: KpmModule) =
cacheByRequestingModule.getOrPut(requestingModule) { mutableMapOf() }
override fun resolveDependency(requestingModule: KpmModule, moduleDependency: KpmModuleDependency): KpmModule? =
cacheForRequestingModule(requestingModule).getOrPut(moduleDependency) {
actualResolver.resolveDependency(requestingModule, moduleDependency)
}
}
@@ -18,17 +18,17 @@ import org.jetbrains.kotlin.project.model.*
import java.io.File import java.io.File
internal fun Project.compilerPluginProviderForMetadata( internal fun Project.compilerPluginProviderForMetadata(
fragment: KpmGradleFragment, fragment: GradleKpmFragment,
compilationData: KotlinCommonFragmentMetadataCompilationData compilationData: KotlinCommonFragmentMetadataCompilationData
) = compilerPluginDataProvider(compilationData, fragment::metadataCompilationPluginData) ) = compilerPluginDataProvider(compilationData, fragment::metadataCompilationPluginData)
internal fun Project.compilerPluginProviderForNativeMetadata( internal fun Project.compilerPluginProviderForNativeMetadata(
fragment: KpmGradleFragment, fragment: GradleKpmFragment,
compilationData: KotlinNativeFragmentMetadataCompilationData compilationData: KotlinNativeFragmentMetadataCompilationData
) = compilerPluginDataProvider(compilationData, fragment::nativeMetadataCompilationPluginData) ) = compilerPluginDataProvider(compilationData, fragment::nativeMetadataCompilationPluginData)
internal fun Project.compilerPluginProviderForPlatformCompilation( internal fun Project.compilerPluginProviderForPlatformCompilation(
variant: KpmGradleVariant, variant: GradleKpmVariant,
compilationData: KotlinCompilationData<*> compilationData: KotlinCompilationData<*>
) = compilerPluginDataProvider(compilationData, variant::platformCompilationPluginData) ) = compilerPluginDataProvider(compilationData, variant::platformCompilationPluginData)
@@ -46,7 +46,7 @@ private fun Project.compilerPluginDataProvider(
}.apply { disallowUnsafeRead() } }.apply { disallowUnsafeRead() }
} }
internal class CompilerPluginOptionsBuilder( private class CompilerPluginOptionsBuilder(
private val project: Project, private val project: Project,
private val configurationName: String private val configurationName: String
) { ) {
@@ -0,0 +1,45 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.utils.getOrPutRootProjectProperty
import org.jetbrains.kotlin.project.model.KpmModuleDependency
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
open class GradleKpmComponentResultCachingResolver {
private val cachedResultsByRequestingModule = mutableMapOf<GradleKpmModule, Map<KpmModuleIdentifier, ResolvedComponentResult>>()
protected open fun configurationToResolve(requestingModule: GradleKpmModule): Configuration =
configurationToResolveMetadataDependencies(requestingModule.project, requestingModule)
protected open fun resolveDependencies(module: GradleKpmModule): Map<KpmModuleIdentifier, ResolvedComponentResult> {
val allComponents = configurationToResolve(module).incoming.resolutionResult.allComponents
// FIXME handle multi-component results
return allComponents.flatMap { component -> component.toKpmModuleIdentifiers().map { it to component } }.toMap()
}
private fun getResultsForModule(module: GradleKpmModule): Map<KpmModuleIdentifier, ResolvedComponentResult> =
cachedResultsByRequestingModule.getOrPut(module) { resolveDependencies(module) }
fun resolveModuleDependencyAsComponentResult(
requestingModule: GradleKpmModule,
moduleDependency: KpmModuleDependency
): ResolvedComponentResult? =
getResultsForModule(requestingModule)[moduleDependency.moduleIdentifier]
companion object {
fun getForCurrentBuild(project: Project): GradleKpmComponentResultCachingResolver {
val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.gradleComponentResolver.${project.getKotlinPluginVersion()}"
return project.getOrPutRootProjectProperty(extraPropertyName) {
GradleKpmComponentResultCachingResolver()
}
}
}
}
@@ -0,0 +1,37 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.publish.maven.MavenPublication
import org.jetbrains.kotlin.gradle.plugin.mpp.MavenPublicationCoordinatesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability
class GradleKpmDefaultSingleMavenPublishedModuleHolder(
private var module: GradleKpmModule, override val defaultPublishedModuleSuffix: String?
) : GradleKpmSingleMavenPublishedModuleHolder {
private val project get() = module.project
private var assignedMavenPublication: MavenPublication? = null
private val publicationAssignedHandlers = mutableListOf<(MavenPublication) -> Unit>()
override fun assignMavenPublication(publication: MavenPublication) {
if (assignedMavenPublication != null) error("already assigned publication $publication")
assignedMavenPublication = publication
publicationAssignedHandlers.forEach { it(publication) }
}
override fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit) {
assignedMavenPublication?.let(handlePublication) ?: publicationAssignedHandlers.add(handlePublication)
}
override val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider = MavenPublicationCoordinatesProvider(
project,
{ assignedMavenPublication },
defaultPublishedModuleSuffix,
capabilities = listOfNotNull(ComputedCapability.capabilityStringFromModule(module))
)
}
@@ -0,0 +1,29 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeCompileOptions
import org.jetbrains.kotlin.konan.target.KonanTarget
internal class GradleKpmNativeVariantCompilationData(
val variant: GradleKpmNativeVariantInternal
) : GradleKpmVariantCompilationDataInternal<KotlinCommonOptions>, KotlinNativeCompilationData<KotlinCommonOptions> {
override val konanTarget: KonanTarget
get() = variant.konanTarget
override val enableEndorsedLibs: Boolean
get() = variant.enableEndorsedLibraries
override val project: Project
get() = variant.containingModule.project
override val owner: GradleKpmNativeVariant
get() = variant
override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { variant.languageSettings }
}
@@ -0,0 +1,37 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.konan.target.KonanTarget
class GradleKpmNativeVariantConstructor<T : GradleKpmNativeVariantInternal>(
val konanTarget: KonanTarget,
val variantClass: Class<T>,
private val constructor: (
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) -> T
) {
operator fun invoke(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
): T = constructor(
containingModule, fragmentName,
dependencyConfigurations,
compileDependencyConfiguration,
apiElementsConfiguration,
hostSpecificMetadataElementsConfiguration
)
}
@@ -0,0 +1,37 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
abstract class GradleKpmPublishedVariantWithRuntime(
containingModule: GradleKpmModule, fragmentName: String,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
runtimeDependencyConfiguration: Configuration,
runtimeElementsConfiguration: Configuration
) : GradleKpmVariantWithRuntimeInternal(
containingModule = containingModule,
fragmentName = fragmentName,
dependencyConfigurations = dependencyConfigurations,
compileDependencyConfiguration = compileDependencyConfiguration,
apiElementsConfiguration = apiElementsConfiguration,
runtimeDependenciesConfiguration = runtimeDependencyConfiguration,
runtimeElementsConfiguration = runtimeElementsConfiguration
), GradleKpmSingleMavenPublishedModuleHolder by GradleKpmDefaultSingleMavenPublishedModuleHolder(
containingModule, defaultModuleSuffix(containingModule, fragmentName)
) {
override val gradleVariantNames: Set<String>
get() = listOf(apiElementsConfiguration.name, runtimeElementsConfiguration.name).flatMapTo(mutableSetOf()) {
listOf(it, publishedConfigurationName(it))
}
}
private fun defaultModuleSuffix(module: GradleKpmModule, variantName: String): String =
dashSeparatedName(variantName, module.moduleClassifier)
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2022 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.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileCollection
abstract class GradleKpmVariantWithRuntimeInternal(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
final override val runtimeDependenciesConfiguration: Configuration,
final override val runtimeElementsConfiguration: Configuration
) : GradleKpmVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
dependencyConfigurations = dependencyConfigurations,
compileDependenciesConfiguration = compileDependencyConfiguration,
apiElementsConfiguration = apiElementsConfiguration
), GradleKpmVariantWithRuntime {
// TODO deduplicate with KotlinCompilation?
override var runtimeDependencyFiles: FileCollection = project.files(runtimeDependenciesConfiguration)
override val runtimeFiles: ConfigurableFileCollection =
project.files(listOf({ compilationOutputs.allOutputs }, { runtimeDependencyFiles }))
}
@@ -44,13 +44,13 @@ abstract class KotlinPm20GradlePlugin @Inject constructor(
private fun createDefaultModules(project: Project) { private fun createDefaultModules(project: Project) {
project.pm20Extension.apply { project.pm20Extension.apply {
modules.create(KpmGradleModule.MAIN_MODULE_NAME) modules.create(GradleKpmModule.MAIN_MODULE_NAME)
modules.create(KpmGradleModule.TEST_MODULE_NAME) modules.create(GradleKpmModule.TEST_MODULE_NAME)
main { makePublic() } main { makePublic() }
} }
} }
private fun setupPublicationForModule(module: KpmGradleModule) { private fun setupPublicationForModule(module: GradleKpmModule) {
val project = module.project val project = module.project
val metadataElements = project.configurations.getByName(metadataElementsConfigurationName(module)) val metadataElements = project.configurations.getByName(metadataElementsConfigurationName(module))
@@ -87,62 +87,62 @@ abstract class KotlinPm20GradlePlugin @Inject constructor(
} }
} }
fun rootPublicationComponentName(module: KpmGradleModule) = fun rootPublicationComponentName(module: GradleKpmModule) =
module.disambiguateName("root") module.disambiguateName("root")
open class KotlinPm20ProjectExtension(project: Project) : KotlinTopLevelExtension(project) { open class KotlinPm20ProjectExtension(project: Project) : KotlinTopLevelExtension(project) {
internal val kpmModelContainer = DefaultKpmGradleProjectModelContainer.create(project) internal val kpmModelContainer = GradleKpmDefaultProjectModelContainer.create(project)
internal val ideaKotlinProjectModelBuilder by lazy { IdeaKotlinProjectModelBuilder.default(this) } internal val ideaKotlinProjectModelBuilder by lazy { IdeaKotlinProjectModelBuilder.default(this) }
val modules: NamedDomainObjectContainer<KpmGradleModule> val modules: NamedDomainObjectContainer<GradleKpmModule>
get() = project.kpmModules get() = project.kpmModules
@Suppress("unused") // DSL function @Suppress("unused") // DSL function
fun mainAndTest(configure: KpmGradleModule.() -> Unit) { fun mainAndTest(configure: GradleKpmModule.() -> Unit) {
main(configure) main(configure)
test(configure) test(configure)
} }
val main: KpmGradleModule val main: GradleKpmModule
get() = modules.getByName(KpmGradleModule.MAIN_MODULE_NAME) get() = modules.getByName(GradleKpmModule.MAIN_MODULE_NAME)
val test: KpmGradleModule val test: GradleKpmModule
get() = modules.getByName(KpmGradleModule.TEST_MODULE_NAME) get() = modules.getByName(GradleKpmModule.TEST_MODULE_NAME)
fun main(configure: KpmGradleModule.() -> Unit = { }) = main.apply(configure) fun main(configure: GradleKpmModule.() -> Unit = { }) = main.apply(configure)
fun test(configure: KpmGradleModule.() -> Unit = { }) = test.apply(configure) fun test(configure: GradleKpmModule.() -> Unit = { }) = test.apply(configure)
@PublishedApi @PublishedApi
@JvmName("isAllowCommonizer") @JvmName("isAllowCommonizer")
internal fun isAllowCommonizerForIde(@Suppress("UNUSED_PARAMETER") project: Project): Boolean = false internal fun isAllowCommonizerForIde(@Suppress("UNUSED_PARAMETER") project: Project): Boolean = false
} }
val KpmGradleModule.jvm: KpmJvmVariant val GradleKpmModule.jvm: GradleKpmJvmVariant
get() = fragments.maybeCreate("jvm", KpmJvmVariant::class.java) get() = fragments.maybeCreate("jvm", GradleKpmJvmVariant::class.java)
fun KpmGradleModule.jvm(configure: KpmJvmVariant.() -> Unit): KpmJvmVariant = jvm.apply(configure) fun GradleKpmModule.jvm(configure: GradleKpmJvmVariant.() -> Unit): GradleKpmJvmVariant = jvm.apply(configure)
fun KotlinPm20ProjectExtension.jvm(configure: KotlinFragmentSlice<KpmJvmVariant>.() -> Unit) { fun KotlinPm20ProjectExtension.jvm(configure: KotlinFragmentSlice<GradleKpmJvmVariant>.() -> Unit) {
val getOrCreateVariant: KpmGradleModule.() -> KpmJvmVariant = { jvm } val getOrCreateVariant: GradleKpmModule.() -> GradleKpmJvmVariant = { jvm }
mainAndTest { getOrCreateVariant(this) } mainAndTest { getOrCreateVariant(this) }
val slice = KotlinFragmentSlice(this, getOrCreateVariant) val slice = KotlinFragmentSlice(this, getOrCreateVariant)
configure(slice) configure(slice)
} }
open class KotlinFragmentSlice<T : KpmGradleFragment>( open class KotlinFragmentSlice<T : GradleKpmFragment>(
val pm20ProjectExtension: KotlinPm20ProjectExtension, val pm20ProjectExtension: KotlinPm20ProjectExtension,
val getOrCreateFragment: (KpmGradleModule) -> T val getOrCreateFragment: (GradleKpmModule) -> T
) { ) {
fun inMain(configure: T.() -> Unit) { fun inMain(configure: T.() -> Unit) {
pm20ProjectExtension.modules.getByName(KpmGradleModule.MAIN_MODULE_NAME).apply { pm20ProjectExtension.modules.getByName(GradleKpmModule.MAIN_MODULE_NAME).apply {
getOrCreateFragment(this).configure() getOrCreateFragment(this).configure()
} }
} }
fun inTest(configure: T.() -> Unit) { fun inTest(configure: T.() -> Unit) {
pm20ProjectExtension.modules.getByName(KpmGradleModule.TEST_MODULE_NAME).apply { pm20ProjectExtension.modules.getByName(GradleKpmModule.TEST_MODULE_NAME).apply {
getOrCreateFragment(this).configure() getOrCreateFragment(this).configure()
} }
} }
@@ -161,11 +161,11 @@ open class KotlinFragmentSlice<T : KpmGradleFragment>(
pm20ProjectExtension.modules.getByName(moduleName).apply { getOrCreateFragment(this).configure() } pm20ProjectExtension.modules.getByName(moduleName).apply { getOrCreateFragment(this).configure() }
} }
fun inModule(module: NamedDomainObjectProvider<KpmGradleModule>, configure: T.() -> Unit) { fun inModule(module: NamedDomainObjectProvider<GradleKpmModule>, configure: T.() -> Unit) {
module.get().apply { inModule(this, configure) } module.get().apply { inModule(this, configure) }
} }
fun inModule(module: KpmGradleModule, configure: T.() -> Unit) { fun inModule(module: GradleKpmModule, configure: T.() -> Unit) {
getOrCreateFragment(module).configure() getOrCreateFragment(module).configure()
} }
} }
@@ -9,35 +9,35 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
typealias KotlinCommonFragmentFactory = KotlinGradleFragmentFactory<KpmGradleFragmentInternal> typealias GradleKpmCommonFragmentFactory = GradleKpmFragmentFactory<GradleKpmFragmentInternal>
fun KotlinCommonFragmentFactory(module: KpmGradleModule): KotlinCommonFragmentFactory = fun GradleKpmCommonFragmentFactory(module: GradleKpmModule): GradleKpmCommonFragmentFactory =
KotlinCommonFragmentFactory(KotlinCommonFragmentInstantiator(module)) GradleKpmCommonFragmentFactory(GradleKpmCommonFragmentInstantiator(module))
fun KotlinCommonFragmentFactory( fun GradleKpmCommonFragmentFactory(
commonFragmentInstantiator: KotlinCommonFragmentInstantiator, commonFragmentInstantiator: GradleKpmCommonFragmentInstantiator,
commonFragmentConfigurator: KotlinCommonFragmentConfigurator = KotlinCommonFragmentConfigurator() commonFragmentConfigurator: GradleKpmCommonFragmentConfigurator = GradleKpmCommonFragmentConfigurator()
): KotlinGradleFragmentFactory<KpmGradleFragmentInternal> = KotlinGradleFragmentFactory( ): GradleKpmFragmentFactory<GradleKpmFragmentInternal> = GradleKpmFragmentFactory(
fragmentInstantiator = commonFragmentInstantiator, fragmentInstantiator = commonFragmentInstantiator,
fragmentConfigurator = commonFragmentConfigurator fragmentConfigurator = commonFragmentConfigurator
) )
class KotlinCommonFragmentInstantiator( class GradleKpmCommonFragmentInstantiator(
private val module: KpmGradleModule, private val module: GradleKpmModule,
private val dependencyConfigurationsFactory: KotlinFragmentDependencyConfigurationsFactory = private val dependencyConfigurationsFactory: GradleKpmFragmentDependencyConfigurationsFactory =
DefaultKotlinFragmentDependencyConfigurationsFactory GradleKpmDefaultFragmentDependencyConfigurationsFactory
) : KotlinGradleFragmentFactory.FragmentInstantiator<KpmGradleFragmentInternal> { ) : GradleKpmFragmentFactory.FragmentInstantiator<GradleKpmFragmentInternal> {
override fun create(name: String): KpmGradleFragmentInternal { override fun create(name: String): GradleKpmFragmentInternal {
val names = FragmentNameDisambiguation(module, name) val names = FragmentNameDisambiguation(module, name)
return KpmGradleFragmentInternal(module, name, dependencyConfigurationsFactory.create(module, names)) return GradleKpmFragmentInternal(module, name, dependencyConfigurationsFactory.create(module, names))
} }
} }
class KotlinCommonFragmentConfigurator( class GradleKpmCommonFragmentConfigurator(
private val sourceDirectoriesSetup: KotlinSourceDirectoriesConfigurator<KpmGradleFragmentInternal> = private val sourceDirectoriesSetup: GradleKpmSourceDirectoriesConfigurator<GradleKpmFragmentInternal> =
DefaultKotlinSourceDirectoriesConfigurator GradleKpmDefaultSourceDirectoriesConfigurator
) : KotlinGradleFragmentFactory.FragmentConfigurator<KpmGradleFragmentInternal> { ) : GradleKpmFragmentFactory.FragmentConfigurator<GradleKpmFragmentInternal> {
override fun configure(fragment: KpmGradleFragmentInternal) { override fun configure(fragment: GradleKpmFragmentInternal) {
sourceDirectoriesSetup.configure(fragment) sourceDirectoriesSetup.configure(fragment)
} }
} }
@@ -7,24 +7,22 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
interface KotlinCompileTaskConfigurator<in T : KpmGradleVariant> { interface GradleKpmCompileTaskConfigurator<in T : GradleKpmVariant> {
fun registerCompileTasks(variant: T): TaskProvider<*> fun registerCompileTasks(variant: T): TaskProvider<*>
} }
object KotlinJvmCompileTaskConfigurator : KotlinCompileTaskConfigurator<KpmJvmVariant> { object GradleKpmJvmCompileTaskConfigurator : GradleKpmCompileTaskConfigurator<GradleKpmJvmVariant> {
override fun registerCompileTasks(variant: KpmJvmVariant): TaskProvider<*> { override fun registerCompileTasks(variant: GradleKpmJvmVariant): TaskProvider<*> {
val compilationData = variant.compilationData val compilationData = variant.compilationData
LifecycleTasksManager(variant.project).registerClassesTask(compilationData) LifecycleTasksManager(variant.project).registerClassesTask(compilationData)
return KotlinCompilationTaskConfigurator(variant.project).createKotlinJvmCompilationTask(variant, compilationData) return GradleKpmCompilationTaskConfigurator(variant.project).createKotlinJvmCompilationTask(variant, compilationData)
} }
} }
object KotlinNativeCompileTaskConfigurator : KotlinCompileTaskConfigurator<KpmNativeVariantInternal> { object GradleKpmNativeCompileTaskConfigurator : GradleKpmCompileTaskConfigurator<GradleKpmNativeVariantInternal> {
override fun registerCompileTasks(variant: KpmNativeVariantInternal): TaskProvider<*> { override fun registerCompileTasks(variant: GradleKpmNativeVariantInternal): TaskProvider<*> {
val compilationData = variant.compilationData val compilationData = variant.compilationData
LifecycleTasksManager(variant.project).registerClassesTask(compilationData) LifecycleTasksManager(variant.project).registerClassesTask(compilationData)
return KotlinCompilationTaskConfigurator(variant.project).createKotlinNativeCompilationTask(variant, compilationData) return GradleKpmCompilationTaskConfigurator(variant.project).createKotlinNativeCompilationTask(variant, compilationData)
} }
} }
@@ -10,15 +10,15 @@ import org.gradle.api.file.FileCollection
import org.gradle.api.file.SourceDirectorySet import org.gradle.api.file.SourceDirectorySet
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.GradleModuleVariantResolver import org.jetbrains.kotlin.gradle.plugin.mpp.KpmGradleModuleVariantResolver
import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.allDependencyModules import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.allDependencyModules
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
import org.jetbrains.kotlin.gradle.utils.filesProvider import org.jetbrains.kotlin.gradle.utils.filesProvider
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.project.model.VariantResolution import org.jetbrains.kotlin.project.model.KpmVariantResolution
interface KotlinVariantCompilationDataInternal<T : KotlinCommonOptions> : KotlinVariantCompilationData<T> { interface GradleKpmVariantCompilationDataInternal<T : KotlinCommonOptions> : GradleKpmVariantCompilationData<T> {
override val compileKotlinTaskName: String override val compileKotlinTaskName: String
get() = lowerCamelCaseName("compile", compilationPurpose.takeIf { it != "main" }, "Kotlin", compilationClassifier) get() = lowerCamelCaseName("compile", compilationPurpose.takeIf { it != "main" }, "Kotlin", compilationClassifier)
@@ -26,7 +26,7 @@ interface KotlinVariantCompilationDataInternal<T : KotlinCommonOptions> : Kotlin
get() = owner.disambiguateName("classes") get() = owner.disambiguateName("classes")
override val kotlinSourceDirectoriesByFragmentName: Map<String, SourceDirectorySet> override val kotlinSourceDirectoriesByFragmentName: Map<String, SourceDirectorySet>
get() = owner.withRefinesClosure.filterIsInstance<KpmGradleVariant>().associate { it.disambiguateName("") to it.kotlinSourceRoots } get() = owner.withRefinesClosure.filterIsInstance<GradleKpmVariant>().associate { it.disambiguateName("") to it.kotlinSourceRoots }
override val friendPaths: Iterable<FileCollection> override val friendPaths: Iterable<FileCollection>
get() { get() {
@@ -54,21 +54,21 @@ interface KotlinVariantCompilationDataInternal<T : KotlinCommonOptions> : Kotlin
override val moduleName: String override val moduleName: String
get() = // TODO accurate module names that don't rely on all variants having a main counterpart get() = // TODO accurate module names that don't rely on all variants having a main counterpart
owner.containingModule.project.kpmModules owner.containingModule.project.kpmModules
.getByName(KpmGradleModule.MAIN_MODULE_NAME).variants.findByName(owner.name)?.ownModuleName() ?: ownModuleName .getByName(GradleKpmModule.MAIN_MODULE_NAME).variants.findByName(owner.name)?.ownModuleName() ?: ownModuleName
override val ownModuleName: String override val ownModuleName: String
get() = owner.ownModuleName() get() = owner.ownModuleName()
private fun resolveFriendVariants(): Iterable<KpmGradleVariant> { private fun resolveFriendVariants(): Iterable<GradleKpmVariant> {
val moduleResolver = KpmGradleModuleDependencyResolver.getForCurrentBuild(project) val moduleResolver = GradleKpmModuleDependencyResolver.getForCurrentBuild(project)
val variantResolver = GradleModuleVariantResolver.getForCurrentBuild(project) val variantResolver = KpmGradleModuleVariantResolver.getForCurrentBuild(project)
val dependencyGraphResolver = KpmGradleDependencyGraphResolver(moduleResolver) val dependencyGraphResolver = GradleKpmDependencyGraphResolver(moduleResolver)
val friendModules = val friendModules =
((dependencyGraphResolver.resolveDependencyGraph(owner.containingModule) as? KpmGradleDependencyGraph) ((dependencyGraphResolver.resolveDependencyGraph(owner.containingModule) as? GradleKpmDependencyGraph)
?: error("Failed to resolve dependencies of ${owner.containingModule}")) ?: error("Failed to resolve dependencies of ${owner.containingModule}"))
.allDependencyModules .allDependencyModules
.filterIsInstance<KpmGradleModule>() .filterIsInstance<GradleKpmModule>()
.filter { dependencyModule -> .filter { dependencyModule ->
// the module comes from the same Gradle project // todo: extend to other friends once supported // the module comes from the same Gradle project // todo: extend to other friends once supported
dependencyModule.project == owner.containingModule.project dependencyModule.project == owner.containingModule.project
@@ -77,12 +77,12 @@ interface KotlinVariantCompilationDataInternal<T : KotlinCommonOptions> : Kotlin
return friendModules return friendModules
.map { friendModule -> variantResolver.getChosenVariant(owner, friendModule) } .map { friendModule -> variantResolver.getChosenVariant(owner, friendModule) }
// also, important to check that the owner variant really requests this module: // also, important to check that the owner variant really requests this module:
.filterIsInstance<VariantResolution.VariantMatch>() .filterIsInstance<KpmVariantResolution.KpmVariantMatch>()
.mapNotNull { variantMatch -> variantMatch.chosenVariant as? KpmGradleVariant } .mapNotNull { variantMatch -> variantMatch.chosenVariant as? GradleKpmVariant }
} }
} }
fun KotlinCompilationData<*>.isMainCompilationData(): Boolean = when (this) { fun KotlinCompilationData<*>.isMainCompilationData(): Boolean = when (this) {
is KotlinCompilation<*> -> isMain() is KotlinCompilation<*> -> isMain()
else -> compilationPurpose == KpmGradleModule.MAIN_MODULE_NAME else -> compilationPurpose == GradleKpmModule.MAIN_MODULE_NAME
} }
@@ -15,19 +15,19 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
open class KotlinCompilationTaskConfigurator( open class GradleKpmCompilationTaskConfigurator(
protected val project: Project protected val project: Project
) { ) {
open val fragmentSourcesProvider: FragmentSourcesProvider = FragmentSourcesProvider() open val fragmentSourcesProvider: GradleKpmFragmentSourcesProvider = GradleKpmFragmentSourcesProvider()
open fun getSourcesForFragmentCompilation(fragment: KpmGradleFragment): MultipleSourceRootsProvider = open fun getSourcesForFragmentCompilation(fragment: GradleKpmFragment): MultipleSourceRootsProvider =
fragmentSourcesProvider.getSourcesFromRefinesClosure(fragment) fragmentSourcesProvider.getSourcesFromRefinesClosure(fragment)
open fun getCommonSourcesForFragmentCompilation(fragment: KpmGradleFragment): MultipleSourceRootsProvider = open fun getCommonSourcesForFragmentCompilation(fragment: GradleKpmFragment): MultipleSourceRootsProvider =
fragmentSourcesProvider.getCommonSourcesFromRefinesClosure(fragment) fragmentSourcesProvider.getCommonSourcesFromRefinesClosure(fragment)
fun createKotlinJvmCompilationTask( fun createKotlinJvmCompilationTask(
variant: KpmGradleVariant, variant: GradleKpmVariant,
compilationData: KotlinCompilationData<*> compilationData: KotlinCompilationData<*>
): TaskProvider<out KotlinCompile> { ): TaskProvider<out KotlinCompile> {
Kotlin2JvmSourceSetProcessor(KotlinTasksProvider(), compilationData).run() Kotlin2JvmSourceSetProcessor(KotlinTasksProvider(), compilationData).run()
@@ -46,7 +46,7 @@ open class KotlinCompilationTaskConfigurator(
} }
protected fun createKotlinNativeCompilationTask( protected fun createKotlinNativeCompilationTask(
fragment: KpmGradleFragment, fragment: GradleKpmFragment,
compilationData: KotlinNativeCompilationData<*>, compilationData: KotlinNativeCompilationData<*>,
configure: KotlinNativeCompile.() -> Unit configure: KotlinNativeCompile.() -> Unit
): TaskProvider<KotlinNativeCompile> { ): TaskProvider<KotlinNativeCompile> {
@@ -65,7 +65,7 @@ open class KotlinCompilationTaskConfigurator(
} }
fun createKotlinNativeCompilationTask( fun createKotlinNativeCompilationTask(
variant: KpmGradleVariant, variant: GradleKpmVariant,
compilationData: KotlinNativeCompilationData<*> compilationData: KotlinNativeCompilationData<*>
): TaskProvider<KotlinNativeCompile> = createKotlinNativeCompilationTask(variant, compilationData) { ): TaskProvider<KotlinNativeCompile> = createKotlinNativeCompilationTask(variant, compilationData) {
kotlinPluginData = project.compilerPluginProviderForPlatformCompilation(variant, compilationData) kotlinPluginData = project.compilerPluginProviderForPlatformCompilation(variant, compilationData)
@@ -14,7 +14,7 @@ import org.jetbrains.kotlin.gradle.utils.dashSeparatedLowercaseName
/** /**
* Registers a [Jar] task with the variant's compilation outputs and attaches this artifact to the given configuration. * Registers a [Jar] task with the variant's compilation outputs and attaches this artifact to the given configuration.
*/ */
val KotlinFragmentCompilationOutputsJarArtifact = FragmentArtifacts<KpmGradleVariant> { val GradleKpmCompilationOutputsJarArtifact = GradleKpmConfigurationArtifactsSetup<GradleKpmVariant> {
val jar = project.locateOrRegisterTask<Jar>(fragment.outputsJarTaskName) { val jar = project.locateOrRegisterTask<Jar>(fragment.outputsJarTaskName) {
it.from(fragment.compilationOutputs.allOutputs) it.from(fragment.compilationOutputs.allOutputs)
it.archiveAppendix.set(dashSeparatedLowercaseName(fragment.name, fragment.containingModule.moduleClassifier)) it.archiveAppendix.set(dashSeparatedLowercaseName(fragment.name, fragment.containingModule.moduleClassifier))
@@ -23,5 +23,5 @@ val KotlinFragmentCompilationOutputsJarArtifact = FragmentArtifacts<KpmGradleVar
fragment.project.artifacts.add(Dependency.ARCHIVES_CONFIGURATION, jar) fragment.project.artifacts.add(Dependency.ARCHIVES_CONFIGURATION, jar)
} }
internal val KpmGradleVariant.outputsJarTaskName: String internal val GradleKpmVariant.outputsJarTaskName: String
get() = FragmentNameDisambiguationOmittingMain(containingModule, name).disambiguateName("jar") get() = FragmentNameDisambiguationOmittingMain(containingModule, name).disambiguateName("jar")
@@ -5,15 +5,15 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.GradleKpmNameDisambiguation
interface KotlinFragmentDependencyConfigurationsFactory { interface GradleKpmFragmentDependencyConfigurationsFactory {
fun create(module: KpmGradleModule, names: KotlinNameDisambiguation): KotlinFragmentDependencyConfigurations fun create(module: GradleKpmModule, names: GradleKpmNameDisambiguation): GradleKpmFragmentDependencyConfigurations
} }
object DefaultKotlinFragmentDependencyConfigurationsFactory : KotlinFragmentDependencyConfigurationsFactory { object GradleKpmDefaultFragmentDependencyConfigurationsFactory : GradleKpmFragmentDependencyConfigurationsFactory {
override fun create(module: KpmGradleModule, names: KotlinNameDisambiguation): KotlinFragmentDependencyConfigurations { override fun create(module: GradleKpmModule, names: GradleKpmNameDisambiguation): GradleKpmFragmentDependencyConfigurations {
val configurations = module.project.configurations val configurations = module.project.configurations
val apiConfiguration = configurations.maybeCreate(names.disambiguateName("api")) val apiConfiguration = configurations.maybeCreate(names.disambiguateName("api"))
val implementationConfiguration = configurations.maybeCreate(names.disambiguateName("implementation")) val implementationConfiguration = configurations.maybeCreate(names.disambiguateName("implementation"))
@@ -40,7 +40,7 @@ object DefaultKotlinFragmentDependencyConfigurationsFactory : KotlinFragmentDepe
transitiveImplementationConfiguration.extendsFrom(implementationConfiguration) transitiveImplementationConfiguration.extendsFrom(implementationConfiguration)
transitiveRuntimeOnlyConfiguration.extendsFrom(runtimeOnlyConfiguration) transitiveRuntimeOnlyConfiguration.extendsFrom(runtimeOnlyConfiguration)
return KotlinFragmentDependencyConfigurations.create( return GradleKpmFragmentDependencyConfigurations.create(
apiConfiguration = apiConfiguration, apiConfiguration = apiConfiguration,
implementationConfiguration = implementationConfiguration, implementationConfiguration = implementationConfiguration,
compileOnlyConfiguration = compileOnlyConfiguration, compileOnlyConfiguration = compileOnlyConfiguration,
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
* Will add this jar artifact to the given configuration * Will add this jar artifact to the given configuration
*/ */
val KotlinFragmentHostSpecificMetadataArtifact = FragmentArtifacts<KpmNativeVariantInternal> artifacts@{ val GradleKpmHostSpecificMetadataArtifact = GradleKpmConfigurationArtifactsSetup<GradleKpmNativeVariantInternal> artifacts@{
val hostSpecificMetadataElements = fragment.hostSpecificMetadataElementsConfiguration ?: return@artifacts val hostSpecificMetadataElements = fragment.hostSpecificMetadataElementsConfiguration ?: return@artifacts
val hostSpecificMetadataJar = project.registerTask<Jar>(fragment.disambiguateName("hostSpecificMetadataJar")) { jar -> val hostSpecificMetadataJar = project.registerTask<Jar>(fragment.disambiguateName("hostSpecificMetadataJar")) { jar ->
@@ -9,13 +9,13 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.capabilities.Capability import org.gradle.api.capabilities.Capability
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability
val KotlinFragmentModuleCapability = FragmentCapabilities<KpmGradleFragment> { val GradleKpmModuleCapability = GradleKpmConfigurationCapabilitiesSetup<GradleKpmFragment> {
capability(fragment.containingModule.moduleCapability ?: return@FragmentCapabilities) capability(fragment.containingModule.moduleCapability ?: return@GradleKpmConfigurationCapabilitiesSetup)
} }
internal fun setModuleCapability(configuration: Configuration, module: KpmGradleModule) { internal fun setModuleCapability(configuration: Configuration, module: GradleKpmModule) {
configuration.outgoing.capability(module.moduleCapability ?: return) configuration.outgoing.capability(module.moduleCapability ?: return)
} }
internal val KpmGradleModule.moduleCapability: Capability? internal val GradleKpmModule.moduleCapability: Capability?
get() = if (moduleClassifier != null) ComputedCapability.fromModule(this) else null get() = if (moduleClassifier != null) ComputedCapability.fromModule(this) else null
@@ -11,18 +11,16 @@ import org.gradle.api.artifacts.ConfigurablePublishArtifact
import org.gradle.api.artifacts.ConfigurationPublications import org.gradle.api.artifacts.ConfigurationPublications
import org.gradle.api.artifacts.ConfigurationVariant import org.gradle.api.artifacts.ConfigurationVariant
/* Internal abbreviation */
internal typealias FragmentArtifacts<T> = KotlinGradleFragmentConfigurationArtifacts<T>
interface KotlinGradleFragmentConfigurationArtifacts<in T : KpmGradleFragment> { interface GradleKpmConfigurationArtifactsSetup<in T : GradleKpmFragment> {
fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) fun setupArtifacts(outgoing: ConfigurationPublications, fragment: T)
object None : KotlinGradleFragmentConfigurationArtifacts<KpmGradleFragment> { object None : GradleKpmConfigurationArtifactsSetup<GradleKpmFragment> {
override fun addArtifacts(outgoing: ConfigurationPublications, fragment: KpmGradleFragment) = Unit override fun setupArtifacts(outgoing: ConfigurationPublications, fragment: GradleKpmFragment) = Unit
} }
} }
class KotlinGradleFragmentConfigurationArtifactsContext<T : KpmGradleFragment> internal constructor( class GradleKpmConfigurationArtifactsSetupContext<T : GradleKpmFragment> internal constructor(
internal val outgoing: ConfigurationPublications, internal val outgoing: ConfigurationPublications,
val fragment: T val fragment: T
) { ) {
@@ -40,40 +38,43 @@ class KotlinGradleFragmentConfigurationArtifactsContext<T : KpmGradleFragment> i
} }
@Suppress("FunctionName") @Suppress("FunctionName")
fun <T : KpmGradleFragment> FragmentArtifacts( fun <T : GradleKpmFragment> GradleKpmConfigurationArtifactsSetup(
addArtifacts: KotlinGradleFragmentConfigurationArtifactsContext<T>.() -> Unit addArtifacts: GradleKpmConfigurationArtifactsSetupContext<T>.() -> Unit
): KotlinGradleFragmentConfigurationArtifacts<T> { ): GradleKpmConfigurationArtifactsSetup<T> {
return object : KotlinGradleFragmentConfigurationArtifacts<T> { return object : GradleKpmConfigurationArtifactsSetup<T> {
override fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) { override fun setupArtifacts(outgoing: ConfigurationPublications, fragment: T) {
val context = KotlinGradleFragmentConfigurationArtifactsContext(outgoing, fragment) val context = GradleKpmConfigurationArtifactsSetupContext(outgoing, fragment)
context.addArtifacts() context.addArtifacts()
} }
} }
} }
operator fun <T : KpmGradleFragment> FragmentArtifacts<T>.plus(other: FragmentArtifacts<T>): FragmentArtifacts<T> { operator fun <T : GradleKpmFragment> GradleKpmConfigurationArtifactsSetup<T>.plus(
if (this === KotlinGradleFragmentConfigurationArtifacts.None) return other other: GradleKpmConfigurationArtifactsSetup<T>
if (other === KotlinGradleFragmentConfigurationArtifacts.None) return this ): GradleKpmConfigurationArtifactsSetup<T> {
if (this === GradleKpmConfigurationArtifactsSetup.None) return other
if (other === GradleKpmConfigurationArtifactsSetup.None) return this
if (this is CompositeFragmentArtifacts && other is CompositeFragmentArtifacts) { if (this is CompositeFragmentConfigurationArtifactsSetup && other is CompositeFragmentConfigurationArtifactsSetup) {
return CompositeFragmentArtifacts(this.children + other.children) return CompositeFragmentConfigurationArtifactsSetup(this.children + other.children)
} }
if (this is CompositeFragmentArtifacts) { if (this is CompositeFragmentConfigurationArtifactsSetup) {
return CompositeFragmentArtifacts(this.children + other) return CompositeFragmentConfigurationArtifactsSetup(this.children + other)
} }
if (other is CompositeFragmentArtifacts) { if (other is CompositeFragmentConfigurationArtifactsSetup) {
return CompositeFragmentArtifacts(listOf(this) + other.children) return CompositeFragmentConfigurationArtifactsSetup(listOf(this) + other.children)
} }
return CompositeFragmentArtifacts(listOf(this, other)) return CompositeFragmentConfigurationArtifactsSetup(listOf(this, other))
} }
internal class CompositeFragmentArtifacts<in T : KpmGradleFragment>(val children: List<FragmentArtifacts<T>>) : internal class CompositeFragmentConfigurationArtifactsSetup<in T : GradleKpmFragment>(
FragmentArtifacts<T> { val children: List<GradleKpmConfigurationArtifactsSetup<T>>
) : GradleKpmConfigurationArtifactsSetup<T> {
override fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) { override fun setupArtifacts(outgoing: ConfigurationPublications, fragment: T) {
children.forEach { child -> child.addArtifacts(outgoing, fragment) } children.forEach { child -> child.setupArtifacts(outgoing, fragment) }
} }
} }
@@ -11,18 +11,17 @@ import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeContainer import org.gradle.api.attributes.AttributeContainer
/* Internal abbreviation */ /* Internal abbreviation */
internal typealias FragmentAttributes<T> = KotlinGradleFragmentConfigurationAttributes<T>
interface KotlinGradleFragmentConfigurationAttributes<in T : KpmGradleFragment> { interface GradleKpmConfigurationAttributesSetup<in T : GradleKpmFragment> {
fun setAttributes(attributes: AttributeContainer, fragment: T) fun setupAttributes(attributes: AttributeContainer, fragment: T)
object None : FragmentAttributes<KpmGradleFragment> { object None : GradleKpmConfigurationAttributesSetup<GradleKpmFragment> {
override fun setAttributes(attributes: AttributeContainer, fragment: KpmGradleFragment) = Unit override fun setupAttributes(attributes: AttributeContainer, fragment: GradleKpmFragment) = Unit
} }
} }
class KotlinGradleFragmentConfigurationAttributesContext<T : KpmGradleFragment> internal constructor( class GradleKpmConfigurationAttributesSetupContext<T : GradleKpmFragment> internal constructor(
internal val attributes: AttributeContainer, internal val attributes: AttributeContainer,
val fragment: T, val fragment: T,
) : AttributeContainer by attributes { ) : AttributeContainer by attributes {
@@ -32,51 +31,51 @@ class KotlinGradleFragmentConfigurationAttributesContext<T : KpmGradleFragment>
inline fun <reified T : Named> namedAttribute(key: Attribute<T>, name: String) = apply { attribute(key, named(name)) } inline fun <reified T : Named> namedAttribute(key: Attribute<T>, name: String) = apply { attribute(key, named(name)) }
override fun <K : Any> attribute(key: Attribute<K>, value: K): KotlinGradleFragmentConfigurationAttributesContext<T> = apply { override fun <K : Any> attribute(key: Attribute<K>, value: K): GradleKpmConfigurationAttributesSetupContext<T> = apply {
attributes.attribute(key, value) attributes.attribute(key, value)
} }
} }
@Suppress("FunctionName") @Suppress("FunctionName")
fun <T : KpmGradleFragment> FragmentAttributes( fun <T : GradleKpmFragment> GradleKpmConfigurationAttributesSetup(
setAttributes: KotlinGradleFragmentConfigurationAttributesContext<T>.() -> Unit setAttributes: GradleKpmConfigurationAttributesSetupContext<T>.() -> Unit
): KotlinGradleFragmentConfigurationAttributes<T> { ): GradleKpmConfigurationAttributesSetup<T> {
return object : KotlinGradleFragmentConfigurationAttributes<T> { return object : GradleKpmConfigurationAttributesSetup<T> {
override fun setAttributes(attributes: AttributeContainer, fragment: T) { override fun setupAttributes(attributes: AttributeContainer, fragment: T) {
val context = KotlinGradleFragmentConfigurationAttributesContext(attributes, fragment) val context = GradleKpmConfigurationAttributesSetupContext(attributes, fragment)
context.setAttributes() context.setAttributes()
} }
} }
} }
fun <T : KpmGradleFragment> AttributeContainer.apply( fun <T : GradleKpmFragment> AttributeContainer.apply(
attributes: KotlinGradleFragmentConfigurationAttributes<T>, fragment: T attributes: GradleKpmConfigurationAttributesSetup<T>, fragment: T
) { ) {
attributes.setAttributes(this, fragment) attributes.setupAttributes(this, fragment)
} }
operator fun <T : KpmGradleFragment> FragmentAttributes<T>.plus(other: FragmentAttributes<T>): FragmentAttributes<T> { operator fun <T : GradleKpmFragment> GradleKpmConfigurationAttributesSetup<T>.plus(other: GradleKpmConfigurationAttributesSetup<T>): GradleKpmConfigurationAttributesSetup<T> {
if (this === KotlinGradleFragmentConfigurationAttributes.None) return other if (this === GradleKpmConfigurationAttributesSetup.None) return other
if (other === KotlinGradleFragmentConfigurationAttributes.None) return this if (other === GradleKpmConfigurationAttributesSetup.None) return this
if (this is CompositeFragmentAttributes && other is CompositeFragmentAttributes) { if (this is GradleKpmCompositeConfigurationAttributesSetup && other is GradleKpmCompositeConfigurationAttributesSetup) {
return CompositeFragmentAttributes(this.children + other.children) return GradleKpmCompositeConfigurationAttributesSetup(this.children + other.children)
} }
if (this is CompositeFragmentAttributes) { if (this is GradleKpmCompositeConfigurationAttributesSetup) {
return CompositeFragmentAttributes(this.children + other) return GradleKpmCompositeConfigurationAttributesSetup(this.children + other)
} }
if (other is CompositeFragmentAttributes) { if (other is GradleKpmCompositeConfigurationAttributesSetup) {
return CompositeFragmentAttributes(listOf(this) + other.children) return GradleKpmCompositeConfigurationAttributesSetup(listOf(this) + other.children)
} }
return CompositeFragmentAttributes(listOf(this, other)) return GradleKpmCompositeConfigurationAttributesSetup(listOf(this, other))
} }
internal class CompositeFragmentAttributes<in T : KpmGradleFragment>(val children: List<FragmentAttributes<T>>) : internal class GradleKpmCompositeConfigurationAttributesSetup<in T : GradleKpmFragment>(val children: List<GradleKpmConfigurationAttributesSetup<T>>) :
FragmentAttributes<T> { GradleKpmConfigurationAttributesSetup<T> {
override fun setAttributes(attributes: AttributeContainer, fragment: T) { override fun setupAttributes(attributes: AttributeContainer, fragment: T) {
children.forEach { child -> child.setAttributes(attributes, fragment) } children.forEach { child -> child.setupAttributes(attributes, fragment) }
} }
} }
@@ -8,78 +8,72 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationPublications import org.gradle.api.artifacts.ConfigurationPublications
import org.gradle.api.capabilities.Capability import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationCapabilitiesSetup.CapabilitiesContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentConfigurationCapabilities.CapabilitiesContainer
/* Internal abbreviation */ interface GradleKpmConfigurationCapabilitiesSetup<in T : GradleKpmFragment> {
internal typealias FragmentCapabilities<T> = KotlinGradleFragmentConfigurationCapabilities<T>
interface KotlinGradleFragmentConfigurationCapabilities<in T : KpmGradleFragment> {
interface CapabilitiesContainer { interface CapabilitiesContainer {
fun capability(notation: Any) fun capability(notation: Any)
} }
fun setCapabilities(container: CapabilitiesContainer, fragment: T) fun setCapabilities(container: CapabilitiesContainer, fragment: T)
object None : KotlinGradleFragmentConfigurationCapabilities<KpmGradleFragment> { object None : GradleKpmConfigurationCapabilitiesSetup<GradleKpmFragment> {
override fun setCapabilities(container: CapabilitiesContainer, fragment: KpmGradleFragment) = Unit override fun setCapabilities(container: CapabilitiesContainer, fragment: GradleKpmFragment) = Unit
} }
} }
fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationCapabilities<T>.setCapabilities( fun <T : GradleKpmFragment> GradleKpmConfigurationCapabilitiesSetup<T>.setCapabilities(
publications: ConfigurationPublications, fragment: T publications: ConfigurationPublications, fragment: T
) = setCapabilities(CapabilitiesContainer(publications), fragment) ) = setCapabilities(CapabilitiesContainer(publications), fragment)
fun CapabilitiesContainer(configuration: ConfigurationPublications): CapabilitiesContainer = fun CapabilitiesContainer(configuration: ConfigurationPublications): CapabilitiesContainer =
CapabilitiesContainerImpl(configuration) CapabilitiesContainerImpl(configuration)
fun CapabilitiesContainer(configuration: Configuration): CapabilitiesContainer =
CapabilitiesContainerImpl(configuration.outgoing)
private class CapabilitiesContainerImpl( private class CapabilitiesContainerImpl(
private val publications: ConfigurationPublications private val publications: ConfigurationPublications
) : CapabilitiesContainer { ) : CapabilitiesContainer {
override fun capability(notation: Any) = publications.capability(notation) override fun capability(notation: Any) = publications.capability(notation)
} }
class KotlinGradleFragmentConfigurationCapabilitiesContext<T : KpmGradleFragment> internal constructor( class GradleKpmConfigurationCapabilitiesSetupContext<T : GradleKpmFragment> internal constructor(
internal val container: CapabilitiesContainer, val fragment: T internal val container: CapabilitiesContainer, val fragment: T
) : CapabilitiesContainer by container { ) : CapabilitiesContainer by container {
val project: Project get() = fragment.project val project: Project get() = fragment.project
} }
fun <T : KpmGradleFragment> FragmentCapabilities( fun <T : GradleKpmFragment> GradleKpmConfigurationCapabilitiesSetup(
setCapabilities: KotlinGradleFragmentConfigurationCapabilitiesContext<T>.() -> Unit setCapabilities: GradleKpmConfigurationCapabilitiesSetupContext<T>.() -> Unit
): KotlinGradleFragmentConfigurationCapabilities<T> = object : KotlinGradleFragmentConfigurationCapabilities<T> { ): GradleKpmConfigurationCapabilitiesSetup<T> = object : GradleKpmConfigurationCapabilitiesSetup<T> {
override fun setCapabilities(container: CapabilitiesContainer, fragment: T) { override fun setCapabilities(container: CapabilitiesContainer, fragment: T) {
val context = KotlinGradleFragmentConfigurationCapabilitiesContext(container, fragment) val context = GradleKpmConfigurationCapabilitiesSetupContext(container, fragment)
context.setCapabilities() context.setCapabilities()
} }
} }
operator fun <T : KpmGradleFragment> FragmentCapabilities<T>.plus(other: FragmentCapabilities<T>): FragmentCapabilities<T> { operator fun <T : GradleKpmFragment> GradleKpmConfigurationCapabilitiesSetup<T>.plus(
if (this === KotlinGradleFragmentConfigurationCapabilities.None) return other other: GradleKpmConfigurationCapabilitiesSetup<T>
if (other === KotlinGradleFragmentConfigurationCapabilities.None) return this ): GradleKpmConfigurationCapabilitiesSetup<T> {
if (this === GradleKpmConfigurationCapabilitiesSetup.None) return other
if (other === GradleKpmConfigurationCapabilitiesSetup.None) return this
if (this is CompositeFragmentCapabilities && other is CompositeFragmentCapabilities) { if (this is CompositeKpmCapabilitiesSetup && other is CompositeKpmCapabilitiesSetup) {
return CompositeFragmentCapabilities(this.children + other.children) return CompositeKpmCapabilitiesSetup(this.children + other.children)
} }
if (this is CompositeFragmentCapabilities) { if (this is CompositeKpmCapabilitiesSetup) {
return CompositeFragmentCapabilities(this.children + other) return CompositeKpmCapabilitiesSetup(this.children + other)
} }
if (other is CompositeFragmentCapabilities) { if (other is CompositeKpmCapabilitiesSetup) {
return CompositeFragmentCapabilities(listOf(this) + other.children) return CompositeKpmCapabilitiesSetup(listOf(this) + other.children)
} }
return CompositeFragmentCapabilities(listOf(this, other)) return CompositeKpmCapabilitiesSetup(listOf(this, other))
} }
internal class CompositeFragmentCapabilities<in T : KpmGradleFragment>(val children: List<FragmentCapabilities<T>>) : internal class CompositeKpmCapabilitiesSetup<in T : GradleKpmFragment>(val children: List<GradleKpmConfigurationCapabilitiesSetup<T>>) :
FragmentCapabilities<T> { GradleKpmConfigurationCapabilitiesSetup<T> {
override fun setCapabilities(container: CapabilitiesContainer, fragment: T) { override fun setCapabilities(container: CapabilitiesContainer, fragment: T) {
children.forEach { child -> child.setCapabilities(container, fragment) } children.forEach { child -> child.setCapabilities(container, fragment) }
} }
@@ -7,48 +7,45 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.KotlinNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.GradleKpmNameDisambiguation
/* Internal abbreviation */ /* Internal abbreviation */
internal typealias ConfigurationDefinition<T> = KotlinGradleFragmentConfigurationDefinition<T>
data class KotlinGradleFragmentConfigurationDefinition<in T : KpmGradleFragment>( data class GradleKpmConfigurationSetup<in T : GradleKpmFragment>(
val provider: KotlinGradleFragmentConfigurationProvider, val provider: GradleKpmConfigurationProvider,
val attributes: KotlinGradleFragmentConfigurationAttributes<T> = KotlinGradleFragmentConfigurationAttributes.None, val attributes: GradleKpmConfigurationAttributesSetup<T> = GradleKpmConfigurationAttributesSetup.None,
val artifacts: KotlinGradleFragmentConfigurationArtifacts<T> = KotlinGradleFragmentConfigurationArtifacts.None, val artifacts: GradleKpmConfigurationArtifactsSetup<T> = GradleKpmConfigurationArtifactsSetup.None,
val relations: KotlinGradleFragmentConfigurationRelation = KotlinGradleFragmentConfigurationRelation.None, val relations: GradleKpmConfigurationRelationSetup = GradleKpmConfigurationRelationSetup.None,
@property:AdvancedKotlinGradlePluginApi @property:AdvancedKotlinGradlePluginApi
val capabilities: KotlinGradleFragmentConfigurationCapabilities<T> = KotlinGradleFragmentConfigurationCapabilities.None, val capabilities: GradleKpmConfigurationCapabilitiesSetup<T> = GradleKpmConfigurationCapabilitiesSetup.None,
) )
/* Internal abbreviation */
internal typealias ConfigurationContext = KotlinGradleFragmentConfigurationContext
interface KotlinGradleFragmentConfigurationContext : KotlinNameDisambiguation { interface GradleKpmFragmentConfigureContext : GradleKpmNameDisambiguation {
val project: Project get() = module.project val project: Project get() = module.project
val module: KpmGradleModule val module: GradleKpmModule
val dependencies: KotlinFragmentDependencyConfigurations val dependencies: GradleKpmFragmentDependencyConfigurations
} }
internal class KotlinGradleFragmentConfigurationContextImpl( internal class GradleKpmFragmentConfigureContextImpl(
override val module: KpmGradleModule, override val module: GradleKpmModule,
override val dependencies: KotlinFragmentDependencyConfigurations, override val dependencies: GradleKpmFragmentDependencyConfigurations,
names: KotlinNameDisambiguation names: GradleKpmNameDisambiguation
) : KotlinGradleFragmentConfigurationContext, KotlinNameDisambiguation by names ) : GradleKpmFragmentConfigureContext, GradleKpmNameDisambiguation by names
fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.withConfigurationProvider( fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.withConfigurationProvider(
provider: KotlinGradleFragmentConfigurationContext.() -> Configuration provider: GradleKpmFragmentConfigureContext.() -> Configuration
) = copy(provider = ConfigurationProvider(provider)) ) = copy(provider = GradleKpmConfigurationProvider(provider))
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentAttributes<T>): operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationAttributesSetup<T>):
KotlinGradleFragmentConfigurationDefinition<T> = copy(attributes = attributes + other) GradleKpmConfigurationSetup<T> = copy(attributes = attributes + other)
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentArtifacts<T>): operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationArtifactsSetup<T>):
KotlinGradleFragmentConfigurationDefinition<T> = copy(artifacts = artifacts + other) GradleKpmConfigurationSetup<T> = copy(artifacts = artifacts + other)
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentConfigurationRelation): operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationRelationSetup):
KotlinGradleFragmentConfigurationDefinition<T> = copy(relations = relations + other) GradleKpmConfigurationSetup<T> = copy(relations = relations + other)
@AdvancedKotlinGradlePluginApi @AdvancedKotlinGradlePluginApi
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentCapabilities<T>): operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationCapabilitiesSetup<T>):
KotlinGradleFragmentConfigurationDefinition<T> = copy(capabilities = capabilities + other) GradleKpmConfigurationSetup<T> = copy(capabilities = capabilities + other)
@@ -9,11 +9,11 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
interface KotlinGradleFragmentConfigurationProvider { interface GradleKpmConfigurationProvider {
fun getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration fun getConfiguration(context: GradleKpmFragmentConfigureContext): Configuration
} }
fun ConfigurationProvider(provider: KotlinGradleFragmentConfigurationContext.() -> Configuration): fun GradleKpmConfigurationProvider(provider: GradleKpmFragmentConfigureContext.() -> Configuration):
KotlinGradleFragmentConfigurationProvider = object : KotlinGradleFragmentConfigurationProvider { GradleKpmConfigurationProvider = object : GradleKpmConfigurationProvider {
override fun getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration = context.provider() override fun getConfiguration(context: GradleKpmFragmentConfigureContext): Configuration = context.provider()
} }
@@ -8,60 +8,57 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationPublications
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
/* Internal abbreviation */
internal typealias FragmentConfigurationRelation = KotlinGradleFragmentConfigurationRelation
interface KotlinGradleFragmentConfigurationRelation { interface GradleKpmConfigurationRelationSetup {
fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext)
object None : KotlinGradleFragmentConfigurationRelation { object None : GradleKpmConfigurationRelationSetup {
override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) = Unit override fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext) = Unit
} }
} }
operator fun FragmentConfigurationRelation.plus(other: FragmentConfigurationRelation): FragmentConfigurationRelation { operator fun GradleKpmConfigurationRelationSetup.plus(other: GradleKpmConfigurationRelationSetup): GradleKpmConfigurationRelationSetup {
if (this === KotlinGradleFragmentConfigurationRelation.None) return other if (this === GradleKpmConfigurationRelationSetup.None) return other
if (other === KotlinGradleFragmentConfigurationRelation.None) return this if (other === GradleKpmConfigurationRelationSetup.None) return this
if (this is CompositeFragmentConfigurationRelation && other is CompositeFragmentConfigurationRelation) { if (this is CompositeKpmConfigurationRelationSetup && other is CompositeKpmConfigurationRelationSetup) {
return CompositeFragmentConfigurationRelation(this.children + other.children) return CompositeKpmConfigurationRelationSetup(this.children + other.children)
} }
if (this is CompositeFragmentConfigurationRelation) { if (this is CompositeKpmConfigurationRelationSetup) {
return CompositeFragmentConfigurationRelation(this.children + other) return CompositeKpmConfigurationRelationSetup(this.children + other)
} }
if (other is CompositeFragmentConfigurationRelation) { if (other is CompositeKpmConfigurationRelationSetup) {
return CompositeFragmentConfigurationRelation(listOf(this) + other.children) return CompositeKpmConfigurationRelationSetup(listOf(this) + other.children)
} }
return CompositeFragmentConfigurationRelation(listOf(this, other)) return CompositeKpmConfigurationRelationSetup(listOf(this, other))
} }
internal class CompositeFragmentConfigurationRelation(val children: List<FragmentConfigurationRelation>) : internal class CompositeKpmConfigurationRelationSetup(val children: List<GradleKpmConfigurationRelationSetup>) :
FragmentConfigurationRelation { GradleKpmConfigurationRelationSetup {
override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) { override fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext) {
children.forEach { child -> child.setExtendsFrom(configuration, context) } children.forEach { child -> child.setupExtendsFromRelations(configuration, context) }
} }
} }
class KotlinGradleFragmentConfigurationRelationContext internal constructor( class GradleKpmFragmentConfigureRelationContext internal constructor(
val configuration: Configuration, val configuration: Configuration,
context: KotlinGradleFragmentConfigurationContext context: GradleKpmFragmentConfigureContext
) : KotlinGradleFragmentConfigurationContext by context { ) : GradleKpmFragmentConfigureContext by context {
fun extendsFrom(configuration: Configuration) = this.configuration.extendsFrom(configuration) fun extendsFrom(configuration: Configuration) = this.configuration.extendsFrom(configuration)
fun extendsFrom(configuration: String) = project.addExtendsFromRelation(this.configuration.name, configuration) fun extendsFrom(configuration: String) = project.addExtendsFromRelation(this.configuration.name, configuration)
} }
fun FragmentConfigurationRelation( fun GradleKpmConfigurationRelationSetup(
setExtendsFrom: KotlinGradleFragmentConfigurationRelationContext.() -> Unit setExtendsFrom: GradleKpmFragmentConfigureRelationContext.() -> Unit
): KotlinGradleFragmentConfigurationRelation = object : KotlinGradleFragmentConfigurationRelation { ): GradleKpmConfigurationRelationSetup = object : GradleKpmConfigurationRelationSetup {
override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) { override fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext) {
val relationContext = KotlinGradleFragmentConfigurationRelationContext(configuration, context) val relationContext = GradleKpmFragmentConfigureRelationContext(configuration, context)
relationContext.setExtendsFrom() relationContext.setExtendsFrom()
} }
} }
@@ -7,11 +7,11 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.FragmentConfigurator import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentFactory.FragmentConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.FragmentInstantiator import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentFactory.FragmentInstantiator
/** /**
* Factory used by [KpmGradleModule] to polymorphic-ally create fragments/variants. * Factory used by [GradleKpmModule] to polymorphic-ally create fragments/variants.
* Fragments are created in two stages with this factory: * Fragments are created in two stages with this factory:
* *
* [FragmentInstantiator]: * [FragmentInstantiator]:
@@ -26,22 +26,22 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.F
* - Setting up additional Gradle tasks * - Setting up additional Gradle tasks
* - Setting up publication * - Setting up publication
*/ */
class KotlinGradleFragmentFactory<T : KpmGradleFragment>( class GradleKpmFragmentFactory<T : GradleKpmFragment>(
private val fragmentInstantiator: FragmentInstantiator<T>, private val fragmentInstantiator: FragmentInstantiator<T>,
private val fragmentConfigurator: FragmentConfigurator<T> private val fragmentConfigurator: FragmentConfigurator<T>
) : NamedDomainObjectFactory<T> { ) : NamedDomainObjectFactory<T> {
/** /**
* @see KotlinGradleFragmentFactory * @see GradleKpmFragmentFactory
*/ */
interface FragmentInstantiator<out T : KpmGradleFragment> { interface FragmentInstantiator<out T : GradleKpmFragment> {
fun create(name: String): T fun create(name: String): T
} }
/** /**
* @see KotlinGradleFragmentFactory * @see GradleKpmFragmentFactory
*/ */
interface FragmentConfigurator<in T : KpmGradleFragment> { interface FragmentConfigurator<in T : GradleKpmFragment> {
fun configure(fragment: T) fun configure(fragment: T)
} }
@@ -50,10 +50,10 @@ class KotlinGradleFragmentFactory<T : KpmGradleFragment>(
} }
} }
internal fun <T : KpmGradleFragment> Configuration.configure( internal fun <T : GradleKpmFragment> Configuration.configure(
definition: KotlinGradleFragmentConfigurationDefinition<T>, fragment: T definition: GradleKpmConfigurationSetup<T>, fragment: T
) { ) {
definition.attributes.setAttributes(attributes, fragment) definition.attributes.setupAttributes(attributes, fragment)
definition.artifacts.addArtifacts(outgoing, fragment) definition.artifacts.setupArtifacts(outgoing, fragment)
definition.capabilities.setCapabilities(outgoing, fragment) definition.capabilities.setCapabilities(outgoing, fragment)
} }
@@ -10,31 +10,32 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.ExtensiblePolymorphicDomainObjectContainer import org.gradle.api.ExtensiblePolymorphicDomainObjectContainer
import org.gradle.api.NamedDomainObjectSet import org.gradle.api.NamedDomainObjectSet
import org.gradle.api.Project import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.project.model.* import org.jetbrains.kotlin.project.model.*
import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment
import javax.inject.Inject import javax.inject.Inject
open class KpmGradleModuleInternal( open class GradleKpmModuleInternal(
final override val project: Project, final override val project: Project,
final override val moduleClassifier: String? final override val moduleClassifier: String?
) : KpmGradleModule { ) : GradleKpmModule {
@Inject @Inject
constructor(project: Project, moduleName: CharSequence) : this( constructor(project: Project, moduleName: CharSequence) : this(
project, project,
moduleName.takeIf { it != KpmGradleModule.MAIN_MODULE_NAME }?.toString() moduleName.takeIf { it != GradleKpmModule.MAIN_MODULE_NAME }?.toString()
) )
override val moduleIdentifier: KpmModuleIdentifier = override val moduleIdentifier: KpmModuleIdentifier =
KpmLocalModuleIdentifier(project.currentBuildId().name, project.path, moduleClassifier) KpmLocalModuleIdentifier(project.currentBuildId().name, project.path, moduleClassifier)
override val fragments: ExtensiblePolymorphicDomainObjectContainer<KpmGradleFragment> = override val fragments: ExtensiblePolymorphicDomainObjectContainer<GradleKpmFragment> =
project.objects.polymorphicDomainObjectContainer(KpmGradleFragment::class.java) project.objects.polymorphicDomainObjectContainer(GradleKpmFragment::class.java)
// TODO DSL & build script model: find a way to create a flexible typed view on fragments? // TODO DSL & build script model: find a way to create a flexible typed view on fragments?
override val variants: NamedDomainObjectSet<KpmGradleVariant> by lazy { override val variants: NamedDomainObjectSet<GradleKpmVariant> by lazy {
fragments.withType(KpmGradleVariant::class.java) fragments.withType(GradleKpmVariant::class.java)
} }
override val plugins: Set<KpmCompilerPlugin> by lazy { override val plugins: Set<KpmCompilerPlugin> by lazy {
@@ -70,14 +71,14 @@ open class KpmGradleModuleInternal(
override fun toString(): String = "$moduleIdentifier (Gradle)" override fun toString(): String = "$moduleIdentifier (Gradle)"
} }
internal val KpmGradleModule.resolvableMetadataConfigurationName: String internal val GradleKpmModule.resolvableMetadataConfigurationName: String
get() = lowerCamelCaseName(name, "DependenciesMetadata") get() = lowerCamelCaseName(name, "DependenciesMetadata")
internal val KpmGradleModule.isMain internal val GradleKpmModule.isMain
get() = moduleIdentifier.moduleClassifier == null get() = moduleIdentifier.moduleClassifier == null
internal fun KpmGradleModule.disambiguateName(simpleName: String) = internal fun GradleKpmModule.disambiguateName(simpleName: String) =
lowerCamelCaseName(moduleClassifier, simpleName) lowerCamelCaseName(moduleClassifier, simpleName)
internal fun KpmGradleModule.variantsContainingFragment(fragment: KpmFragment): Iterable<KpmGradleVariant> = internal fun GradleKpmModule.variantsContainingFragment(fragment: KpmFragment): Iterable<GradleKpmVariant> =
(this as KpmModule).variantsContainingFragment(fragment).onEach { it as KpmGradleVariant } as Iterable<KpmGradleVariant> (this as KpmModule).variantsContainingFragment(fragment).onEach { it as GradleKpmVariant } as Iterable<GradleKpmVariant>
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.Project import org.gradle.api.Project
open class KotlinGradleModuleFactory(private val project: Project) : NamedDomainObjectFactory<KpmGradleModule> { open class GradleKpmModuleFactory(private val project: Project) : NamedDomainObjectFactory<GradleKpmModule> {
override fun create(name: String): KpmGradleModule { override fun create(name: String): GradleKpmModule {
val result = project.objects.newInstance(KpmGradleModuleInternal::class.java, project, name) val result = project.objects.newInstance(GradleKpmModuleInternal::class.java, project, name)
registerFragmentFactory(result) registerFragmentFactory(result)
registerDefaultCommonFragment(result) registerDefaultCommonFragment(result)
addDefaultDependencyOnMainModule(result) addDefaultDependencyOnMainModule(result)
@@ -18,29 +18,29 @@ open class KotlinGradleModuleFactory(private val project: Project) : NamedDomain
return result return result
} }
protected open fun registerDefaultCommonFragment(module: KpmGradleModule) { protected open fun registerDefaultCommonFragment(module: GradleKpmModule) {
module.fragments.register(KpmGradleFragment.COMMON_FRAGMENT_NAME, KpmGradleFragment::class.java) module.fragments.register(GradleKpmFragment.COMMON_FRAGMENT_NAME, GradleKpmFragment::class.java)
} }
protected open fun addDefaultRefinementDependencyOnCommon(module: KpmGradleModule) { protected open fun addDefaultRefinementDependencyOnCommon(module: GradleKpmModule) {
module.fragments.matching { it.name != KpmGradleFragment.COMMON_FRAGMENT_NAME }.all { module.fragments.matching { it.name != GradleKpmFragment.COMMON_FRAGMENT_NAME }.all {
it.refines(module.fragments.named(KpmGradleFragment.COMMON_FRAGMENT_NAME)) it.refines(module.fragments.named(GradleKpmFragment.COMMON_FRAGMENT_NAME))
} }
} }
protected open fun addDefaultDependencyOnMainModule(module: KpmGradleModule) { protected open fun addDefaultDependencyOnMainModule(module: GradleKpmModule) {
if (module.name != KpmGradleModule.MAIN_MODULE_NAME) { if (module.name != GradleKpmModule.MAIN_MODULE_NAME) {
module.fragments module.fragments
.matching { it.fragmentName == KpmGradleFragment.COMMON_FRAGMENT_NAME } .matching { it.fragmentName == GradleKpmFragment.COMMON_FRAGMENT_NAME }
.configureEach { commonFragment -> .configureEach { commonFragment ->
commonFragment.dependencies { commonFragment.dependencies {
api(module.project.kpmModules.getByName(KpmGradleModule.MAIN_MODULE_NAME)) api(module.project.kpmModules.getByName(GradleKpmModule.MAIN_MODULE_NAME))
} }
} }
} }
} }
protected open fun registerFragmentFactory(module: KpmGradleModule) { protected open fun registerFragmentFactory(module: GradleKpmModule) {
module.fragments.registerFactory(KpmGradleFragment::class.java, KotlinCommonFragmentFactory(module)) module.fragments.registerFactory(GradleKpmFragment::class.java, GradleKpmCommonFragmentFactory(module))
} }
} }
@@ -9,80 +9,80 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguationOmittingMain import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguationOmittingMain
typealias KotlinJvmVariantFactory = KotlinGradleFragmentFactory<KpmJvmVariant> typealias GradleKpmJvmVariantFactory = GradleKpmFragmentFactory<GradleKpmJvmVariant>
fun KotlinJvmVariantFactory( fun GradleKpmJvmVariantFactory(
module: KpmGradleModule, config: KotlinJvmVariantConfig = KotlinJvmVariantConfig() module: GradleKpmModule, config: GradleKpmJvmVariantConfig = GradleKpmJvmVariantConfig()
): KotlinJvmVariantFactory = KotlinJvmVariantFactory( ): GradleKpmJvmVariantFactory = GradleKpmJvmVariantFactory(
KotlinJvmVariantInstantiator(module, config), GradleKpmJvmVariantInstantiator(module, config),
KotlinJvmVariantConfigurator(config) GradleKpmJvmVariantConfigurator(config)
) )
data class KotlinJvmVariantConfig( data class GradleKpmJvmVariantConfig(
val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory val dependenciesConfigurationFactory: GradleKpmFragmentDependencyConfigurationsFactory
= DefaultKotlinFragmentDependencyConfigurationsFactory, = GradleKpmDefaultFragmentDependencyConfigurationsFactory,
val compileDependencies: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant> val compileDependencies: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinCompileDependenciesDefinition, = DefaultKotlinCompileDependenciesDefinition,
val runtimeDependencies: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant> val runtimeDependencies: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinRuntimeDependenciesDefinition, = DefaultKotlinRuntimeDependenciesDefinition,
val apiElements: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant> val apiElements: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinApiElementsDefinition + KotlinFragmentCompilationOutputsJarArtifact, = DefaultKotlinApiElementsDefinition + GradleKpmCompilationOutputsJarArtifact,
val runtimeElements: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant> val runtimeElements: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinRuntimeElementsDefinition, = DefaultKotlinRuntimeElementsDefinition,
val compileTaskConfigurator: KotlinCompileTaskConfigurator<KpmJvmVariant> val compileTaskConfigurator: GradleKpmCompileTaskConfigurator<GradleKpmJvmVariant>
= KotlinJvmCompileTaskConfigurator, = GradleKpmJvmCompileTaskConfigurator,
val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator<KpmJvmVariant> val sourceArchiveTaskConfigurator: GradleKpmSourceArchiveTaskConfigurator<GradleKpmJvmVariant>
= DefaultKotlinSourceArchiveTaskConfigurator, = GradleKpmDefaultKotlinSourceArchiveTaskConfigurator,
val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator<KpmJvmVariant> val sourceDirectoriesConfigurator: GradleKpmSourceDirectoriesConfigurator<GradleKpmJvmVariant>
= DefaultKotlinSourceDirectoriesConfigurator, = GradleKpmDefaultSourceDirectoriesConfigurator,
val publicationConfigurator: KotlinPublicationConfigurator<KpmJvmVariant> val publicationConfigurator: GradleKpmPublicationConfigurator<GradleKpmJvmVariant>
= KotlinPublicationConfigurator.SingleVariantPublication = GradleKpmPublicationConfigurator.SingleVariantPublication
) )
class KotlinJvmVariantInstantiator internal constructor( class GradleKpmJvmVariantInstantiator internal constructor(
private val module: KpmGradleModule, private val module: GradleKpmModule,
private val config: KotlinJvmVariantConfig private val config: GradleKpmJvmVariantConfig
) : KotlinGradleFragmentFactory.FragmentInstantiator<KpmJvmVariant> { ) : GradleKpmFragmentFactory.FragmentInstantiator<GradleKpmJvmVariant> {
override fun create(name: String): KpmJvmVariant { override fun create(name: String): GradleKpmJvmVariant {
val names = FragmentNameDisambiguationOmittingMain(module, name) val names = FragmentNameDisambiguationOmittingMain(module, name)
val context = KotlinGradleFragmentConfigurationContextImpl( val context = GradleKpmFragmentConfigureContextImpl(
module, config.dependenciesConfigurationFactory.create(module, names), names module, config.dependenciesConfigurationFactory.create(module, names), names
) )
return KpmJvmVariant( return GradleKpmJvmVariant(
containingModule = module, containingModule = module,
fragmentName = name, fragmentName = name,
dependencyConfigurations = context.dependencies, dependencyConfigurations = context.dependencies,
compileDependenciesConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration -> compileDependenciesConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration ->
config.compileDependencies.relations.setExtendsFrom(configuration, context) config.compileDependencies.relations.setupExtendsFromRelations(configuration, context)
}, },
runtimeDependenciesConfiguration = config.runtimeDependencies.provider.getConfiguration(context).also { configuration -> runtimeDependenciesConfiguration = config.runtimeDependencies.provider.getConfiguration(context).also { configuration ->
config.runtimeElements.relations.setExtendsFrom(configuration, context) config.runtimeElements.relations.setupExtendsFromRelations(configuration, context)
}, },
apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration -> apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration ->
config.apiElements.relations.setExtendsFrom(configuration, context) config.apiElements.relations.setupExtendsFromRelations(configuration, context)
}, },
runtimeElementsConfiguration = config.runtimeElements.provider.getConfiguration(context).also { configuration -> runtimeElementsConfiguration = config.runtimeElements.provider.getConfiguration(context).also { configuration ->
config.runtimeElements.relations.setExtendsFrom(configuration, context) config.runtimeElements.relations.setupExtendsFromRelations(configuration, context)
} }
) )
} }
} }
class KotlinJvmVariantConfigurator internal constructor( class GradleKpmJvmVariantConfigurator internal constructor(
private val config: KotlinJvmVariantConfig private val config: GradleKpmJvmVariantConfig
) : KotlinGradleFragmentFactory.FragmentConfigurator<KpmJvmVariant> { ) : GradleKpmFragmentFactory.FragmentConfigurator<GradleKpmJvmVariant> {
override fun configure(fragment: KpmJvmVariant) { override fun configure(fragment: GradleKpmJvmVariant) {
fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment) fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment)
fragment.runtimeDependenciesConfiguration.configure(config.runtimeDependencies, fragment) fragment.runtimeDependenciesConfiguration.configure(config.runtimeDependencies, fragment)
fragment.apiElementsConfiguration.configure(config.apiElements, fragment) fragment.apiElementsConfiguration.configure(config.apiElements, fragment)
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.dsl.*
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptionsImpl import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformCommonOptionsImpl
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
import org.jetbrains.kotlin.gradle.targets.metadata.ResolvedMetadataFilesProvider import org.jetbrains.kotlin.gradle.targets.metadata.ResolvedMetadataFilesProvider
import org.jetbrains.kotlin.gradle.targets.metadata.createMetadataDependencyTransformationClasspath import org.jetbrains.kotlin.gradle.targets.metadata.createMetadataDependencyTransformationClasspath
@@ -32,8 +33,8 @@ interface KotlinCommonFragmentMetadataCompilationData : KotlinMetadataCompilatio
internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : KotlinCommonOptions>( internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : KotlinCommonOptions>(
final override val project: Project, final override val project: Project,
val fragment: KpmGradleFragment, val fragment: GradleKpmFragment,
private val module: KpmGradleModule, private val module: GradleKpmModule,
private val compileAllTask: TaskProvider<DefaultTask>, private val compileAllTask: TaskProvider<DefaultTask>,
val metadataCompilationRegistry: MetadataCompilationRegistry, val metadataCompilationRegistry: MetadataCompilationRegistry,
private val resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>> private val resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>>
@@ -106,8 +107,8 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : Kotlin
internal open class KotlinCommonFragmentMetadataCompilationDataImpl( internal open class KotlinCommonFragmentMetadataCompilationDataImpl(
project: Project, project: Project,
fragment: KpmGradleFragment, fragment: GradleKpmFragment,
module: KpmGradleModule, module: GradleKpmModule,
compileAllTask: TaskProvider<DefaultTask>, compileAllTask: TaskProvider<DefaultTask>,
metadataCompilationRegistry: MetadataCompilationRegistry, metadataCompilationRegistry: MetadataCompilationRegistry,
resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>> resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>>
@@ -133,18 +134,18 @@ interface KotlinNativeFragmentMetadataCompilationData :
KotlinMetadataCompilationData<KotlinCommonOptions>, KotlinMetadataCompilationData<KotlinCommonOptions>,
KotlinNativeCompilationData<KotlinCommonOptions> KotlinNativeCompilationData<KotlinCommonOptions>
internal fun KpmGradleFragment.isNativeShared(): Boolean = internal fun GradleKpmFragment.isNativeShared(): Boolean =
containingVariants.run { containingVariants.run {
any() && all { it.platformType == KotlinPlatformType.native } any() && all { it.platformType == KotlinPlatformType.native }
} }
internal fun KpmGradleFragment.isNativeHostSpecific(): Boolean = internal fun GradleKpmFragment.isNativeHostSpecific(): Boolean =
this in getHostSpecificFragments(containingModule) this in getHostSpecificFragments(containingModule)
internal open class KotlinNativeFragmentMetadataCompilationDataImpl( internal open class KotlinNativeFragmentMetadataCompilationDataImpl(
project: Project, project: Project,
fragment: KpmGradleFragment, fragment: GradleKpmFragment,
module: KpmGradleModule, module: GradleKpmModule,
compileAllTask: TaskProvider<DefaultTask>, compileAllTask: TaskProvider<DefaultTask>,
metadataCompilationRegistry: MetadataCompilationRegistry, metadataCompilationRegistry: MetadataCompilationRegistry,
resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>> resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>>
@@ -168,7 +169,7 @@ internal open class KotlinNativeFragmentMetadataCompilationDataImpl(
override val konanTarget: KonanTarget override val konanTarget: KonanTarget
get() { get() {
val nativeVariants = val nativeVariants =
fragment.containingVariants.filterIsInstance<KpmNativeVariantInternal>() fragment.containingVariants.filterIsInstance<GradleKpmNativeVariantInternal>()
return nativeVariants.firstOrNull { it.konanTarget.enabledOnCurrentHost }?.konanTarget return nativeVariants.firstOrNull { it.konanTarget.enabledOnCurrentHost }?.konanTarget
?: nativeVariants.firstOrNull()?.konanTarget ?: nativeVariants.firstOrNull()?.konanTarget
?: HostManager.host ?: HostManager.host
@@ -182,10 +183,10 @@ internal open class KotlinNativeFragmentMetadataCompilationDataImpl(
// TODO think about more generic case: a fragment that can be compiled by an arbitrary compiler // TODO think about more generic case: a fragment that can be compiled by an arbitrary compiler
// what tasks should we create? should there be a generic task for that? // what tasks should we create? should there be a generic task for that?
internal class MetadataCompilationRegistry { internal class MetadataCompilationRegistry {
private val commonCompilationDataPerFragment = LinkedHashMap<KpmGradleFragment, KotlinCommonFragmentMetadataCompilationDataImpl>() private val commonCompilationDataPerFragment = LinkedHashMap<GradleKpmFragment, KotlinCommonFragmentMetadataCompilationDataImpl>()
private val nativeCompilationDataPerFragment = LinkedHashMap<KpmGradleFragment, KotlinNativeFragmentMetadataCompilationDataImpl>() private val nativeCompilationDataPerFragment = LinkedHashMap<GradleKpmFragment, KotlinNativeFragmentMetadataCompilationDataImpl>()
fun registerCommon(fragment: KpmGradleFragment, compilationData: KotlinCommonFragmentMetadataCompilationDataImpl) { fun registerCommon(fragment: GradleKpmFragment, compilationData: KotlinCommonFragmentMetadataCompilationDataImpl) {
commonCompilationDataPerFragment.compute(fragment) { _, existing -> commonCompilationDataPerFragment.compute(fragment) { _, existing ->
existing?.let { error("common compilation data for fragment $fragment already registered") } existing?.let { error("common compilation data for fragment $fragment already registered") }
compilationData compilationData
@@ -193,7 +194,7 @@ internal class MetadataCompilationRegistry {
withAllCommonCallbacks.forEach { it.invoke(compilationData) } withAllCommonCallbacks.forEach { it.invoke(compilationData) }
} }
fun registerNative(fragment: KpmGradleFragment, compilationData: KotlinNativeFragmentMetadataCompilationDataImpl) { fun registerNative(fragment: GradleKpmFragment, compilationData: KotlinNativeFragmentMetadataCompilationDataImpl) {
nativeCompilationDataPerFragment.compute(fragment) { _, existing -> nativeCompilationDataPerFragment.compute(fragment) { _, existing ->
existing?.let { error("native compilation data for fragment $fragment already registered") } existing?.let { error("native compilation data for fragment $fragment already registered") }
compilationData compilationData
@@ -201,7 +202,7 @@ internal class MetadataCompilationRegistry {
withAllNativeCallbacks.forEach { it.invoke(compilationData) } withAllNativeCallbacks.forEach { it.invoke(compilationData) }
} }
fun getForFragmentOrNull(fragment: KpmGradleFragment): AbstractKotlinFragmentMetadataCompilationData<*>? = fun getForFragmentOrNull(fragment: GradleKpmFragment): AbstractKotlinFragmentMetadataCompilationData<*>? =
listOf(commonCompilationDataPerFragment.getValue(fragment), nativeCompilationDataPerFragment.getValue(fragment)).singleOrNull { listOf(commonCompilationDataPerFragment.getValue(fragment), nativeCompilationDataPerFragment.getValue(fragment)).singleOrNull {
it.isActive it.isActive
} }
@@ -5,31 +5,29 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeCompileOptions
import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName import org.jetbrains.kotlin.gradle.plugin.mpp.publishedConfigurationName
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
abstract class KpmNativeVariantInternal( abstract class GradleKpmNativeVariantInternal(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
val konanTarget: KonanTarget, val konanTarget: KonanTarget,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
final override val hostSpecificMetadataElementsConfiguration: Configuration? final override val hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariant, ) : GradleKpmNativeVariant,
KpmGradleVariantInternal( GradleKpmVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
dependencyConfigurations = dependencyConfigurations, dependencyConfigurations = dependencyConfigurations,
compileDependenciesConfiguration = compileDependencyConfiguration, compileDependenciesConfiguration = compileDependencyConfiguration,
apiElementsConfiguration = apiElementsConfiguration apiElementsConfiguration = apiElementsConfiguration
), ),
SingleMavenPublishedModuleHolder by DefaultSingleMavenPublishedModuleHolder(containingModule, fragmentName) { GradleKpmSingleMavenPublishedModuleHolder by GradleKpmDefaultSingleMavenPublishedModuleHolder(containingModule, fragmentName) {
override var enableEndorsedLibraries: Boolean = false override var enableEndorsedLibraries: Boolean = false
@@ -40,35 +38,7 @@ abstract class KpmNativeVariantInternal(
DefaultCInteropSettings(project, cinteropName, compilationData) DefaultCInteropSettings(project, cinteropName, compilationData)
} }
override val compilationData by lazy { KotlinNativeVariantCompilationData(this) } override val compilationData by lazy { GradleKpmNativeVariantCompilationData(this) }
}
class KotlinNativeVariantConstructor<T : KpmNativeVariantInternal>(
val konanTarget: KonanTarget,
val variantClass: Class<T>,
private val constructor: (
containingModule: KpmGradleModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) -> T
) {
operator fun invoke(
containingModule: KpmGradleModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
): T = constructor(
containingModule, fragmentName,
dependencyConfigurations,
compileDependencyConfiguration,
apiElementsConfiguration,
hostSpecificMetadataElementsConfiguration
)
} }
interface KotlinNativeCompilationData<T : KotlinCommonOptions> : KotlinCompilationData<T> { interface KotlinNativeCompilationData<T : KotlinCommonOptions> : KotlinCompilationData<T> {
@@ -76,27 +46,9 @@ interface KotlinNativeCompilationData<T : KotlinCommonOptions> : KotlinCompilati
val enableEndorsedLibs: Boolean val enableEndorsedLibs: Boolean
} }
internal class KotlinNativeVariantCompilationData(
val variant: KpmNativeVariantInternal
) : KotlinVariantCompilationDataInternal<KotlinCommonOptions>, KotlinNativeCompilationData<KotlinCommonOptions> {
override val konanTarget: KonanTarget
get() = variant.konanTarget
override val enableEndorsedLibs: Boolean
get() = variant.enableEndorsedLibraries
override val project: Project
get() = variant.containingModule.project
override val owner: KpmNativeVariant
get() = variant
override val kotlinOptions: KotlinCommonOptions = NativeCompileOptions { variant.languageSettings }
}
internal class KotlinMappedNativeCompilationFactory( internal class KotlinMappedNativeCompilationFactory(
target: KotlinNativeTarget, target: KotlinNativeTarget,
private val variantClass: Class<out KpmNativeVariantInternal> private val variantClass: Class<out GradleKpmNativeVariantInternal>
) : KotlinNativeCompilationFactory(target) { ) : KotlinNativeCompilationFactory(target) {
override fun create(name: String): KotlinNativeCompilation { override fun create(name: String): KotlinNativeCompilation {
val module = target.project.kpmModules.maybeCreate(name) val module = target.project.kpmModules.maybeCreate(name)
@@ -9,76 +9,75 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.FragmentNameDisambiguation
fun <T : KpmNativeVariantInternal> KotlinNativeVariantFactory( fun <T : GradleKpmNativeVariantInternal> GradleKpmNativeVariantFactory(
module: KpmGradleModule, module: GradleKpmModule,
constructor: KotlinNativeVariantConstructor<T>, constructor: GradleKpmNativeVariantConstructor<T>,
config: KotlinNativeVariantConfig<T> = KotlinNativeVariantConfig() config: GradleKpmNativeVariantConfig<T> = GradleKpmNativeVariantConfig()
) = KotlinGradleFragmentFactory( ) = GradleKpmFragmentFactory(
fragmentInstantiator = KotlinNativeVariantInstantiator(module, constructor, config), fragmentInstantiator = GradleKpmNativeVariantInstantiator(module, constructor, config),
fragmentConfigurator = KotlinNativeVariantConfigurator(config) fragmentConfigurator = GradleKpmNativeVariantConfigurator(config)
) )
data class KotlinNativeVariantConfig<T : KpmNativeVariantInternal>( data class GradleKpmNativeVariantConfig<T : GradleKpmNativeVariantInternal>(
val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory = val dependenciesConfigurationFactory: GradleKpmFragmentDependencyConfigurationsFactory =
DefaultKotlinFragmentDependencyConfigurationsFactory, GradleKpmDefaultFragmentDependencyConfigurationsFactory,
val compileDependencies: ConfigurationDefinition<T> = val compileDependencies: GradleKpmConfigurationSetup<T> =
DefaultKotlinCompileDependenciesDefinition + KotlinFragmentKonanTargetAttribute, DefaultKotlinCompileDependenciesDefinition + GradleKpmKonanTargetAttribute,
val apiElements: ConfigurationDefinition<T> = val apiElements: GradleKpmConfigurationSetup<T> =
DefaultKotlinApiElementsDefinition DefaultKotlinApiElementsDefinition
+ KotlinFragmentKonanTargetAttribute + GradleKpmKonanTargetAttribute
+ FragmentConfigurationRelation { extendsFrom(dependencies.transitiveImplementationConfiguration) }, + GradleKpmConfigurationRelationSetup { extendsFrom(dependencies.transitiveImplementationConfiguration) },
val hostSpecificMetadataElements: ConfigurationDefinition<T> = val hostSpecificMetadataElements: GradleKpmConfigurationSetup<T> =
DefaultKotlinHostSpecificMetadataElementsDefinition, DefaultKotlinHostSpecificMetadataElementsDefinition,
val compileTaskConfigurator: KotlinCompileTaskConfigurator<T> = val compileTaskConfigurator: GradleKpmCompileTaskConfigurator<T> =
KotlinNativeCompileTaskConfigurator, GradleKpmNativeCompileTaskConfigurator,
val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator<T> = val sourceArchiveTaskConfigurator: GradleKpmSourceArchiveTaskConfigurator<T> =
DefaultKotlinSourceArchiveTaskConfigurator, GradleKpmDefaultKotlinSourceArchiveTaskConfigurator,
val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator<T> = val sourceDirectoriesConfigurator: GradleKpmSourceDirectoriesConfigurator<T> =
DefaultKotlinSourceDirectoriesConfigurator, GradleKpmDefaultSourceDirectoriesConfigurator,
val publicationConfigurator: KotlinPublicationConfigurator<KpmNativeVariantInternal> = val publicationConfigurator: GradleKpmPublicationConfigurator<GradleKpmNativeVariantInternal> =
KotlinPublicationConfigurator.NativeVariantPublication GradleKpmPublicationConfigurator.NativeVariantPublication
) )
class KotlinNativeVariantInstantiator<T : KpmNativeVariantInternal>( class GradleKpmNativeVariantInstantiator<T : GradleKpmNativeVariantInternal>(
private val module: KpmGradleModule, private val module: GradleKpmModule,
private val kotlinNativeVariantConstructor: KotlinNativeVariantConstructor<T>, private val variantConstructor: GradleKpmNativeVariantConstructor<T>,
private val config: KotlinNativeVariantConfig<T> private val config: GradleKpmNativeVariantConfig<T>
) : GradleKpmFragmentFactory.FragmentInstantiator<T> {
) : KotlinGradleFragmentFactory.FragmentInstantiator<T> {
override fun create(name: String): T { override fun create(name: String): T {
val names = FragmentNameDisambiguation(module, name) val names = FragmentNameDisambiguation(module, name)
val dependencies = config.dependenciesConfigurationFactory.create(module, names) val dependencies = config.dependenciesConfigurationFactory.create(module, names)
val context = KotlinGradleFragmentConfigurationContextImpl(module, dependencies, names) val context = GradleKpmFragmentConfigureContextImpl(module, dependencies, names)
return kotlinNativeVariantConstructor.invoke( return variantConstructor.invoke(
containingModule = module, containingModule = module,
fragmentName = name, fragmentName = name,
dependencyConfigurations = dependencies, dependencyConfigurations = dependencies,
compileDependencyConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration -> compileDependencyConfiguration = config.compileDependencies.provider.getConfiguration(context).also { configuration ->
config.compileDependencies.relations.setExtendsFrom(configuration, context) config.compileDependencies.relations.setupExtendsFromRelations(configuration, context)
}, },
apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration -> apiElementsConfiguration = config.apiElements.provider.getConfiguration(context).also { configuration ->
config.apiElements.relations.setExtendsFrom(configuration, context) config.apiElements.relations.setupExtendsFromRelations(configuration, context)
}, },
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration =
config.hostSpecificMetadataElements.provider.getConfiguration(context).also { configuration -> config.hostSpecificMetadataElements.provider.getConfiguration(context).also { configuration ->
config.hostSpecificMetadataElements.relations.setExtendsFrom(configuration, context) config.hostSpecificMetadataElements.relations.setupExtendsFromRelations(configuration, context)
} }
) )
} }
} }
class KotlinNativeVariantConfigurator<T : KpmNativeVariantInternal>( class GradleKpmNativeVariantConfigurator<T : GradleKpmNativeVariantInternal>(
private val config: KotlinNativeVariantConfig<T> private val config: GradleKpmNativeVariantConfig<T>
) : KotlinGradleFragmentFactory.FragmentConfigurator<T> { ) : GradleKpmFragmentFactory.FragmentConfigurator<T> {
override fun configure(fragment: T) { override fun configure(fragment: T) {
fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment) fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment)
@@ -5,21 +5,21 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20 package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
interface KotlinPublicationConfigurator<in T : KpmGradleVariant> : KotlinGradleFragmentFactory.FragmentConfigurator<T> { interface GradleKpmPublicationConfigurator<in T : GradleKpmVariant> : GradleKpmFragmentFactory.FragmentConfigurator<T> {
object NoPublication : KotlinPublicationConfigurator<KpmGradleVariant> { object NoPublication : GradleKpmPublicationConfigurator<GradleKpmVariant> {
override fun configure(fragment: KpmGradleVariant) = Unit override fun configure(fragment: GradleKpmVariant) = Unit
} }
object SingleVariantPublication : KotlinPublicationConfigurator<KpmGradlePublishedVariantWithRuntime> { object SingleVariantPublication : GradleKpmPublicationConfigurator<GradleKpmPublishedVariantWithRuntime> {
override fun configure(fragment: KpmGradlePublishedVariantWithRuntime) { override fun configure(fragment: GradleKpmPublishedVariantWithRuntime) {
VariantPublishingConfigurator.get(fragment.project).configureSingleVariantPublication(fragment) GradleKpmVariantPublishingConfigurator.get(fragment.project).configureSingleVariantPublication(fragment)
} }
} }
object NativeVariantPublication : KotlinPublicationConfigurator<KpmNativeVariantInternal> { object NativeVariantPublication : GradleKpmPublicationConfigurator<GradleKpmNativeVariantInternal> {
override fun configure(fragment: KpmNativeVariantInternal) { override fun configure(fragment: GradleKpmNativeVariantInternal) {
VariantPublishingConfigurator.get(fragment.project).configureNativeVariantPublication(fragment) GradleKpmVariantPublishingConfigurator.get(fragment.project).configureNativeVariantPublication(fragment)
} }
} }
} }
@@ -9,17 +9,17 @@ import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.unambiguousNameInProject import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.unambiguousNameInProject
import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTaskNamed import org.jetbrains.kotlin.gradle.plugin.mpp.sourcesJarTaskNamed
interface KotlinSourceArchiveTaskConfigurator<in T : KpmGradleVariant> { interface GradleKpmSourceArchiveTaskConfigurator<in T : GradleKpmVariant> {
fun registerSourceArchiveTask(variant: T): TaskProvider<*>? fun registerSourceArchiveTask(variant: T): TaskProvider<*>?
} }
object DefaultKotlinSourceArchiveTaskConfigurator : KotlinSourceArchiveTaskConfigurator<KpmGradleVariant> { object GradleKpmDefaultKotlinSourceArchiveTaskConfigurator : GradleKpmSourceArchiveTaskConfigurator<GradleKpmVariant> {
override fun registerSourceArchiveTask(variant: KpmGradleVariant): TaskProvider<*> { override fun registerSourceArchiveTask(variant: GradleKpmVariant): TaskProvider<*> {
return sourcesJarTaskNamed( return sourcesJarTaskNamed(
taskName = variant.sourceArchiveTaskName, taskName = variant.sourceArchiveTaskName,
project = variant.project, project = variant.project,
sourceSets = lazy { sourceSets = lazy {
FragmentSourcesProvider().getSourcesFromRefinesClosureAsMap(variant) GradleKpmFragmentSourcesProvider().getSourcesFromRefinesClosureAsMap(variant)
.entries.associate { it.key.unambiguousNameInProject to it.value.get() } .entries.associate { it.key.unambiguousNameInProject to it.value.get() }
}, },
artifactNameAppendix = variant.name artifactNameAppendix = variant.name
@@ -11,10 +11,10 @@ import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSource
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File import java.io.File
interface KotlinSourceDirectoriesConfigurator<in T : KpmGradleFragment>: KotlinGradleFragmentFactory.FragmentConfigurator<T> interface GradleKpmSourceDirectoriesConfigurator<in T : GradleKpmFragment>: GradleKpmFragmentFactory.FragmentConfigurator<T>
object DefaultKotlinSourceDirectoriesConfigurator : KotlinSourceDirectoriesConfigurator<KpmGradleFragment> { object GradleKpmDefaultSourceDirectoriesConfigurator : GradleKpmSourceDirectoriesConfigurator<GradleKpmFragment> {
override fun configure(fragment: KpmGradleFragment) { override fun configure(fragment: GradleKpmFragment) {
fragment.kotlinSourceRoots.srcDir( fragment.kotlinSourceRoots.srcDir(
fragment.project.provider { fragment.project.provider {
defaultSourceFolder( defaultSourceFolder(
@@ -25,7 +25,7 @@ object DefaultKotlinSourceDirectoriesConfigurator : KotlinSourceDirectoriesConfi
) )
} }
private fun fragmentDirectoryName(fragment: KpmGradleFragment): String { private fun fragmentDirectoryName(fragment: GradleKpmFragment): String {
val project = fragment.project val project = fragment.project
val isModelMappingEnabled = project.multiplatformExtensionOrNull != null val isModelMappingEnabled = project.multiplatformExtensionOrNull != null
val kpmDefaultResult = lowerCamelCaseName(fragment.name, fragment.containingModule.name) val kpmDefaultResult = lowerCamelCaseName(fragment.name, fragment.containingModule.name)
@@ -40,7 +40,7 @@ object DefaultKotlinSourceDirectoriesConfigurator : KotlinSourceDirectoriesConfi
} }
} }
fun defaultSourceFolder(fragment: KpmGradleFragment, type: String): File { fun defaultSourceFolder(fragment: GradleKpmFragment, type: String): File {
val fragmentDirectoryName = fragmentDirectoryName(fragment) val fragmentDirectoryName = fragmentDirectoryName(fragment)
return fragment.project.file("src/$fragmentDirectoryName/$type") return fragment.project.file("src/$fragmentDirectoryName/$type")
} }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.AbstractKotlinTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.VariantMappedCompilationDetails import org.jetbrains.kotlin.gradle.plugin.mpp.VariantMappedCompilationDetails
import java.util.concurrent.Callable import java.util.concurrent.Callable
internal open class KpmAwareTargetConfigurator<T : KotlinTarget>( internal open class GradleKpmAwareTargetConfigurator<T : KotlinTarget>(
private val legacyModelTargetConfigurator: AbstractKotlinTargetConfigurator<T>, private val legacyModelTargetConfigurator: AbstractKotlinTargetConfigurator<T>,
) : AbstractKotlinTargetConfigurator<T>(true, legacyModelTargetConfigurator.createDefaultSourceSets), ) : AbstractKotlinTargetConfigurator<T>(true, legacyModelTargetConfigurator.createDefaultSourceSets),
KotlinTargetConfigurator<T> by legacyModelTargetConfigurator { KotlinTargetConfigurator<T> by legacyModelTargetConfigurator {
@@ -31,7 +31,7 @@ internal open class KpmAwareTargetConfigurator<T : KotlinTarget>(
val compilationDetails = (compilation as? AbstractKotlinCompilation)?.compilationDetails val compilationDetails = (compilation as? AbstractKotlinCompilation)?.compilationDetails
if (compilationDetails is VariantMappedCompilationDetails<*> && compilationDetails.variant.containingModule.isMain) { if (compilationDetails is VariantMappedCompilationDetails<*> && compilationDetails.variant.containingModule.isMain) {
val variant = compilationDetails.variant val variant = compilationDetails.variant
if (variant is SingleMavenPublishedModuleHolder) { if (variant is GradleKpmSingleMavenPublishedModuleHolder) {
variant.whenPublicationAssigned { publication -> variant.whenPublicationAssigned { publication ->
target.publicationConfigureActions.all { action -> target.publicationConfigureActions.all { action ->
action.execute(publication) action.execute(publication)
@@ -76,10 +76,10 @@ internal open class KpmAwareTargetConfigurator<T : KotlinTarget>(
} }
} }
internal class KpmAwareTargetWithTestsConfigurator<R : KotlinTargetTestRun<*>, T : KotlinTargetWithTests<*, R>, C>( internal class GradleKpmAwareTargetWithTestsConfigurator<R : KotlinTargetTestRun<*>, T : KotlinTargetWithTests<*, R>, C>(
private val legacyModelTargetWithTestsConfigurator: C private val legacyModelTargetWithTestsConfigurator: C
) : ) :
KpmAwareTargetConfigurator<T>(legacyModelTargetWithTestsConfigurator), GradleKpmAwareTargetConfigurator<T>(legacyModelTargetWithTestsConfigurator),
KotlinTargetWithTestsConfigurator<R, T> KotlinTargetWithTestsConfigurator<R, T>
where C : AbstractKotlinTargetConfigurator<T>, where C : AbstractKotlinTargetConfigurator<T>,
@@ -95,4 +95,4 @@ internal class KpmAwareTargetWithTestsConfigurator<R : KotlinTargetTestRun<*>, T
override fun createTestRun(name: String, target: T): R = override fun createTestRun(name: String, target: T): R =
legacyModelTargetWithTestsConfigurator.createTestRun(name, target) legacyModelTargetWithTestsConfigurator.createTestRun(name, target)
} }
@@ -14,7 +14,7 @@ import org.gradle.util.ConfigureUtil
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.LanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinDependencyHandler import org.jetbrains.kotlin.gradle.plugin.mpp.DefaultKotlinDependencyHandler
import org.jetbrains.kotlin.gradle.plugin.mpp.toModuleDependency import org.jetbrains.kotlin.gradle.plugin.mpp.toKpmModuleDependency
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.sources.FragmentConsistencyChecker import org.jetbrains.kotlin.gradle.plugin.sources.FragmentConsistencyChecker
import org.jetbrains.kotlin.gradle.plugin.sources.FragmentConsistencyChecks import org.jetbrains.kotlin.gradle.plugin.sources.FragmentConsistencyChecks
@@ -25,12 +25,12 @@ import org.jetbrains.kotlin.tooling.core.MutableExtras
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
import javax.inject.Inject import javax.inject.Inject
open class KpmGradleFragmentInternal @Inject constructor( open class GradleKpmFragmentInternal @Inject constructor(
final override val containingModule: KpmGradleModule, final override val containingModule: GradleKpmModule,
final override val fragmentName: String, final override val fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations dependencyConfigurations: GradleKpmFragmentDependencyConfigurations
) : KpmGradleFragment, ) : GradleKpmFragment,
KotlinFragmentDependencyConfigurations by dependencyConfigurations { GradleKpmFragmentDependencyConfigurations by dependencyConfigurations {
final override fun getName(): String = fragmentName final override fun getName(): String = fragmentName
@@ -44,12 +44,12 @@ open class KpmGradleFragmentInternal @Inject constructor(
// FIXME check for consistency // FIXME check for consistency
override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder() override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder()
override fun refines(other: KpmGradleFragment) { override fun refines(other: GradleKpmFragment) {
checkCanRefine(other) checkCanRefine(other)
refines(containingModule.fragments.named(other.name)) refines(containingModule.fragments.named(other.name))
} }
override fun refines(other: NamedDomainObjectProvider<KpmGradleFragment>) { override fun refines(other: NamedDomainObjectProvider<GradleKpmFragment>) {
_directRefinesDependencies.add(other) _directRefinesDependencies.add(other)
other.configure { checkCanRefine(it) } other.configure { checkCanRefine(it) }
@@ -66,11 +66,11 @@ open class KpmGradleFragmentInternal @Inject constructor(
) )
project.runProjectConfigurationHealthCheckWhenEvaluated { project.runProjectConfigurationHealthCheckWhenEvaluated {
kotlinGradleFragmentConsistencyChecker.runAllChecks(this@KpmGradleFragmentInternal, other.get()) kotlinGradleFragmentConsistencyChecker.runAllChecks(this@GradleKpmFragmentInternal, other.get())
} }
} }
private fun checkCanRefine(other: KpmGradleFragment) { private fun checkCanRefine(other: GradleKpmFragment) {
check(containingModule == other.containingModule) { check(containingModule == other.containingModule) {
"Fragments can only refine each other within one module. Can't make $this refine $other" "Fragments can only refine each other within one module. Can't make $this refine $other"
} }
@@ -82,9 +82,9 @@ open class KpmGradleFragmentInternal @Inject constructor(
override fun dependencies(configureClosure: Closure<Any?>) = override fun dependencies(configureClosure: Closure<Any?>) =
dependencies f@{ ConfigureUtil.configure(configureClosure, this@f) } dependencies f@{ ConfigureUtil.configure(configureClosure, this@f) }
private val _directRefinesDependencies = mutableSetOf<Provider<KpmGradleFragment>>() private val _directRefinesDependencies = mutableSetOf<Provider<GradleKpmFragment>>()
override val declaredRefinesDependencies: Iterable<KpmGradleFragment> override val declaredRefinesDependencies: Iterable<GradleKpmFragment>
get() = _directRefinesDependencies.map { it.get() }.toSet() get() = _directRefinesDependencies.map { it.get() }.toSet()
// TODO: separate the declared module dependencies and exported module dependencies? we need this to keep implementation dependencies // TODO: separate the declared module dependencies and exported module dependencies? we need this to keep implementation dependencies
@@ -92,7 +92,7 @@ open class KpmGradleFragmentInternal @Inject constructor(
// anyway, so for now all fragments follow that behavior // anyway, so for now all fragments follow that behavior
override val declaredModuleDependencies: Iterable<KpmModuleDependency> override val declaredModuleDependencies: Iterable<KpmModuleDependency>
get() = listOf(apiConfiguration, implementationConfiguration).flatMapTo(mutableSetOf()) { exportConfiguration -> get() = listOf(apiConfiguration, implementationConfiguration).flatMapTo(mutableSetOf()) { exportConfiguration ->
exportConfiguration.allDependencies.map { dependency -> dependency.toModuleDependency(project) } exportConfiguration.allDependencies.map { dependency -> dependency.toKpmModuleDependency(project) }
} }
override val kotlinSourceRoots: SourceDirectorySet = override val kotlinSourceRoots: SourceDirectorySet =
@@ -106,7 +106,7 @@ open class KpmGradleFragmentInternal @Inject constructor(
FragmentConsistencyChecker( FragmentConsistencyChecker(
unitsName = "fragments", unitsName = "fragments",
name = { name }, name = { name },
checks = FragmentConsistencyChecks<KpmGradleFragment>( checks = FragmentConsistencyChecks<GradleKpmFragment>(
unitName = "fragment", unitName = "fragment",
languageSettings = { languageSettings } languageSettings = { languageSettings }
).allChecks ).allChecks
@@ -11,17 +11,18 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.filterModuleName import org.jetbrains.kotlin.gradle.plugin.mpp.filterModuleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
open class KpmJvmVariant( open class GradleKpmJvmVariant(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependenciesConfiguration: Configuration, compileDependenciesConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
runtimeDependenciesConfiguration: Configuration, runtimeDependenciesConfiguration: Configuration,
runtimeElementsConfiguration: Configuration runtimeElementsConfiguration: Configuration
) : KpmGradlePublishedVariantWithRuntime( ) : GradleKpmPublishedVariantWithRuntime(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
dependencyConfigurations = dependencyConfigurations, dependencyConfigurations = dependencyConfigurations,
@@ -30,20 +31,20 @@ open class KpmJvmVariant(
runtimeDependencyConfiguration = runtimeDependenciesConfiguration, runtimeDependencyConfiguration = runtimeDependenciesConfiguration,
runtimeElementsConfiguration = runtimeElementsConfiguration runtimeElementsConfiguration = runtimeElementsConfiguration
) { ) {
override val compilationData: KotlinJvmVariantCompilationData by lazy { KotlinJvmVariantCompilationData(this) } override val compilationData: GradleKpmJvmVariantCompilationData by lazy { GradleKpmJvmVariantCompilationData(this) }
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.jvm get() = KotlinPlatformType.jvm
} }
class KotlinJvmVariantCompilationData(val variant: KpmJvmVariant) : KotlinVariantCompilationDataInternal<KotlinJvmOptions> { class GradleKpmJvmVariantCompilationData(val variant: GradleKpmJvmVariant) : GradleKpmVariantCompilationDataInternal<KotlinJvmOptions> {
override val owner: KpmJvmVariant get() = variant override val owner: GradleKpmJvmVariant get() = variant
// TODO pull out to the variant // TODO pull out to the variant
override val kotlinOptions: KotlinJvmOptions = KotlinJvmOptionsImpl() override val kotlinOptions: KotlinJvmOptions = KotlinJvmOptionsImpl()
} }
internal fun KpmGradleVariant.ownModuleName(): String { internal fun GradleKpmVariant.ownModuleName(): String {
val project = containingModule.project val project = containingModule.project
val baseName = project.archivesName val baseName = project.archivesName
?: project.name ?: project.name
@@ -56,7 +57,7 @@ internal class KotlinMappedJvmCompilationFactory(
) : KotlinJvmCompilationFactory(target) { ) : KotlinJvmCompilationFactory(target) {
override fun create(name: String): KotlinJvmCompilation { override fun create(name: String): KotlinJvmCompilation {
val module = target.project.kpmModules.maybeCreate(name) val module = target.project.kpmModules.maybeCreate(name)
val variant = module.fragments.create(target.name, KpmJvmVariant::class.java) val variant = module.fragments.create(target.name, GradleKpmJvmVariant::class.java)
return KotlinJvmCompilation( return KotlinJvmCompilation(
VariantMappedCompilationDetailsWithRuntime(variant, target), VariantMappedCompilationDetailsWithRuntime(variant, target),
@@ -5,14 +5,14 @@ import org.jetbrains.kotlin.konan.target.KonanTarget
import javax.inject.Inject import javax.inject.Inject
// DO NOT EDIT MANUALLY! Generated by org.jetbrains.kotlin.generators.gradle.dsl.KpmNativeVariantCodegenKt // DO NOT EDIT MANUALLY! Generated by org.jetbrains.kotlin.generators.gradle.dsl.KpmNativeVariantCodegenKt
open class KpmAndroidNativeX64Variant @Inject constructor( open class GradleKpmAndroidNativeX64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_X64, konanTarget = KonanTarget.ANDROID_X64,
@@ -22,20 +22,20 @@ open class KpmAndroidNativeX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_X64, KpmAndroidNativeX64Variant::class.java, ::KpmAndroidNativeX64Variant KonanTarget.ANDROID_X64, GradleKpmAndroidNativeX64Variant::class.java, ::GradleKpmAndroidNativeX64Variant
) )
} }
} }
open class KpmAndroidNativeX86Variant @Inject constructor( open class GradleKpmAndroidNativeX86Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_X86, konanTarget = KonanTarget.ANDROID_X86,
@@ -45,20 +45,20 @@ open class KpmAndroidNativeX86Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_X86, KpmAndroidNativeX86Variant::class.java, ::KpmAndroidNativeX86Variant KonanTarget.ANDROID_X86, GradleKpmAndroidNativeX86Variant::class.java, ::GradleKpmAndroidNativeX86Variant
) )
} }
} }
open class KpmAndroidNativeArm32Variant @Inject constructor( open class GradleKpmAndroidNativeArm32Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_ARM32, konanTarget = KonanTarget.ANDROID_ARM32,
@@ -68,20 +68,20 @@ open class KpmAndroidNativeArm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_ARM32, KpmAndroidNativeArm32Variant::class.java, ::KpmAndroidNativeArm32Variant KonanTarget.ANDROID_ARM32, GradleKpmAndroidNativeArm32Variant::class.java, ::GradleKpmAndroidNativeArm32Variant
) )
} }
} }
open class KpmAndroidNativeArm64Variant @Inject constructor( open class GradleKpmAndroidNativeArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_ARM64, konanTarget = KonanTarget.ANDROID_ARM64,
@@ -91,20 +91,20 @@ open class KpmAndroidNativeArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_ARM64, KpmAndroidNativeArm64Variant::class.java, ::KpmAndroidNativeArm64Variant KonanTarget.ANDROID_ARM64, GradleKpmAndroidNativeArm64Variant::class.java, ::GradleKpmAndroidNativeArm64Variant
) )
} }
} }
open class KpmIosArm32Variant @Inject constructor( open class GradleKpmIosArm32Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_ARM32, konanTarget = KonanTarget.IOS_ARM32,
@@ -114,20 +114,20 @@ open class KpmIosArm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_ARM32, KpmIosArm32Variant::class.java, ::KpmIosArm32Variant KonanTarget.IOS_ARM32, GradleKpmIosArm32Variant::class.java, ::GradleKpmIosArm32Variant
) )
} }
} }
open class KpmIosArm64Variant @Inject constructor( open class GradleKpmIosArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_ARM64, konanTarget = KonanTarget.IOS_ARM64,
@@ -137,20 +137,20 @@ open class KpmIosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_ARM64, KpmIosArm64Variant::class.java, ::KpmIosArm64Variant KonanTarget.IOS_ARM64, GradleKpmIosArm64Variant::class.java, ::GradleKpmIosArm64Variant
) )
} }
} }
open class KpmIosX64Variant @Inject constructor( open class GradleKpmIosX64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_X64, konanTarget = KonanTarget.IOS_X64,
@@ -160,20 +160,20 @@ open class KpmIosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_X64, KpmIosX64Variant::class.java, ::KpmIosX64Variant KonanTarget.IOS_X64, GradleKpmIosX64Variant::class.java, ::GradleKpmIosX64Variant
) )
} }
} }
open class KpmIosSimulatorArm64Variant @Inject constructor( open class GradleKpmIosSimulatorArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_SIMULATOR_ARM64, konanTarget = KonanTarget.IOS_SIMULATOR_ARM64,
@@ -183,20 +183,20 @@ open class KpmIosSimulatorArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_SIMULATOR_ARM64, KpmIosSimulatorArm64Variant::class.java, ::KpmIosSimulatorArm64Variant KonanTarget.IOS_SIMULATOR_ARM64, GradleKpmIosSimulatorArm64Variant::class.java, ::GradleKpmIosSimulatorArm64Variant
) )
} }
} }
open class KpmWatchosArm32Variant @Inject constructor( open class GradleKpmWatchosArm32Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_ARM32, konanTarget = KonanTarget.WATCHOS_ARM32,
@@ -206,20 +206,20 @@ open class KpmWatchosArm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_ARM32, KpmWatchosArm32Variant::class.java, ::KpmWatchosArm32Variant KonanTarget.WATCHOS_ARM32, GradleKpmWatchosArm32Variant::class.java, ::GradleKpmWatchosArm32Variant
) )
} }
} }
open class KpmWatchosArm64Variant @Inject constructor( open class GradleKpmWatchosArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_ARM64, konanTarget = KonanTarget.WATCHOS_ARM64,
@@ -229,20 +229,20 @@ open class KpmWatchosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_ARM64, KpmWatchosArm64Variant::class.java, ::KpmWatchosArm64Variant KonanTarget.WATCHOS_ARM64, GradleKpmWatchosArm64Variant::class.java, ::GradleKpmWatchosArm64Variant
) )
} }
} }
open class KpmWatchosX86Variant @Inject constructor( open class GradleKpmWatchosX86Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_X86, konanTarget = KonanTarget.WATCHOS_X86,
@@ -252,20 +252,20 @@ open class KpmWatchosX86Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_X86, KpmWatchosX86Variant::class.java, ::KpmWatchosX86Variant KonanTarget.WATCHOS_X86, GradleKpmWatchosX86Variant::class.java, ::GradleKpmWatchosX86Variant
) )
} }
} }
open class KpmWatchosX64Variant @Inject constructor( open class GradleKpmWatchosX64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_X64, konanTarget = KonanTarget.WATCHOS_X64,
@@ -275,20 +275,20 @@ open class KpmWatchosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_X64, KpmWatchosX64Variant::class.java, ::KpmWatchosX64Variant KonanTarget.WATCHOS_X64, GradleKpmWatchosX64Variant::class.java, ::GradleKpmWatchosX64Variant
) )
} }
} }
open class KpmWatchosSimulatorArm64Variant @Inject constructor( open class GradleKpmWatchosSimulatorArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_SIMULATOR_ARM64, konanTarget = KonanTarget.WATCHOS_SIMULATOR_ARM64,
@@ -298,20 +298,20 @@ open class KpmWatchosSimulatorArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_SIMULATOR_ARM64, KpmWatchosSimulatorArm64Variant::class.java, ::KpmWatchosSimulatorArm64Variant KonanTarget.WATCHOS_SIMULATOR_ARM64, GradleKpmWatchosSimulatorArm64Variant::class.java, ::GradleKpmWatchosSimulatorArm64Variant
) )
} }
} }
open class KpmTvosArm64Variant @Inject constructor( open class GradleKpmTvosArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.TVOS_ARM64, konanTarget = KonanTarget.TVOS_ARM64,
@@ -321,20 +321,20 @@ open class KpmTvosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.TVOS_ARM64, KpmTvosArm64Variant::class.java, ::KpmTvosArm64Variant KonanTarget.TVOS_ARM64, GradleKpmTvosArm64Variant::class.java, ::GradleKpmTvosArm64Variant
) )
} }
} }
open class KpmTvosX64Variant @Inject constructor( open class GradleKpmTvosX64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.TVOS_X64, konanTarget = KonanTarget.TVOS_X64,
@@ -344,20 +344,20 @@ open class KpmTvosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.TVOS_X64, KpmTvosX64Variant::class.java, ::KpmTvosX64Variant KonanTarget.TVOS_X64, GradleKpmTvosX64Variant::class.java, ::GradleKpmTvosX64Variant
) )
} }
} }
open class KpmTvosSimulatorArm64Variant @Inject constructor( open class GradleKpmTvosSimulatorArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.TVOS_SIMULATOR_ARM64, konanTarget = KonanTarget.TVOS_SIMULATOR_ARM64,
@@ -367,20 +367,20 @@ open class KpmTvosSimulatorArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.TVOS_SIMULATOR_ARM64, KpmTvosSimulatorArm64Variant::class.java, ::KpmTvosSimulatorArm64Variant KonanTarget.TVOS_SIMULATOR_ARM64, GradleKpmTvosSimulatorArm64Variant::class.java, ::GradleKpmTvosSimulatorArm64Variant
) )
} }
} }
open class KpmLinuxX64Variant @Inject constructor( open class GradleKpmLinuxX64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_X64, konanTarget = KonanTarget.LINUX_X64,
@@ -390,20 +390,20 @@ open class KpmLinuxX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_X64, KpmLinuxX64Variant::class.java, ::KpmLinuxX64Variant KonanTarget.LINUX_X64, GradleKpmLinuxX64Variant::class.java, ::GradleKpmLinuxX64Variant
) )
} }
} }
open class KpmMingwX86Variant @Inject constructor( open class GradleKpmMingwX86Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.MINGW_X86, konanTarget = KonanTarget.MINGW_X86,
@@ -413,20 +413,20 @@ open class KpmMingwX86Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MINGW_X86, KpmMingwX86Variant::class.java, ::KpmMingwX86Variant KonanTarget.MINGW_X86, GradleKpmMingwX86Variant::class.java, ::GradleKpmMingwX86Variant
) )
} }
} }
open class KpmMingwX64Variant @Inject constructor( open class GradleKpmMingwX64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.MINGW_X64, konanTarget = KonanTarget.MINGW_X64,
@@ -436,20 +436,20 @@ open class KpmMingwX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MINGW_X64, KpmMingwX64Variant::class.java, ::KpmMingwX64Variant KonanTarget.MINGW_X64, GradleKpmMingwX64Variant::class.java, ::GradleKpmMingwX64Variant
) )
} }
} }
open class KpmMacosX64Variant @Inject constructor( open class GradleKpmMacosX64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.MACOS_X64, konanTarget = KonanTarget.MACOS_X64,
@@ -459,20 +459,20 @@ open class KpmMacosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MACOS_X64, KpmMacosX64Variant::class.java, ::KpmMacosX64Variant KonanTarget.MACOS_X64, GradleKpmMacosX64Variant::class.java, ::GradleKpmMacosX64Variant
) )
} }
} }
open class KpmMacosArm64Variant @Inject constructor( open class GradleKpmMacosArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.MACOS_ARM64, konanTarget = KonanTarget.MACOS_ARM64,
@@ -482,20 +482,20 @@ open class KpmMacosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MACOS_ARM64, KpmMacosArm64Variant::class.java, ::KpmMacosArm64Variant KonanTarget.MACOS_ARM64, GradleKpmMacosArm64Variant::class.java, ::GradleKpmMacosArm64Variant
) )
} }
} }
open class KpmLinuxArm64Variant @Inject constructor( open class GradleKpmLinuxArm64Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_ARM64, konanTarget = KonanTarget.LINUX_ARM64,
@@ -505,20 +505,20 @@ open class KpmLinuxArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_ARM64, KpmLinuxArm64Variant::class.java, ::KpmLinuxArm64Variant KonanTarget.LINUX_ARM64, GradleKpmLinuxArm64Variant::class.java, ::GradleKpmLinuxArm64Variant
) )
} }
} }
open class KpmLinuxArm32HfpVariant @Inject constructor( open class GradleKpmLinuxArm32HfpVariant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_ARM32_HFP, konanTarget = KonanTarget.LINUX_ARM32_HFP,
@@ -528,20 +528,20 @@ open class KpmLinuxArm32HfpVariant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_ARM32_HFP, KpmLinuxArm32HfpVariant::class.java, ::KpmLinuxArm32HfpVariant KonanTarget.LINUX_ARM32_HFP, GradleKpmLinuxArm32HfpVariant::class.java, ::GradleKpmLinuxArm32HfpVariant
) )
} }
} }
open class KpmLinuxMips32Variant @Inject constructor( open class GradleKpmLinuxMips32Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_MIPS32, konanTarget = KonanTarget.LINUX_MIPS32,
@@ -551,20 +551,20 @@ open class KpmLinuxMips32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_MIPS32, KpmLinuxMips32Variant::class.java, ::KpmLinuxMips32Variant KonanTarget.LINUX_MIPS32, GradleKpmLinuxMips32Variant::class.java, ::GradleKpmLinuxMips32Variant
) )
} }
} }
open class KpmLinuxMipsel32Variant @Inject constructor( open class GradleKpmLinuxMipsel32Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_MIPSEL32, konanTarget = KonanTarget.LINUX_MIPSEL32,
@@ -574,20 +574,20 @@ open class KpmLinuxMipsel32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_MIPSEL32, KpmLinuxMipsel32Variant::class.java, ::KpmLinuxMipsel32Variant KonanTarget.LINUX_MIPSEL32, GradleKpmLinuxMipsel32Variant::class.java, ::GradleKpmLinuxMipsel32Variant
) )
} }
} }
open class KpmWasm32Variant @Inject constructor( open class GradleKpmWasm32Variant @Inject constructor(
containingModule: KpmGradleModule, containingModule: GradleKpmModule,
fragmentName: String, fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations, dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration, compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration, apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration? hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal( ) : GradleKpmNativeVariantInternal(
containingModule = containingModule, containingModule = containingModule,
fragmentName = fragmentName, fragmentName = fragmentName,
konanTarget = KonanTarget.WASM32, konanTarget = KonanTarget.WASM32,
@@ -597,67 +597,67 @@ open class KpmWasm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) { ) {
companion object { companion object {
val constructor = KotlinNativeVariantConstructor( val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WASM32, KpmWasm32Variant::class.java, ::KpmWasm32Variant KonanTarget.WASM32, GradleKpmWasm32Variant::class.java, ::GradleKpmWasm32Variant
) )
} }
} }
internal val allKpmNativeVariantConstructors = listOf( internal val allKpmNativeVariantConstructors = listOf(
KpmAndroidNativeX64Variant.constructor, GradleKpmAndroidNativeX64Variant.constructor,
KpmAndroidNativeX86Variant.constructor, GradleKpmAndroidNativeX86Variant.constructor,
KpmAndroidNativeArm32Variant.constructor, GradleKpmAndroidNativeArm32Variant.constructor,
KpmAndroidNativeArm64Variant.constructor, GradleKpmAndroidNativeArm64Variant.constructor,
KpmIosArm32Variant.constructor, GradleKpmIosArm32Variant.constructor,
KpmIosArm64Variant.constructor, GradleKpmIosArm64Variant.constructor,
KpmIosX64Variant.constructor, GradleKpmIosX64Variant.constructor,
KpmIosSimulatorArm64Variant.constructor, GradleKpmIosSimulatorArm64Variant.constructor,
KpmWatchosArm32Variant.constructor, GradleKpmWatchosArm32Variant.constructor,
KpmWatchosArm64Variant.constructor, GradleKpmWatchosArm64Variant.constructor,
KpmWatchosX86Variant.constructor, GradleKpmWatchosX86Variant.constructor,
KpmWatchosX64Variant.constructor, GradleKpmWatchosX64Variant.constructor,
KpmWatchosSimulatorArm64Variant.constructor, GradleKpmWatchosSimulatorArm64Variant.constructor,
KpmTvosArm64Variant.constructor, GradleKpmTvosArm64Variant.constructor,
KpmTvosX64Variant.constructor, GradleKpmTvosX64Variant.constructor,
KpmTvosSimulatorArm64Variant.constructor, GradleKpmTvosSimulatorArm64Variant.constructor,
KpmLinuxX64Variant.constructor, GradleKpmLinuxX64Variant.constructor,
KpmMingwX86Variant.constructor, GradleKpmMingwX86Variant.constructor,
KpmMingwX64Variant.constructor, GradleKpmMingwX64Variant.constructor,
KpmMacosX64Variant.constructor, GradleKpmMacosX64Variant.constructor,
KpmMacosArm64Variant.constructor, GradleKpmMacosArm64Variant.constructor,
KpmLinuxArm64Variant.constructor, GradleKpmLinuxArm64Variant.constructor,
KpmLinuxArm32HfpVariant.constructor, GradleKpmLinuxArm32HfpVariant.constructor,
KpmLinuxMips32Variant.constructor, GradleKpmLinuxMips32Variant.constructor,
KpmLinuxMipsel32Variant.constructor, GradleKpmLinuxMipsel32Variant.constructor,
KpmWasm32Variant.constructor GradleKpmWasm32Variant.constructor
) )
internal fun kpmNativeVariantClass(konanTarget: KonanTarget): Class<out KpmNativeVariantInternal>? = when (konanTarget) { internal fun kpmNativeVariantClass(konanTarget: KonanTarget): Class<out GradleKpmNativeVariantInternal>? = when (konanTarget) {
KonanTarget.ANDROID_X64 -> KpmAndroidNativeX64Variant::class.java KonanTarget.ANDROID_X64 -> GradleKpmAndroidNativeX64Variant::class.java
KonanTarget.ANDROID_X86 -> KpmAndroidNativeX86Variant::class.java KonanTarget.ANDROID_X86 -> GradleKpmAndroidNativeX86Variant::class.java
KonanTarget.ANDROID_ARM32 -> KpmAndroidNativeArm32Variant::class.java KonanTarget.ANDROID_ARM32 -> GradleKpmAndroidNativeArm32Variant::class.java
KonanTarget.ANDROID_ARM64 -> KpmAndroidNativeArm64Variant::class.java KonanTarget.ANDROID_ARM64 -> GradleKpmAndroidNativeArm64Variant::class.java
KonanTarget.IOS_ARM32 -> KpmIosArm32Variant::class.java KonanTarget.IOS_ARM32 -> GradleKpmIosArm32Variant::class.java
KonanTarget.IOS_ARM64 -> KpmIosArm64Variant::class.java KonanTarget.IOS_ARM64 -> GradleKpmIosArm64Variant::class.java
KonanTarget.IOS_X64 -> KpmIosX64Variant::class.java KonanTarget.IOS_X64 -> GradleKpmIosX64Variant::class.java
KonanTarget.IOS_SIMULATOR_ARM64 -> KpmIosSimulatorArm64Variant::class.java KonanTarget.IOS_SIMULATOR_ARM64 -> GradleKpmIosSimulatorArm64Variant::class.java
KonanTarget.WATCHOS_ARM32 -> KpmWatchosArm32Variant::class.java KonanTarget.WATCHOS_ARM32 -> GradleKpmWatchosArm32Variant::class.java
KonanTarget.WATCHOS_ARM64 -> KpmWatchosArm64Variant::class.java KonanTarget.WATCHOS_ARM64 -> GradleKpmWatchosArm64Variant::class.java
KonanTarget.WATCHOS_X86 -> KpmWatchosX86Variant::class.java KonanTarget.WATCHOS_X86 -> GradleKpmWatchosX86Variant::class.java
KonanTarget.WATCHOS_X64 -> KpmWatchosX64Variant::class.java KonanTarget.WATCHOS_X64 -> GradleKpmWatchosX64Variant::class.java
KonanTarget.WATCHOS_SIMULATOR_ARM64 -> KpmWatchosSimulatorArm64Variant::class.java KonanTarget.WATCHOS_SIMULATOR_ARM64 -> GradleKpmWatchosSimulatorArm64Variant::class.java
KonanTarget.TVOS_ARM64 -> KpmTvosArm64Variant::class.java KonanTarget.TVOS_ARM64 -> GradleKpmTvosArm64Variant::class.java
KonanTarget.TVOS_X64 -> KpmTvosX64Variant::class.java KonanTarget.TVOS_X64 -> GradleKpmTvosX64Variant::class.java
KonanTarget.TVOS_SIMULATOR_ARM64 -> KpmTvosSimulatorArm64Variant::class.java KonanTarget.TVOS_SIMULATOR_ARM64 -> GradleKpmTvosSimulatorArm64Variant::class.java
KonanTarget.LINUX_X64 -> KpmLinuxX64Variant::class.java KonanTarget.LINUX_X64 -> GradleKpmLinuxX64Variant::class.java
KonanTarget.MINGW_X86 -> KpmMingwX86Variant::class.java KonanTarget.MINGW_X86 -> GradleKpmMingwX86Variant::class.java
KonanTarget.MINGW_X64 -> KpmMingwX64Variant::class.java KonanTarget.MINGW_X64 -> GradleKpmMingwX64Variant::class.java
KonanTarget.MACOS_X64 -> KpmMacosX64Variant::class.java KonanTarget.MACOS_X64 -> GradleKpmMacosX64Variant::class.java
KonanTarget.MACOS_ARM64 -> KpmMacosArm64Variant::class.java KonanTarget.MACOS_ARM64 -> GradleKpmMacosArm64Variant::class.java
KonanTarget.LINUX_ARM64 -> KpmLinuxArm64Variant::class.java KonanTarget.LINUX_ARM64 -> GradleKpmLinuxArm64Variant::class.java
KonanTarget.LINUX_ARM32_HFP -> KpmLinuxArm32HfpVariant::class.java KonanTarget.LINUX_ARM32_HFP -> GradleKpmLinuxArm32HfpVariant::class.java
KonanTarget.LINUX_MIPS32 -> KpmLinuxMips32Variant::class.java KonanTarget.LINUX_MIPS32 -> GradleKpmLinuxMips32Variant::class.java
KonanTarget.LINUX_MIPSEL32 -> KpmLinuxMipsel32Variant::class.java KonanTarget.LINUX_MIPSEL32 -> GradleKpmLinuxMipsel32Variant::class.java
KonanTarget.WASM32 -> KpmWasm32Variant::class.java KonanTarget.WASM32 -> GradleKpmWasm32Variant::class.java
else -> null else -> null
} }
@@ -13,16 +13,16 @@ import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
internal interface KpmGradleProjectModelContainer { internal interface GradleKpmProjectModelContainer {
val modules: NamedDomainObjectContainer<KpmGradleModule> val modules: NamedDomainObjectContainer<GradleKpmModule>
val metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry> val metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry>
val rootPublication: MavenPublication? val rootPublication: MavenPublication?
} }
internal val Project.kpmModelContainer: KpmGradleProjectModelContainer internal val Project.kpmModelContainer: GradleKpmProjectModelContainer
get() = kpmModelContainerOrNull ?: error("Couldn't find KPM container for $project") get() = kpmModelContainerOrNull ?: error("Couldn't find KPM container for $project")
internal val Project.kpmModelContainerOrNull: KpmGradleProjectModelContainer? internal val Project.kpmModelContainerOrNull: GradleKpmProjectModelContainer?
get() = when (val ext = project.topLevelExtensionOrNull) { get() = when (val ext = project.topLevelExtensionOrNull) {
is KotlinPm20ProjectExtension -> ext.kpmModelContainer is KotlinPm20ProjectExtension -> ext.kpmModelContainer
is KotlinProjectExtension -> if (PropertiesProvider(project).experimentalKpmModelMapping) ext.kpmModelContainer else null is KotlinProjectExtension -> if (PropertiesProvider(project).experimentalKpmModelMapping) ext.kpmModelContainer else null
@@ -32,27 +32,27 @@ internal val Project.kpmModelContainerOrNull: KpmGradleProjectModelContainer?
internal val Project.hasKpmModel: Boolean internal val Project.hasKpmModel: Boolean
get() = kpmModelContainerOrNull != null get() = kpmModelContainerOrNull != null
internal val Project.kpmModules: NamedDomainObjectContainer<KpmGradleModule> internal val Project.kpmModules: NamedDomainObjectContainer<GradleKpmModule>
get() = kpmModelContainer.modules get() = kpmModelContainer.modules
internal val Project.metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry> internal val Project.metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry>
get() = kpmModelContainer.metadataCompilationRegistryByModuleId get() = kpmModelContainer.metadataCompilationRegistryByModuleId
internal class DefaultKpmGradleProjectModelContainer( internal class GradleKpmDefaultProjectModelContainer(
override val modules: NamedDomainObjectContainer<KpmGradleModule>, override val modules: NamedDomainObjectContainer<GradleKpmModule>,
override val metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry>, override val metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry>,
) : KpmGradleProjectModelContainer { ) : GradleKpmProjectModelContainer {
override var rootPublication: MavenPublication? = null override var rootPublication: MavenPublication? = null
companion object { companion object {
fun create(project: Project): DefaultKpmGradleProjectModelContainer { fun create(project: Project): GradleKpmDefaultProjectModelContainer {
return DefaultKpmGradleProjectModelContainer(createKpmModulesContainer(project), mutableMapOf()) return GradleKpmDefaultProjectModelContainer(createKpmModulesContainer(project), mutableMapOf())
} }
private fun createKpmModulesContainer(project: Project): NamedDomainObjectContainer<KpmGradleModule> = private fun createKpmModulesContainer(project: Project): NamedDomainObjectContainer<GradleKpmModule> =
project.objects.domainObjectContainer( project.objects.domainObjectContainer(
KpmGradleModule::class.java, GradleKpmModule::class.java,
KotlinGradleModuleFactory(project) GradleKpmModuleFactory(project)
) )
} }
} }
@@ -29,15 +29,15 @@ import org.jetbrains.kotlin.project.model.KpmModuleDependency
import org.jetbrains.kotlin.tooling.core.MutableExtras import org.jetbrains.kotlin.tooling.core.MutableExtras
import org.jetbrains.kotlin.tooling.core.mutableExtrasOf import org.jetbrains.kotlin.tooling.core.mutableExtrasOf
internal open class LegacyMappedVariant( internal open class GradleKpmLegacyMappedVariant(
internal val compilation: KotlinCompilation<*>, internal val compilation: KotlinCompilation<*>,
) : KpmGradleVariant { ) : GradleKpmVariant {
override fun toString(): String = "variant mapped to $compilation" override fun toString(): String = "variant mapped to $compilation"
private val fragmentForDefaultSourceSet = private val fragmentForDefaultSourceSet =
(compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment (compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment
override val containingModule: KpmGradleModule get() = fragmentForDefaultSourceSet.containingModule override val containingModule: GradleKpmModule get() = fragmentForDefaultSourceSet.containingModule
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = compilation.platformType get() = compilation.platformType
@@ -89,11 +89,11 @@ internal open class LegacyMappedVariant(
override val extras: MutableExtras = mutableExtrasOf() override val extras: MutableExtras = mutableExtrasOf()
override fun refines(other: KpmGradleFragment) { override fun refines(other: GradleKpmFragment) {
fragmentForDefaultSourceSet.refines(other) fragmentForDefaultSourceSet.refines(other)
} }
override fun refines(other: NamedDomainObjectProvider<KpmGradleFragment>) { override fun refines(other: NamedDomainObjectProvider<GradleKpmFragment>) {
fragmentForDefaultSourceSet.refines(other) fragmentForDefaultSourceSet.refines(other)
} }
@@ -105,7 +105,7 @@ internal open class LegacyMappedVariant(
override val fragmentName: String override val fragmentName: String
get() = fragmentForDefaultSourceSet.fragmentName + "Variant" get() = fragmentForDefaultSourceSet.fragmentName + "Variant"
override val declaredRefinesDependencies: Iterable<KpmGradleFragment> override val declaredRefinesDependencies: Iterable<GradleKpmFragment>
get() = fragmentForDefaultSourceSet.declaredRefinesDependencies get() = fragmentForDefaultSourceSet.declaredRefinesDependencies
override val declaredModuleDependencies: Iterable<KpmModuleDependency> override val declaredModuleDependencies: Iterable<KpmModuleDependency>
@@ -148,9 +148,9 @@ internal open class LegacyMappedVariant(
} }
} }
internal class LegacyMappedVariantWithRuntime(private val compilationWithRuntime: KotlinCompilationToRunnableFiles<*>) : internal class GradleKpmLegacyMappedVariantWithRuntime(private val compilationWithRuntime: KotlinCompilationToRunnableFiles<*>) :
LegacyMappedVariant(compilationWithRuntime), GradleKpmLegacyMappedVariant(compilationWithRuntime),
KpmGradleVariantWithRuntime { GradleKpmVariantWithRuntime {
override val runtimeDependenciesConfiguration: Configuration override val runtimeDependenciesConfiguration: Configuration
get() = project.configurations.getByName(compilationWithRuntime.runtimeDependencyConfigurationName) get() = project.configurations.getByName(compilationWithRuntime.runtimeDependencyConfigurationName)
@@ -177,8 +177,8 @@ internal enum class PublicationRegistrationMode {
internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, publicationRegistration: PublicationRegistrationMode) { internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, publicationRegistration: PublicationRegistrationMode) {
target.compilations.all { compilation -> target.compilations.all { compilation ->
val variant = if (compilation is KotlinCompilationToRunnableFiles) val variant = if (compilation is KotlinCompilationToRunnableFiles)
LegacyMappedVariantWithRuntime(compilation) GradleKpmLegacyMappedVariantWithRuntime(compilation)
else LegacyMappedVariant(compilation) else GradleKpmLegacyMappedVariant(compilation)
val defaultSourceSetFragment = (compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment val defaultSourceSetFragment = (compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment
variant.refines(defaultSourceSetFragment) variant.refines(defaultSourceSetFragment)
@@ -194,9 +194,9 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
} }
whenPublicationShouldRegister { whenPublicationShouldRegister {
val mainModule = target.project.kpmModules.getByName(KpmGradleModule.MAIN_MODULE_NAME) val mainModule = target.project.kpmModules.getByName(GradleKpmModule.MAIN_MODULE_NAME)
target.kotlinComponents.forEach { kotlinComponent -> target.kotlinComponents.forEach { kotlinComponent ->
val moduleHolder = DefaultSingleMavenPublishedModuleHolder( val moduleHolder = GradleKpmDefaultSingleMavenPublishedModuleHolder(
mainModule, mainModule,
kotlinComponent.defaultArtifactId.removePrefix(target.project.name.toLowerCase() + "-") kotlinComponent.defaultArtifactId.removePrefix(target.project.name.toLowerCase() + "-")
) )
@@ -220,16 +220,16 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
// FIXME: include additional variants into project structure metadata? // FIXME: include additional variants into project structure metadata?
val request = BasicPlatformPublicationToMavenRequest( val request = GradleKpmBasicPlatformPublicationToMavenRequest(
kotlinComponent.name, kotlinComponent.name,
mainModule, mainModule,
moduleHolder, moduleHolder,
usages.map { usage -> usages.map { usage ->
val variant = mainModule.variants.withType<LegacyMappedVariant>().single { val variant = mainModule.variants.withType<GradleKpmLegacyMappedVariant>().single {
it.compilation == usage.compilation it.compilation == usage.compilation
} }
(usage as? DefaultKotlinUsageContext) ?: error("unexpected KotlinUsageContext type: ${usage.javaClass}") (usage as? DefaultKotlinUsageContext) ?: error("unexpected KotlinUsageContext type: ${usage.javaClass}")
AdvancedVariantPublicationRequest( KpmGradleAdvancedConfigurationPublicationRequest(
variant, variant,
target.project.configurations.getByName(usage.dependencyConfigurationName), target.project.configurations.getByName(usage.dependencyConfigurationName),
usage.overrideConfigurationAttributes, usage.overrideConfigurationAttributes,
@@ -239,7 +239,7 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
} }
) )
VariantPublishingConfigurator.get(target.project).configurePublishing(request) GradleKpmVariantPublishingConfigurator.get(target.project).configurePublishing(request)
} }
} }
} }

Some files were not shown because too many files have changed in this diff Show More