[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> {
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>
}
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
interface KotlinDependencyConfigurations {
interface GradleKpmDependencyConfigurations {
val apiConfiguration: Configuration
val implementationConfiguration: Configuration
val compileOnlyConfiguration: Configuration
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration
interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfigurations {
interface GradleKpmFragmentDependencyConfigurations : GradleKpmDependencyConfigurations {
/** This configuration includes the dependencies from the refines-parents */
val transitiveApiConfiguration: Configuration
@@ -25,7 +25,7 @@ interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfiguration
override val transitiveApiConfiguration: Configuration,
override val transitiveImplementationConfiguration: Configuration,
override val transitiveRuntimeOnlyConfiguration: Configuration
) : KotlinFragmentDependencyConfigurations
) : GradleKpmFragmentDependencyConfigurations
companion object {
fun create(
@@ -36,7 +36,7 @@ interface KotlinFragmentDependencyConfigurations : KotlinDependencyConfiguration
transitiveApiConfiguration: Configuration,
transitiveImplementationConfiguration: Configuration,
transitiveRuntimeOnlyConfiguration: Configuration
): KotlinFragmentDependencyConfigurations = Impl(
): GradleKpmFragmentDependencyConfigurations = Impl(
apiConfiguration = apiConfiguration,
implementationConfiguration = implementationConfiguration,
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.withClosure
interface KpmGradleFragment : KpmFragment, HasKotlinDependencies, KotlinFragmentDependencyConfigurations, Named {
interface GradleKpmFragment : KpmFragment, HasKotlinDependencies, GradleKpmFragmentDependencyConfigurations, Named {
override val kotlinSourceRoots: SourceDirectorySet
override val containingModule: KpmGradleModule
override val containingModule: GradleKpmModule
override fun getName(): String = fragmentName
@@ -32,16 +32,16 @@ interface KpmGradleFragment : KpmFragment, HasKotlinDependencies, KotlinFragment
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 }
override val withRefinesClosure: Set<KpmGradleFragment>
override val withRefinesClosure: Set<GradleKpmFragment>
get() = this.withClosure { it.declaredRefinesDependencies }
override fun dependencies(configureClosure: Closure<Any?>) =
@@ -69,8 +69,8 @@ interface KpmGradleFragment : KpmFragment, HasKotlinDependencies, KotlinFragment
listOf(transitiveApiConfiguration.name, transitiveImplementationConfiguration.name)
}
val KpmGradleFragment.path: String
val GradleKpmFragment.path: String
get() = "${project.path}/${containingModule.name}/$fragmentName"
val KpmGradleFragment.containingVariants: Set<KpmGradleVariant>
get() = containingModule.variantsContainingFragment(this).map { it as KpmGradleVariant }.toSet()
val GradleKpmFragment.containingVariants: Set<GradleKpmVariant>
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.KpmCompilerPlugin
interface KpmGradleModule : KpmModule, Named, HasKotlinDependencies {
interface GradleKpmModule : KpmModule, Named, HasKotlinDependencies {
val project: Project
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?
override val variants: NamedDomainObjectSet<KpmGradleVariant>
override val variants: NamedDomainObjectSet<GradleKpmVariant>
override val plugins: Set<KpmCompilerPlugin>
@@ -47,10 +47,10 @@ interface KpmGradleModule : KpmModule, Named, HasKotlinDependencies {
// DSL
val common: KpmGradleFragment
get() = fragments.getByName(KpmGradleFragment.COMMON_FRAGMENT_NAME)
val common: GradleKpmFragment
get() = fragments.getByName(GradleKpmFragment.COMMON_FRAGMENT_NAME)
fun common(configure: KpmGradleFragment.() -> Unit) =
fun common(configure: GradleKpmFragment.() -> Unit) =
common.configure()
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.file.ConfigurableFileCollection
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.KotlinPlatformType
import org.jetbrains.kotlin.project.model.KpmVariant
interface KpmGradleVariant : KpmGradleFragment, KpmVariant {
interface GradleKpmVariant : GradleKpmFragment, KpmVariant {
val platformType: KotlinPlatformType
// TODO generalize with KotlinCompilation?
@@ -33,7 +32,7 @@ interface KpmGradleVariant : KpmGradleFragment, KpmVariant {
val gradleVariantNames: Set<String>
}
interface KpmGradleVariantWithRuntime : KpmGradleVariant {
interface GradleKpmVariantWithRuntime : GradleKpmVariant {
// TODO deduplicate with KotlinCompilation?
val runtimeDependenciesConfiguration: Configuration
@@ -45,7 +44,7 @@ interface KpmGradleVariantWithRuntime : KpmGradleVariant {
val runtimeElementsConfiguration: Configuration
}
interface KpmNativeVariant : KpmGradleVariant {
interface GradleKpmNativeVariant : GradleKpmVariant {
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.native
@@ -54,13 +53,6 @@ interface KpmNativeVariant : KpmGradleVariant {
var enableEndorsedLibraries: Boolean
}
interface SingleMavenPublishedModuleHolder {
fun assignMavenPublication(publication: MavenPublication)
fun whenPublicationAssigned(handlePublication: (MavenPublication) -> Unit)
val defaultPublishedModuleSuffix: String?
val publishedMavenModuleCoordinates: PublishedModuleCoordinatesProvider
}
interface PublishedModuleCoordinatesProvider {
val group: String
val name: String
@@ -45,7 +45,7 @@ val generateKpmNativeVariants by generator(
listOf(generateMppTargetContainerWithPresets, generateAbstractBinaryContainer, generateKpmNativeVariants).forEach {
it.systemProperty(
"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)}
""".trimIndent()
private val fileName = "KpmNativeVariants.kt"
private val fileName = "nativeVariants.kt"
private val packageName = "org.jetbrains.kotlin.gradle.plugin.mpp.pm20"
@@ -53,13 +53,13 @@ private fun variantClasses() = allKonanTargets()
private fun variantClass(konanTarget: KonanTarget) = """
open class ${konanTarget.variantClassName} @Inject constructor(
containingModule: KotlinGradleModule,
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KotlinNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.${konanTarget.className},
@@ -69,7 +69,7 @@ private fun variantClass(konanTarget: KonanTarget) = """
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
val constructor = GradleKpmNativeVariantConstructor(
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" }
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)}
else -> null
}
@@ -98,6 +98,6 @@ private fun allVariantConstructors() = allKonanTargets()
private val KonanTarget.variantClassName
get() = presetName
.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.serialize
import org.jetbrains.kotlin.gradle.plugin.KotlinPm20PluginWrapper
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmIosX64Variant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmLinuxX64Variant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmIosX64Variant
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.jvm
import org.jetbrains.kotlin.tooling.core.extrasKeyOf
@@ -49,8 +49,8 @@ class BackwardsCompatibilityDeserializationTest {
kotlinExtension.mainAndTest {
jvm
val native = fragments.create("native")
val linux = fragments.create<KpmLinuxX64Variant>("linuxX64")
val ios = fragments.create<KpmIosX64Variant>("iosX64")
val linux = fragments.create<GradleKpmLinuxX64Variant>("linuxX64")
val ios = fragments.create<GradleKpmIosX64Variant>("iosX64")
native.refines(common)
linux.refines(native)
ios.refines(native)
@@ -6,7 +6,7 @@
package org.jetbrains.kotlin.gradle
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.Companion.taskNameForKotlinModule
import org.jetbrains.kotlin.konan.target.KonanTarget
@@ -29,7 +29,7 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
private val buildKotlinToolingMetadataTaskName get() =
if (isKpmModelMappingEnabled) {
taskNameForKotlinModule(KpmGradleModule.MAIN_MODULE_NAME)
taskNameForKotlinModule(GradleKpmModule.MAIN_MODULE_NAME)
} else {
BuildKotlinToolingMetadataTask.defaultTaskName
}
@@ -122,7 +122,7 @@ class KotlinToolingMetadataMppIT : BaseGradleIT() {
with(transformProjectWithPluginsDsl("kpm-multi-module-published")) {
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 }
assertEquals(KonanTarget.LINUX_X64.name, nativeTarget.extras.native?.konanTarget)
},
@@ -17,12 +17,12 @@ kotlin {
// feel free to add more modules, variants and fragments
mainAndTest {
jvm
val linuxX64 by fragments.creating(KpmLinuxX64Variant::class)
val linuxX64 by fragments.creating(GradleKpmLinuxX64Variant::class)
}
val secondaryModule by modules.creating {
jvm
val linuxArm64 by fragments.creating(KpmLinuxArm64Variant::class)
val linuxArm64 by fragments.creating(GradleKpmLinuxArm64Variant::class)
makePublic()
}
@@ -34,7 +34,7 @@ kotlin {
val integrationTest by modules.creating {
jvm
val linuxX64 by fragments.creating(KpmLinuxX64Variant::class)
val linuxX64 by fragments.creating(GradleKpmLinuxX64Variant::class)
}
}
@@ -11,7 +11,7 @@ repositories {
mavenCentral()
}
plugins.apply(GradleKpmPluginWithTransientPluginOptions::class.java)
plugins.apply(KpmGradlePluginWithTransientPluginOptions::class.java)
configure<KotlinPm20ProjectExtension> {
main {
@@ -38,7 +38,7 @@ class KpmPluginWithTransientPluginOptions(
override fun forPlatformCompilation(variant: KpmVariant) = pluginData()
}
class GradleKpmPluginWithTransientPluginOptions : GradleKpmCompilerPlugin {
class KpmGradlePluginWithTransientPluginOptions : GradleKpmCompilerPlugin {
private lateinit var project: Project
override fun apply(target: Project) {
@@ -6,13 +6,13 @@
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 java.io.File
import java.io.Serializable
internal val androidDslKey = extrasKeyOf<AndroidDsl>()
val KpmGradleFragment.androidDsl: AndroidDsl? get() = this.extras[androidDslKey]
val GradleKpmFragment.androidDsl: AndroidDsl? get() = this.extras[androidDslKey]
class AndroidDsl : Serializable {
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.mpp.pm20.*
fun KpmGradleModule.createKotlinAndroidVariant(androidVariant: BaseVariant) {
val androidOutgoingArtifacts = FragmentArtifacts<KpmJvmVariant> {
fun GradleKpmModule.createKotlinAndroidVariant(androidVariant: BaseVariant) {
val androidOutgoingArtifacts = GradleKpmConfigurationArtifactsSetup<GradleKpmJvmVariant> {
variants.create("classes") { variant ->
variant.attributes.attribute(AndroidArtifacts.ARTIFACT_TYPE, AndroidArtifacts.ArtifactType.CLASSES_JAR.type)
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(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, project.objects.named(TargetJvmEnvironment.ANDROID))
}
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 */
compileDependencies = (DefaultKotlinCompileDependenciesDefinition +
FragmentAttributes<KpmGradleFragment> {
GradleKpmConfigurationAttributesSetup<GradleKpmFragment> {
namedAttribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.ANDROID)
attribute(KotlinPlatformType.attribute, KotlinPlatformType.androidJvm)
})
@@ -63,8 +63,8 @@ fun KpmGradleModule.createKotlinAndroidVariant(androidVariant: BaseVariant) {
runtimeElements = DefaultKotlinRuntimeElementsDefinition + androidElementsAttributes + androidOutgoingArtifacts,
/* For now: Just publish 'release' (non-debuggable) variants */
publicationConfigurator = if (androidVariant.buildType.isDebuggable) KotlinPublicationConfigurator.NoPublication else
KotlinPublicationConfigurator.SingleVariantPublication
publicationConfigurator = if (androidVariant.buildType.isDebuggable) GradleKpmPublicationConfigurator.NoPublication else
GradleKpmPublicationConfigurator.SingleVariantPublication
)
)
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.gradle.android
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragmentInternal
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentInternal
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 ->
fragment.refines(common)
}) as KpmGradleFragmentInternal
}) as GradleKpmFragmentInternal
@@ -5,12 +5,12 @@
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
val KotlinPm20ProjectExtension.instrumentedTest
get() = modules.maybeCreate("instrumentedTest")
fun KotlinPm20ProjectExtension.instrumentedTest(configure: KpmGradleModule.() -> Unit) {
fun KotlinPm20ProjectExtension.instrumentedTest(configure: GradleKpmModule.() -> Unit) {
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.KotlinJsSingleTargetPreset
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.statistics.KotlinBuildStatsService
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 {
if (project.kotlinPropertiesProvider.experimentalKpmModelMapping) {
DefaultKpmGradleProjectModelContainer.create(project)
GradleKpmDefaultProjectModelContainer.create(project)
} 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.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
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.kpmModules
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
@@ -134,8 +134,8 @@ internal fun configureStdlibDefaultDependency(project: Project) = with(project)
private fun addStdlibToKpmProject(
project: Project
) {
project.kpmModules.matching { it.name == KpmGradleModule.MAIN_MODULE_NAME }.configureEach { main ->
main.fragments.matching { it.name == KpmGradleFragment.COMMON_FRAGMENT_NAME }.configureEach { common ->
project.kpmModules.matching { it.name == GradleKpmModule.MAIN_MODULE_NAME }.configureEach { main ->
main.fragments.matching { it.name == GradleKpmFragment.COMMON_FRAGMENT_NAME }.configureEach { common ->
common.dependencies {
api(project.kotlinDependency("kotlin-stdlib-common", project.topLevelExtension.coreLibrariesVersion))
}
@@ -22,15 +22,15 @@ val KotlinPm20ProjectExtension.ideaKotlinProjectModelBuilder: IdeaKotlinProjectM
get() = this.ideaKotlinProjectModelBuilder
@ExternalVariantApi
fun KpmGradleModule.createExternalJvmVariant(
fun GradleKpmModule.createExternalJvmVariant(
name: String,
config: KotlinJvmVariantConfig
): KpmJvmVariant {
val variant = KotlinJvmVariantFactory(this, config).create(name)
config: GradleKpmJvmVariantConfig
): GradleKpmJvmVariant {
val variant = GradleKpmJvmVariantFactory(this, config).create(name)
fragments.add(variant)
return variant
}
@ExternalVariantApi
val KpmGradleVariantInternal.compilationData
val GradleKpmVariantInternal.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.IdeaKotlinProjectModelBuilder.*
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
@ExternalVariantApi
@@ -35,7 +35,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
private val additionalDependencies = mutableListOf<IdeaKotlinDependencyResolver>()
@ExternalVariantPlatformDependencyResolutionDsl
var platformResolutionAttributes: FragmentAttributes<KpmGradleFragment>? = null
var platformResolutionAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment>? = null
@ExternalVariantPlatformDependencyResolutionDsl
class ArtifactViewDslHandle(
@@ -43,11 +43,11 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
var binaryType: String
) {
@ExternalVariantPlatformDependencyResolutionDsl
var attributes: FragmentAttributes<KpmGradleFragment> = FragmentAttributes { }
var attributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment> = GradleKpmConfigurationAttributesSetup.None
@ExternalVariantPlatformDependencyResolutionDsl
fun attributes(setAttributes: KotlinGradleFragmentConfigurationAttributesContext<KpmGradleFragment>.() -> Unit) {
attributes += FragmentAttributes(setAttributes)
fun attributes(setAttributes: GradleKpmConfigurationAttributesSetupContext<GradleKpmFragment>.() -> Unit) {
attributes += GradleKpmConfigurationAttributesSetup(setAttributes)
}
}
@@ -64,9 +64,9 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
@ExternalVariantPlatformDependencyResolutionDsl
fun withPlatformResolutionAttributes(
setAttributes: KotlinGradleFragmentConfigurationAttributesContext<KpmGradleFragment>.() -> Unit
setAttributes: GradleKpmConfigurationAttributesSetupContext<GradleKpmFragment>.() -> Unit
) {
val additionalAttributes = FragmentAttributes(setAttributes)
val additionalAttributes = GradleKpmConfigurationAttributesSetup(setAttributes)
this.platformResolutionAttributes = platformResolutionAttributes?.plus(additionalAttributes) ?: additionalAttributes
}
@@ -76,7 +76,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
}
@ExternalVariantPlatformDependencyResolutionDsl
fun additionalDependencies(dependencyProvider: (KpmGradleFragment) -> List<IdeaKotlinDependency>) {
fun additionalDependencies(dependencyProvider: (GradleKpmFragment) -> List<IdeaKotlinDependency>) {
this.additionalDependencies += IdeaKotlinDependencyResolver { fragment -> dependencyProvider(fragment).toSet() }
}
@@ -130,7 +130,7 @@ class IdeaKotlinPlatformDependencyResolutionDslHandle internal constructor(
return parentConstraint and this.constraint
}
private fun buildPlatformResolutionAttributes(): FragmentAttributes<KpmGradleFragment>? {
private fun buildPlatformResolutionAttributes(): GradleKpmConfigurationAttributesSetup<GradleKpmFragment>? {
val parentAttributes = parent?.buildPlatformResolutionAttributes() ?: return this.platformResolutionAttributes
return parentAttributes + (this.platformResolutionAttributes ?: return parentAttributes)
}
@@ -5,7 +5,7 @@
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.
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
* that the dependency resolution result is final.
*/
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 ->
@@ -5,12 +5,12 @@
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
internal object IdeaKotlinDependencyLogger : IdeaKotlinDependencyEffect {
override fun invoke(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency>
fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
) {
val fragmentPathRegex = fragment.project.properties["idea.kotlin.log.dependencies"]?.toString() ?: return
if (!fragment.path.matches(Regex(fragmentPathRegex))) return
@@ -5,13 +5,13 @@
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 resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency>
fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency>
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(
val children: List<IdeaKotlinDependencyResolver>
) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return children.flatMap { child -> child.resolve(fragment) }.toSet()
}
}
@@ -5,7 +5,7 @@
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.
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
*/
fun interface IdeaKotlinDependencyTransformer {
fun transform(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency>
fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency>
}
@@ -54,7 +54,7 @@ private class CompositeIdeaKotlinDependencyTransformer(
val transformers: List<IdeaKotlinDependencyTransformer>
) : IdeaKotlinDependencyTransformer {
override fun transform(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency>
fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency> {
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.tooling.core.emptyExtras
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinFragment(fragment: KpmGradleFragment): IdeaKotlinFragment {
return if (fragment is KpmGradleVariant) buildIdeaKotlinVariant(fragment)
internal fun IdeaKotlinProjectModelBuildingContext.IdeaKotlinFragment(fragment: GradleKpmFragment): IdeaKotlinFragment {
return if (fragment is GradleKpmVariant) buildIdeaKotlinVariant(fragment)
else buildIdeaKotlinFragment(fragment)
}
private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragment: KpmGradleFragment): IdeaKotlinFragment {
private fun IdeaKotlinProjectModelBuildingContext.buildIdeaKotlinFragment(fragment: GradleKpmFragment): IdeaKotlinFragment {
return IdeaKotlinFragmentImpl(
coordinates = IdeaKotlinFragmentCoordinates(fragment),
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(
fragment = buildIdeaKotlinFragment(variant),
platform = IdeaKotlinPlatform(variant),
@@ -5,9 +5,9 @@
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(
module = IdeaKotlinModuleCoordinates(fragment.containingModule),
fragmentName = fragment.name
@@ -7,25 +7,25 @@ package org.jetbrains.kotlin.gradle.kpm.idea
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
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.KpmGradleFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule.Companion.moduleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.currentBuildId
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleDependency
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule.Companion.moduleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleDependency
internal class IdeaKotlinGranularFragmentDependencyResolver(
private val fragmentGranularMetadataResolverFactory: FragmentGranularMetadataResolverFactory
private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<ChooseVisibleSourceSets>()
.flatMap { resolution -> resolve(fragment, resolution) }
.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 kotlinModuleIdentifier = resolution.dependency.toModuleDependency().moduleIdentifier
val kotlinModuleIdentifier = resolution.dependency.toKpmModuleDependency().moduleIdentifier
return resolution.allVisibleSourceSetNames.map { visibleFragmentName ->
IdeaKotlinFragmentDependencyImpl(
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.MetadataProvider.JarMetadataProvider
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.KpmGradleFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule.Companion.moduleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleDependency
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule.Companion.moduleName
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleDependency
import org.jetbrains.kotlin.gradle.utils.withTemporaryDirectory
internal class IdeaKotlinMetadataBinaryDependencyResolver(
private val fragmentGranularMetadataResolverFactory: FragmentGranularMetadataResolverFactory
private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<ChooseVisibleSourceSets>()
.flatMap { resolution -> resolve(fragment, resolution) }
.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 kotlinModuleIdentifier = resolution.dependency.toModuleDependency().moduleIdentifier
val kotlinModuleIdentifier = resolution.dependency.toKpmModuleDependency().moduleIdentifier
/* Project to project metadata dependencies shall be resolved as source dependencies, somewhere else */
val metadataProvider = when (resolution.metadataProvider) {
@@ -5,18 +5,18 @@
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.utils.addToStdlib.ifNotEmpty
internal object IdeaKotlinMissingFileDependencyLogger : IdeaKotlinDependencyEffect {
override fun invoke(fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency>) {
override fun invoke(fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>) {
dependencies.filterIsInstance<IdeaKotlinResolvedBinaryDependency>()
.filter { !it.binaryFile.exists() }
.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")
dependencies.forEach { dependency ->
appendLine(dependency.binaryFile)
@@ -5,9 +5,9 @@
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(
coordinates = IdeaKotlinModuleCoordinates(module),
fragments = module.fragments.toList().map { fragment -> IdeaKotlinFragment(fragment) }
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.gradle.kpm.idea
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.currentBuildId
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmModule
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.currentBuildId
internal fun IdeaKotlinModuleCoordinates(module: KpmGradleModule): IdeaKotlinModuleCoordinates {
internal fun IdeaKotlinModuleCoordinates(module: GradleKpmModule): IdeaKotlinModuleCoordinates {
return IdeaKotlinModuleCoordinatesImpl(
buildId = module.project.currentBuildId().name,
projectPath = module.project.path,
@@ -10,8 +10,8 @@ import org.jetbrains.kotlin.commonizer.KonanDistribution
import org.jetbrains.kotlin.commonizer.platformLibsDir
import org.jetbrains.kotlin.compilerRunner.konanHome
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmNativeVariantInternal
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmNativeVariantInternal
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.containingVariants
import org.jetbrains.kotlin.library.ToolingSingleFileKlibResolveStrategy
import org.jetbrains.kotlin.library.resolveSingleFileKlib
@@ -20,9 +20,9 @@ import org.jetbrains.kotlin.library.uniqueName
import java.io.File
internal class IdeaKotlinNativePlatformDependencyResolver : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
val konanTargets = fragment.containingVariants
.map { it as? KpmNativeVariantInternal ?: return emptySet() }
.map { it as? GradleKpmNativeVariantInternal ?: return emptySet() }
.map { it.konanTarget }
.toSet()
@@ -9,10 +9,10 @@ import org.jetbrains.kotlin.commonizer.KonanDistribution
import org.jetbrains.kotlin.commonizer.stdlib
import org.jetbrains.kotlin.compilerRunner.konanHome
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 {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
return setOf(
IdeaKotlinResolvedBinaryDependencyImpl(
binaryType = IdeaKotlinDependency.CLASSPATH_BINARY_TYPE,
@@ -6,16 +6,15 @@
package org.jetbrains.kotlin.gradle.kpm.idea
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.pm20.FragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentGranularMetadataResolverFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName
internal class IdeaKotlinOriginalMetadataDependencyResolver(
private val fragmentGranularMetadataResolverFactory: FragmentGranularMetadataResolverFactory
private val fragmentGranularMetadataResolverFactory: GradleKpmFragmentGranularMetadataResolverFactory
) : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
val dependencyIdentifiers = fragmentGranularMetadataResolverFactory.getOrCreate(fragment).resolutions
.filterIsInstance<KeepOriginalDependency>()
.mapNotNull { resolution -> resolution.dependency.id as? ModuleComponentIdentifier }
@@ -14,11 +14,11 @@ import org.jetbrains.kotlin.konan.target.HostManager
@Suppress("unused")
/* 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) {
is KpmJvmVariant -> return IdeaKotlinPlatform.jvm(variant.compilationData.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name)
is KpmNativeVariantInternal -> return IdeaKotlinPlatform.native(variant.konanTarget.name)
is LegacyMappedVariant -> when (val compilation = variant.compilation) {
is GradleKpmJvmVariant -> return IdeaKotlinPlatform.jvm(variant.compilationData.kotlinOptions.jvmTarget ?: JvmTarget.DEFAULT.name)
is GradleKpmNativeVariantInternal -> return IdeaKotlinPlatform.native(variant.konanTarget.name)
is GradleKpmLegacyMappedVariant -> when (val compilation = variant.compilation) {
is KotlinJvmCompilation -> 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)
@@ -14,13 +14,13 @@ import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.internal.resolve.ModuleVersionResolveException
import org.jetbrains.kotlin.gradle.kpm.idea.IdeaKotlinPlatformDependencyResolver.*
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.
* '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.
* 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]
*/
class IdeaKotlinPlatformDependencyResolver(
@@ -30,28 +30,28 @@ class IdeaKotlinPlatformDependencyResolver(
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.
* @param artifactViewAttributes: Additional attributes that will be used to create an [ArtifactView] for resolving the dependencies.
*/
data class Variant(
internal val artifactViewAttributes: FragmentAttributes<KpmGradleFragment> = FragmentAttributes { }
internal val artifactViewAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment> = GradleKpmConfigurationAttributesSetup.None
) : 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.
* @param platformResolutionAttributes: Attributes describing how to resolve platform artifacts in general.
* @param artifactViewAttributes: Additional attributes that will be used to create an [ArtifactView] for
* resolving the dependencies
*/
data class PlatformFragment(
internal val platformResolutionAttributes: FragmentAttributes<KpmGradleFragment>,
internal val artifactViewAttributes: FragmentAttributes<KpmGradleFragment> = FragmentAttributes { },
internal val platformResolutionAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment>,
internal val artifactViewAttributes: GradleKpmConfigurationAttributesSetup<GradleKpmFragment> = GradleKpmConfigurationAttributesSetup { },
) : ArtifactResolution()
}
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinBinaryDependency> {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinBinaryDependency> {
val artifacts = artifactResolution.createArtifactView(fragment)?.artifacts ?: return emptySet()
val unresolvedDependencies = artifacts.failures
@@ -87,15 +87,15 @@ private val ComponentIdentifier.ideaKotlinBinaryCoordinates: IdeaKotlinBinaryCoo
else -> null
}
private fun ArtifactResolution.createArtifactView(fragment: KpmGradleFragment): ArtifactView? {
private fun ArtifactResolution.createArtifactView(fragment: GradleKpmFragment): ArtifactView? {
return when (this) {
is ArtifactResolution.Variant -> createVariantArtifactView(fragment)
is ArtifactResolution.PlatformFragment -> createPlatformFragmentArtifactView(fragment)
}
}
private fun ArtifactResolution.Variant.createVariantArtifactView(fragment: KpmGradleFragment): ArtifactView? {
if (fragment !is KpmGradleVariant) return null
private fun ArtifactResolution.Variant.createVariantArtifactView(fragment: GradleKpmFragment): ArtifactView? {
if (fragment !is GradleKpmVariant) return null
return fragment.compileDependenciesConfiguration.incoming.artifactView { view ->
view.isLenient = true
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()
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.plugin.KotlinPlatformType.native
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.containingVariants
import org.jetbrains.kotlin.project.model.KpmVariant
@@ -94,7 +94,7 @@ interface IdeaKotlinProjectModelBuilder {
* Used for scoping [IdeaKotlinDependencyResolver], [IdeaKotlinDependencyTransformer] and [IdeaKotlinDependencyEffect]
*/
fun interface FragmentConstraint {
operator fun invoke(fragment: KpmGradleFragment): Boolean
operator fun invoke(fragment: GradleKpmFragment): Boolean
companion object {
val unconstrained = FragmentConstraint { true }
@@ -8,7 +8,7 @@
package org.jetbrains.kotlin.gradle.kpm.idea
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.tooling.core.UnsafeApi
@@ -16,7 +16,7 @@ import org.jetbrains.kotlin.tooling.core.UnsafeApi
internal fun IdeaKotlinProjectModelBuilder.Companion.default(
extension: KotlinPm20ProjectExtension
) = IdeaKotlinProjectModelBuilderImpl(extension).apply {
val fragmentMetadataResolverFactory = FragmentGranularMetadataResolverFactory()
val fragmentMetadataResolverFactory = GradleKpmFragmentGranularMetadataResolverFactory()
registerDependencyResolver(
resolver = IdeaKotlinRefinesDependencyResolver,
@@ -5,13 +5,13 @@
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 {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> = fragment.refinesClosure
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> = fragment.refinesClosure
.map { refinesDependencyFragment -> createRefinesDependency(refinesDependencyFragment) }.toSet()
private fun createRefinesDependency(fragment: KpmGradleFragment): IdeaKotlinDependency {
private fun createRefinesDependency(fragment: GradleKpmFragment): IdeaKotlinDependency {
return IdeaKotlinFragmentDependencyImpl(
type = IdeaKotlinFragmentDependency.Type.Refines,
coordinates = IdeaKotlinFragmentCoordinates(fragment)
@@ -5,7 +5,7 @@
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
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")
override fun transform(
fragment: KpmGradleFragment,
fragment: GradleKpmFragment,
dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency> {
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.language.base.artifact.SourcesArtifact
import org.gradle.language.java.artifact.JavadocArtifact
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KpmGradleVariant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragment
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmVariant
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.resolvableMetadataConfigurationName
internal class IdeaKotlinSourcesAndDocumentationResolver : IdeaKotlinDependencyResolver {
override fun resolve(fragment: KpmGradleFragment): Set<IdeaKotlinDependency> {
if (fragment is KpmGradleVariant) {
override fun resolve(fragment: GradleKpmFragment): Set<IdeaKotlinDependency> {
if (fragment is GradleKpmVariant) {
return resolve(fragment.project, fragment.compileDependenciesConfiguration)
}
@@ -5,11 +5,11 @@
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 {
override fun transform(
fragment: KpmGradleFragment, dependencies: Set<IdeaKotlinDependency>
fragment: GradleKpmFragment, dependencies: Set<IdeaKotlinDependency>
): Set<IdeaKotlinDependency> {
val sourcesAndDocumentationDependencies = dependencies
.filterIsInstance<IdeaKotlinResolvedBinaryDependency>()
@@ -43,7 +43,7 @@ import java.util.concurrent.Callable
interface CompilationDetails<T : KotlinCommonOptions> {
val target: KotlinTarget
val compileDependencyFilesHolder: DependencyFilesHolder
val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder
val kotlinDependenciesHolder: HasKotlinDependencies
@@ -66,7 +66,7 @@ interface CompilationDetails<T : KotlinCommonOptions> {
}
interface CompilationDetailsWithRuntime<T : KotlinCommonOptions> : CompilationDetails<T> {
val runtimeDependencyFilesHolder: DependencyFilesHolder
val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder
}
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(
target.disambiguationClassifier,
compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(),
@@ -328,7 +328,7 @@ open class DefaultCompilationDetailsWithRuntime<T : KotlinCommonOptions>(
compilationPurpose: String,
createKotlinOptions: DefaultCompilationDetails<*>.() -> T
) : DefaultCompilationDetails<T>(target, compilationPurpose, createKotlinOptions), CompilationDetailsWithRuntime<T> {
override val runtimeDependencyFilesHolder: DependencyFilesHolder = project.newDependencyFilesHolder(
override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder(
lowerCamelCaseName(
target.disambiguationClassifier,
compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(),
@@ -346,7 +346,7 @@ open class NativeCompilationDetails(
compilationPurpose,
createKotlinOptions
) {
override val compileDependencyFilesHolder: DependencyFilesHolder = project.newDependencyFilesHolder(
override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder = project.newDependencyFilesHolder(
lowerCamelCaseName(
target.disambiguationClassifier,
compilationPurpose.takeIf { it != KotlinCompilation.MAIN_COMPILATION_NAME }.orEmpty(),
@@ -402,8 +402,8 @@ internal open class MetadataMappedCompilationDetails<T : KotlinCommonOptions>(
override val target: KotlinMetadataTarget,
final override val compilationData: AbstractKotlinFragmentMetadataCompilationData<T>
) : CompilationDetails<T> {
override val compileDependencyFilesHolder: DependencyFilesHolder =
DependencyFilesHolder.ofMetadataCompilationDependencies(compilationData)
override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder =
GradleKpmDependencyFilesHolder.ofMetadataCompilationDependencies(compilationData)
override val kotlinDependenciesHolder: HasKotlinDependencies
get() = compilationData.fragment
@@ -432,7 +432,7 @@ internal open class MetadataMappedCompilationDetails<T : KotlinCommonOptions>(
}
internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
open val variant: KpmGradleVariantInternal,
open val variant: GradleKpmVariantInternal,
override val target: KotlinTarget
) : CompilationDetails<T> {
@@ -458,8 +458,8 @@ internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
override val associateCompilations: Set<CompilationDetails<*>> get() = emptySet()
override val compileDependencyFilesHolder: DependencyFilesHolder
get() = DependencyFilesHolder.ofVariantCompileDependencies(variant)
override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = GradleKpmDependencyFilesHolder.ofVariantCompileDependencies(variant)
override val kotlinDependenciesHolder: HasKotlinDependencies
get() = variant
@@ -469,12 +469,12 @@ internal open class VariantMappedCompilationDetails<T : KotlinCommonOptions>(
}
internal open class VariantMappedCompilationDetailsWithRuntime<T : KotlinCommonOptions>(
override val variant: KpmGradleVariantWithRuntimeInternal,
override val variant: GradleKpmVariantWithRuntimeInternal,
target: KotlinTarget
) : VariantMappedCompilationDetails<T>(variant, target),
CompilationDetailsWithRuntime<T> {
override val runtimeDependencyFilesHolder: DependencyFilesHolder
get() = DependencyFilesHolder.ofVariantRuntimeDependencies(variant)
override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = GradleKpmDependencyFilesHolder.ofVariantRuntimeDependencies(variant)
}
internal class WithJavaCompilationDetails<T : KotlinCommonOptions>(
@@ -490,14 +490,14 @@ internal class WithJavaCompilationDetails<T : KotlinCommonOptions>(
override val output: KotlinCompilationOutput by lazy { KotlinWithJavaCompilationOutput(compilation) }
override val compileDependencyFilesHolder: DependencyFilesHolder
get() = object : DependencyFilesHolder {
override val compileDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = object : GradleKpmDependencyFilesHolder {
override val dependencyConfigurationName: String by javaSourceSet::compileClasspathConfigurationName
override var dependencyFiles: FileCollection by javaSourceSet::compileClasspath
}
override val runtimeDependencyFilesHolder: DependencyFilesHolder
get() = object : DependencyFilesHolder {
override val runtimeDependencyFilesHolder: GradleKpmDependencyFilesHolder
get() = object : GradleKpmDependencyFilesHolder {
override val dependencyConfigurationName: String by javaSourceSet::runtimeClasspathConfigurationName
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.KotlinDependencyHandler
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.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.directoryNpmDependency
@@ -74,7 +74,7 @@ class DefaultKotlinDependencyHandler(
dependencyNotation: Any
): Dependency? {
val dependency = when (dependencyNotation) {
is KpmGradleModule -> project.dependencies.create(dependencyNotation.project).apply {
is GradleKpmModule -> project.dependencies.create(dependencyNotation.project).apply {
(this as ModuleDependency).capabilities {
if (dependencyNotation.moduleClassifier != null) {
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.plugin.*
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.KotlinDependencyScope
import org.jetbrains.kotlin.gradle.plugin.sources.getVisibleSourceSetsFromAssociateCompilations
@@ -32,7 +34,7 @@ class ProjectStructureMetadataModuleBuilder {
component: ResolvedComponentResult,
metadata: KotlinProjectStructureMetadata
): KpmModule {
val moduleData = KpmBasicModule(component.toSingleModuleIdentifier()).apply {
val moduleData = KpmBasicModule(component.toSingleKpmModuleIdentifier()).apply {
metadata.sourceSetNamesByVariantName.keys.forEach { variantName ->
fragments.add(KpmBasicVariant(this@apply, variantName))
}
@@ -69,7 +71,7 @@ class ProjectStructureMetadataModuleBuilder {
}
}
}
return KpmExternalImportedModule(
return GradleKpmExternalImportedModule(
moduleData,
metadata,
moduleData.fragments.filterTo(mutableSetOf()) { it.fragmentName in metadata.hostSpecificSourceSets }
@@ -77,7 +79,7 @@ class ProjectStructureMetadataModuleBuilder {
}
fun getModule(component: ResolvedComponentResult, projectStructureMetadata: KotlinProjectStructureMetadata): KpmModule {
val moduleId = component.toSingleModuleIdentifier()
val moduleId = component.toSingleKpmModuleIdentifier()
return modulesCache.getOrPut(moduleId) {
buildModuleFromProjectStructureMetadata(
component,
@@ -188,7 +190,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp
// FIXME: Kotlin/Native implementation-effective-api dependencies are missing here. Introduce dependency scopes
requestedDependencies(project, sourceSet, listOf(KotlinDependencyScope.API_SCOPE)).forEach {
val moduleDependency = it.toModuleDependency(project)
val moduleDependency = it.toKpmModuleDependency(project)
fragment.declaredModuleDependencies.add(moduleDependency)
}
}
@@ -236,7 +238,7 @@ class GradleProjectModuleBuilder(private val addInferredSourceSetVisibilityAsExp
}
}
internal fun Dependency.toModuleDependency(
internal fun Dependency.toKpmModuleDependency(
project: Project
): KpmModuleDependency {
return KpmModuleDependency(
@@ -261,30 +263,30 @@ internal fun Dependency.toModuleDependency(
private fun KpmBasicModule.fragmentByName(name: String) =
fragments.single { it.fragmentName == name }
class CachingModuleVariantResolver(private val actualResolver: ModuleVariantResolver) : ModuleVariantResolver {
private val resultCacheByRequestingVariant: MutableMap<org.jetbrains.kotlin.project.model.KpmVariant, MutableMap<KpmModule, VariantResolution>> = mutableMapOf()
class KpmCachingModuleVariantResolver(private val actualResolver: KpmModuleVariantResolver) : KpmModuleVariantResolver {
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() }
return resultCache.getOrPut(dependencyModule) { actualResolver.getChosenVariant(requestingVariant, dependencyModule) }
}
}
class GradleModuleVariantResolver : ModuleVariantResolver {
override fun getChosenVariant(requestingVariant: org.jetbrains.kotlin.project.model.KpmVariant, dependencyModule: KpmModule): VariantResolution {
class KpmGradleModuleVariantResolver : KpmModuleVariantResolver {
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
// unrequested dependency. This workaround is needed for synthetic modules which were not produced from module metadata, so maybe
// those modules should be marked somehow
if (dependencyModule is KpmExternalPlainModule) {
return VariantResolution.fromMatchingVariants(
if (dependencyModule is GradleKpmExternalPlainModule) {
return KpmVariantResolution.fromMatchingVariants(
requestingVariant,
dependencyModule,
listOf(dependencyModule.singleVariant)
)
}
if (requestingVariant !is KpmGradleVariant) {
return VariantResolution.Unknown(requestingVariant, dependencyModule)
if (requestingVariant !is GradleKpmVariant) {
return KpmVariantResolution.Unknown(requestingVariant, dependencyModule)
}
val module = requestingVariant.containingModule
@@ -300,9 +302,9 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
// FIXME check composite builds, it's likely that resolvedVariantProvider fails on them?
val resolvedGradleVariantName = resolvedVariantProvider.getResolvedVariantName(dependencyModuleId, compileClasspath)
val kotlinVariantName = when (dependencyModule) {
is KpmGradleModule -> {
is GradleKpmModule -> {
dependencyModule.variants.singleOrNull { resolvedGradleVariantName in it.gradleVariantNames }?.name
?: return VariantResolution.Unknown(requestingVariant, dependencyModule)
?: return KpmVariantResolution.Unknown(requestingVariant, dependencyModule)
}
else -> resolvedGradleVariantName?.let(::kotlinVariantNameFromPublishedVariantName)
}
@@ -310,15 +312,15 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
val resultVariant = dependencyModule.variants.singleOrNull { it.fragmentName == kotlinVariantName }
return if (resultVariant == null)
VariantResolution.NoVariantMatch(requestingVariant, dependencyModule)
KpmVariantResolution.KpmNoVariantMatch(requestingVariant, dependencyModule)
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 {
project.hasKpmModel -> {
(requestingVariant as KpmGradleVariant).compileDependenciesConfiguration
(requestingVariant as GradleKpmVariant).compileDependenciesConfiguration
}
else -> {
val targets =
@@ -342,10 +344,10 @@ class GradleModuleVariantResolver : ModuleVariantResolver {
}
companion object {
fun getForCurrentBuild(project: Project): ModuleVariantResolver {
fun getForCurrentBuild(project: Project): KpmModuleVariantResolver {
val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.variantResolver.${project.getKotlinPluginVersion()}"
return project.getOrPutRootProjectProperty(extraPropertyName) {
CachingModuleVariantResolver(GradleModuleVariantResolver())
KpmCachingModuleVariantResolver(KpmGradleModuleVariantResolver())
}
}
}
@@ -80,10 +80,10 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
setupKpmModulesPublication(project)
registerDefaultVariantFactories(project)
with(project.kpmModules) {
create(KpmGradleModule.MAIN_MODULE_NAME) {
create(GradleKpmModule.MAIN_MODULE_NAME) {
it.makePublic()
}
create(KpmGradleModule.TEST_MODULE_NAME)
create(GradleKpmModule.TEST_MODULE_NAME)
}
}
@@ -282,7 +282,7 @@ internal fun applyUserDefinedAttributes(target: AbstractKotlinTarget) {
private fun applyUserDefinedAttributesWithKpm(
target: AbstractKotlinTarget,
) {
fun copyAttributesToVariant(variant: KpmGradleVariant, from: AttributeContainer) {
fun copyAttributesToVariant(variant: GradleKpmVariant, from: AttributeContainer) {
variant.gradleVariantNames.forEach { configurationOrVariantName ->
val configuration = variant.project.configurations.findByName(configurationOrVariantName)
?: 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
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
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.Nested
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.sources.KotlinDependencyScope
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 }
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.plugin.mpp.pm20.*
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.project.model.KpmModuleIdentifier
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.result.ResolvedComponentResult
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
internal fun MppDependencyProjectStructureMetadataExtractor.Factory.create(
@@ -25,7 +25,7 @@ internal fun MppDependencyProjectStructureMetadataExtractor.Factory.create(
FIXME this loses information about auxiliary module deps
TODO check how this code works with multi-capability resolutions,
*/
moduleIdentifier = resolvedComponentResult.toSingleModuleIdentifier(),
moduleIdentifier = resolvedComponentResult.toSingleKpmModuleIdentifier(),
configuration = configuration,
resolveViaAvailableAt = resolveViaAvailableAt,
resolvedComponentResult = resolvedComponentResult,
@@ -14,8 +14,8 @@ import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.artifacts.result.ResolvedVariantResult
import org.gradle.api.attributes.Usage
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toModuleIdentifiers
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleModuleIdentifier
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toKpmModuleIdentifiers
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.toSingleKpmModuleIdentifier
import org.jetbrains.kotlin.gradle.plugin.usageByName
import org.jetbrains.kotlin.gradle.utils.getOrPut
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
@@ -112,13 +112,13 @@ internal class ResolvedMppVariantsProvider private constructor(private val proje
if (isMpp) {
result.add(component)
component.dependents.forEach { dependent ->
dependent.requested.toModuleIdentifiers().forEach { moduleId ->
dependent.requested.toKpmModuleIdentifiers().forEach { moduleId ->
val moduleEntry = getEntryForModule(moduleId)
moduleEntry.resolvedVariantsByConfiguration[configuration] = listOf(dependent.resolvedVariant)
moduleEntry.dependenciesByConfiguration[configuration] = component.dependencies
.filterIsInstance<ResolvedDependencyResult>()
.map { dependency -> dependency.selected.toSingleModuleIdentifier() }
.map { dependency -> dependency.selected.toSingleKpmModuleIdentifier() }
if (component.id is ProjectComponentIdentifier) {
// 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
) {
val mppModuleIds = mppComponentIds.flatMapTo(mutableSetOf()) { componentId ->
componentId.toModuleIdentifiers()
componentId.toKpmModuleIdentifiers()
}
mppComponentIds.forEach { componentId ->
componentId.toModuleIdentifiers().forEach { moduleId ->
componentId.toKpmModuleIdentifiers().forEach { moduleId ->
val moduleEntry = getEntryForModule(moduleId)
val artifact = artifacts[componentId]
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.KotlinPlatformType
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 java.io.File
@@ -57,7 +57,7 @@ internal class SourceSetVisibilityProvider(
val compilations = CompilationSourceSetUtil.compilationsBySourceSets(project).getValue(visibleFrom)
val component = resolvedRootMppDependency ?: resolvedMetadataDependency
val mppModuleIdentifier = component.toSingleModuleIdentifier()
val mppModuleIdentifier = component.toSingleKpmModuleIdentifier()
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.utils.isGradleVersionAtLeast
val KotlinFragmentPlatformAttributes = FragmentAttributes<KpmGradleVariant> {
val GradleKpmPlatformAttributes = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
if (isGradleVersionAtLeast(7, 0) && fragment.platformType == KotlinPlatformType.jvm) {
namedAttribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, TargetJvmEnvironment.STANDARD_JVM)
}
@@ -28,26 +28,26 @@ val KotlinFragmentPlatformAttributes = FragmentAttributes<KpmGradleVariant> {
attribute(KotlinPlatformType.attribute, fragment.platformType)
}
val KotlinFragmentConsumerApiUsageAttribute = FragmentAttributes<KpmGradleVariant> {
val GradleKpmConsumerApiUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
attribute(USAGE_ATTRIBUTE, consumerApiUsage(project, fragment.platformType))
}
val KotlinFragmentProducerApiUsageAttribute = FragmentAttributes<KpmGradleVariant> {
val GradleKpmProducerApiUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
attribute(USAGE_ATTRIBUTE, producerApiUsage(fragment.project, fragment.platformType))
}
val KotlinFragmentConsumerRuntimeUsageAttribute = FragmentAttributes<KpmGradleVariant> {
val GradleKpmConsumerRuntimeUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
attribute(USAGE_ATTRIBUTE, consumerRuntimeUsage(fragment.project, fragment.platformType))
}
val KotlinFragmentProducerRuntimeUsageAttribute = FragmentAttributes<KpmGradleVariant> {
val GradleKpmProducerRuntimeUsageAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmVariant> {
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))
}
val KotlinFragmentKonanTargetAttribute = FragmentAttributes<KpmNativeVariantInternal> {
val GradleKpmKonanTargetAttribute = GradleKpmConfigurationAttributesSetup<GradleKpmNativeVariantInternal> {
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.Category
val DefaultKotlinCompileDependenciesDefinition = KotlinGradleFragmentConfigurationDefinition(
provider = ConfigurationProvider {
val DefaultKotlinCompileDependenciesDefinition = GradleKpmConfigurationSetup(
provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("compileDependencies")).apply {
isCanBeConsumed = false
isCanBeResolved = true
}
},
relations = FragmentConfigurationRelation {
relations = GradleKpmConfigurationRelationSetup {
extendsFrom(dependencies.transitiveApiConfiguration)
extendsFrom(dependencies.transitiveImplementationConfiguration)
},
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerApiUsageAttribute
attributes = GradleKpmPlatformAttributes + GradleKpmConsumerApiUsageAttribute
)
val DefaultKotlinRuntimeDependenciesDefinition = ConfigurationDefinition(
provider = ConfigurationProvider {
val DefaultKotlinRuntimeDependenciesDefinition = GradleKpmConfigurationSetup(
provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("runtimeDependencies")).apply {
isCanBeConsumed = false
isCanBeResolved = true
}
},
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentConsumerRuntimeUsageAttribute,
relations = FragmentConfigurationRelation {
attributes = GradleKpmPlatformAttributes + GradleKpmConsumerRuntimeUsageAttribute,
relations = GradleKpmConfigurationRelationSetup {
extendsFrom(dependencies.transitiveApiConfiguration)
extendsFrom(dependencies.transitiveImplementationConfiguration)
extendsFrom(dependencies.transitiveRuntimeOnlyConfiguration)
}
)
val DefaultKotlinApiElementsDefinition = ConfigurationDefinition(
provider = ConfigurationProvider {
val DefaultKotlinApiElementsDefinition = GradleKpmConfigurationSetup(
provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("apiElements")).apply {
isCanBeResolved = false
isCanBeConsumed = false
module.ifMadePublic { isCanBeConsumed = true }
}
},
relations = FragmentConfigurationRelation { extendsFrom(dependencies.transitiveApiConfiguration) },
capabilities = KotlinFragmentModuleCapability,
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentProducerApiUsageAttribute + FragmentAttributes {
relations = GradleKpmConfigurationRelationSetup { extendsFrom(dependencies.transitiveApiConfiguration) },
capabilities = GradleKpmModuleCapability,
attributes = GradleKpmPlatformAttributes + GradleKpmProducerApiUsageAttribute + GradleKpmConfigurationAttributesSetup {
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))
},
)
val DefaultKotlinRuntimeElementsDefinition = ConfigurationDefinition(
provider = ConfigurationProvider {
val DefaultKotlinRuntimeElementsDefinition = GradleKpmConfigurationSetup(
provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("runtimeElements")).apply {
isCanBeResolved = false
isCanBeConsumed = false
module.ifMadePublic { isCanBeConsumed = true }
}
},
relations = FragmentConfigurationRelation {
relations = GradleKpmConfigurationRelationSetup {
extendsFrom(dependencies.transitiveApiConfiguration)
extendsFrom(dependencies.transitiveImplementationConfiguration)
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(Bundling.BUNDLING_ATTRIBUTE, fragment.project.objects.named(Bundling::class.java, Bundling.EXTERNAL))
},
capabilities = KotlinFragmentModuleCapability
capabilities = GradleKpmModuleCapability
)
val DefaultKotlinHostSpecificMetadataElementsDefinition = ConfigurationDefinition(
provider = ConfigurationProvider {
val DefaultKotlinHostSpecificMetadataElementsDefinition = GradleKpmConfigurationSetup(
provider = GradleKpmConfigurationProvider {
project.configurations.maybeCreate(disambiguateName("hostSpecificMetadataElements")).apply {
isCanBeResolved = false
isCanBeConsumed = false
}
},
attributes = KotlinFragmentPlatformAttributes + KotlinFragmentKonanTargetAttribute + KotlinFragmentMetadataUsageAttribute,
artifacts = KotlinFragmentHostSpecificMetadataArtifact
attributes = GradleKpmPlatformAttributes + GradleKpmKonanTargetAttribute + GradleKpmMetadataUsageAttribute,
artifacts = GradleKpmHostSpecificMetadataArtifact
)
@@ -15,12 +15,12 @@ import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope
import org.jetbrains.kotlin.project.model.*
internal fun resolvableMetadataConfiguration(
module: KpmGradleModule
module: GradleKpmModule
) = module.project.configurations.getByName(module.resolvableMetadataConfigurationName)
internal fun configurationToResolveMetadataDependencies(project: Project, requestingModule: KpmModule): Configuration =
when {
project.hasKpmModel -> resolvableMetadataConfiguration(requestingModule as KpmGradleModule)
project.hasKpmModel -> resolvableMetadataConfiguration(requestingModule as GradleKpmModule)
else -> resolvableMetadataConfiguration(
project,
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
) : KpmDependencyGraphResolver {
private fun configurationToResolve(requestingModule: KpmGradleModule): Configuration =
private fun configurationToResolve(requestingModule: GradleKpmModule): Configuration =
configurationToResolveMetadataDependencies(requestingModule.project, requestingModule)
override fun resolveDependencyGraph(requestingModule: KpmModule): KpmDependencyGraphResolution {
if (requestingModule !is KpmGradleModule)
if (requestingModule !is GradleKpmModule)
return KpmDependencyGraphResolution.Unknown(requestingModule)
return resolveAsGraph(requestingModule)
}
private fun resolveAsGraph(requestingModule: KpmGradleModule): KpmGradleDependencyGraph {
val nodeByModuleId = mutableMapOf<KpmModuleIdentifier, GradleDependencyGraphNode>()
private fun resolveAsGraph(requestingModule: GradleKpmModule): GradleKpmDependencyGraph {
val nodeByModuleId = mutableMapOf<KpmModuleIdentifier, GradleKpmDependencyGraphNode>()
fun getKotlinModuleFromComponentResult(component: ResolvedComponentResult): KpmModule =
moduleResolver.resolveDependency(requestingModule, component.toModuleDependency())
moduleResolver.resolveDependency(requestingModule, component.toKpmModuleDependency())
?: buildSyntheticPlainModule(
component,
component.variants.singleOrNull()?.displayName ?: "default",
)
fun nodeFromModule(componentResult: ResolvedComponentResult, kpmModule: KpmModule): GradleDependencyGraphNode {
fun nodeFromModule(componentResult: ResolvedComponentResult, kpmModule: KpmModule): GradleKpmDependencyGraphNode {
val id = kpmModule.moduleIdentifier
return nodeByModuleId.getOrPut(id) {
val metadataSourceComponent =
(kpmModule as? KpmExternalImportedModule)
(kpmModule as? GradleKpmExternalImportedModule)
?.takeIf { it.hasLegacyMetadataModule }
?.let { (componentResult.dependencies.singleOrNull() as? ResolvedDependencyResult)?.selected }
?: componentResult
@@ -68,8 +68,8 @@ class KpmGradleDependencyGraphResolver(
.filterIsInstance<ResolvedDependencyResult>()
// 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
.filter { dependency -> dependency.requested.toModuleIdentifiers().any { it in dependenciesRequestedByModule } }
.flatMap { dependency -> dependency.requested.toModuleIdentifiers().map { id -> id to dependency.selected } }
.filter { dependency -> dependency.requested.toKpmModuleIdentifiers().any { it in dependenciesRequestedByModule } }
.flatMap { dependency -> dependency.requested.toKpmModuleIdentifiers().map { id -> id to dependency.selected } }
.toMap()
val fragmentDependencies = kpmModule.fragments.associateWith { it.declaredModuleDependencies }
@@ -81,7 +81,7 @@ class KpmGradleDependencyGraphResolver(
}
}
GradleDependencyGraphNode(
GradleKpmDependencyGraphNode(
kpmModule,
componentResult,
metadataSourceComponent,
@@ -90,24 +90,23 @@ class KpmGradleDependencyGraphResolver(
}
}
return KpmGradleDependencyGraph(
return GradleKpmDependencyGraph(
requestingModule,
nodeFromModule(configurationToResolve(requestingModule).incoming.resolutionResult.root, requestingModule)
)
}
}
class GradleDependencyGraphNode(
class GradleKpmDependencyGraphNode(
override val module: KpmModule,
val selectedComponent: ResolvedComponentResult,
/** 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. */
val metadataSourceComponent: ResolvedComponentResult?,
override val dependenciesByFragment: Map<KpmFragment, Iterable<GradleDependencyGraphNode>>
override val dependenciesByFragment: Map<KpmFragment, Iterable<GradleKpmDependencyGraphNode>>
) : KpmDependencyGraphNode(module, dependenciesByFragment)
class KpmGradleDependencyGraph(
override val requestingModule: KpmGradleModule,
override val root: GradleDependencyGraphNode
class GradleKpmDependencyGraph(
override val requestingModule: GradleKpmModule,
override val root: GradleKpmDependencyGraphNode
) : 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.utils.getOrPutRootProjectProperty
import org.jetbrains.kotlin.project.model.*
import org.jetbrains.kotlin.project.model.KpmVariant
import java.util.*
class KpmCachingModuleDependencyResolver(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)
}
}
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,
class GradleKpmModuleDependencyResolver(
private val gradleComponentResultResolver: GradleKpmComponentResultCachingResolver,
private val projectStructureMetadataModuleBuilder: ProjectStructureMetadataModuleBuilder,
private val projectModuleBuilder: GradleProjectModuleBuilder
) : KpmModuleDependencyResolver {
override fun resolveDependency(requestingModule: KpmModule, moduleDependency: KpmModuleDependency): KpmModule? {
require(requestingModule is KpmGradleModule)
require(requestingModule is GradleKpmModule)
val project = requestingModule.project
val component = gradleComponentResultResolver.resolveModuleDependencyAsComponentResult(requestingModule, moduleDependency)
@@ -101,11 +56,11 @@ class KpmGradleModuleDependencyResolver(
fun getForCurrentBuild(project: Project): KpmModuleDependencyResolver {
val extraPropertyName = "org.jetbrains.kotlin.dependencyResolution.moduleResolver.${project.getKotlinPluginVersion()}"
return project.getOrPutRootProjectProperty(extraPropertyName) {
val componentResultResolver = GradleComponentResultCachingResolver.getForCurrentBuild(project)
val componentResultResolver = GradleKpmComponentResultCachingResolver.getForCurrentBuild(project)
val metadataModuleBuilder = ProjectStructureMetadataModuleBuilder()
val projectModuleBuilder = GradleProjectModuleBuilder(true)
KpmCachingModuleDependencyResolver(
KpmGradleModuleDependencyResolver(componentResultResolver, metadataModuleBuilder, projectModuleBuilder)
GradleKpmCachingModuleDependencyResolver(
GradleKpmModuleDependencyResolver(componentResultResolver, metadataModuleBuilder, projectModuleBuilder)
)
}
}
@@ -117,21 +72,21 @@ class KpmGradleModuleDependencyResolver(
internal fun buildSyntheticPlainModule(
resolvedComponentResult: ResolvedComponentResult,
singleVariantName: String,
): KpmExternalPlainModule {
val moduleDependency = resolvedComponentResult.toModuleDependency()
return KpmExternalPlainModule(KpmBasicModule(moduleDependency.moduleIdentifier).apply {
): GradleKpmExternalPlainModule {
val moduleDependency = resolvedComponentResult.toKpmModuleDependency()
return GradleKpmExternalPlainModule(KpmBasicModule(moduleDependency.moduleIdentifier).apply {
KpmBasicVariant(this@apply, singleVariantName, DefaultLanguageSettingsBuilder()).apply {
fragments.add(this)
this.declaredModuleDependencies.addAll(
resolvedComponentResult.dependencies
.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"
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}")
}
internal class KpmExternalImportedModule(
internal class GradleKpmExternalImportedModule(
private val moduleData: KpmBasicModule,
val projectStructureMetadata: KotlinProjectStructureMetadata,
val hostSpecificFragments: Set<KpmFragment>
@@ -149,28 +104,28 @@ internal class KpmExternalImportedModule(
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)
internal fun ComponentIdentifier.matchesModule(module: KpmModule): Boolean =
matchesModuleIdentifier(module.moduleIdentifier)
internal fun ResolvedComponentResult.toModuleIdentifiers(): List<KpmModuleIdentifier> {
internal fun ResolvedComponentResult.toKpmModuleIdentifiers(): List<KpmModuleIdentifier> {
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
internal fun ResolvedComponentResult.toSingleModuleIdentifier(): KpmModuleIdentifier {
internal fun ResolvedComponentResult.toSingleKpmModuleIdentifier(): KpmModuleIdentifier {
val classifiers = moduleClassifiersFromCapabilities(variants.flatMap { it.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) {
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)
}
}
@@ -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*/ }
}
internal fun ComponentSelector.toModuleIdentifiers(): Iterable<KpmModuleIdentifier> {
internal fun ComponentSelector.toKpmModuleIdentifiers(): Iterable<KpmModuleIdentifier> {
val moduleClassifiers = moduleClassifiersFromCapabilities(requestedCapabilities)
return when (this) {
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 ComponentSelector.toModuleDependency(): KpmModuleDependency {
val moduleId = toModuleIdentifiers().single() // FIXME handle multiple
internal fun ResolvedComponentResult.toKpmModuleDependency(): KpmModuleDependency = KpmModuleDependency(toSingleKpmModuleIdentifier())
internal fun ComponentSelector.toKpmModuleDependency(): KpmModuleDependency {
val moduleId = toKpmModuleIdentifiers().single() // FIXME handle multiple
return KpmModuleDependency(moduleId)
}
@@ -206,7 +161,7 @@ internal fun ComponentIdentifier.matchesModuleIdentifier(id: KpmModuleIdentifier
}
is KpmMavenModuleIdentifier -> {
val componentId = this as? ModuleComponentIdentifier
componentId?.toSingleModuleIdentifier() == id
componentId?.toSingleKpmModuleIdentifier() == id
}
else -> false
}
@@ -14,9 +14,9 @@ import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
import java.io.File
import java.util.*
internal class FragmentGranularMetadataResolver(
private val requestingFragment: KpmGradleFragment,
private val refinesParentResolvers: Lazy<Iterable<FragmentGranularMetadataResolver>>
internal class GradleKpmFragmentGranularMetadataResolver(
private val requestingFragment: GradleKpmFragment,
private val refinesParentResolvers: Lazy<Iterable<GradleKpmFragmentGranularMetadataResolver>>
) {
val resolutions: Iterable<MetadataDependencyResolution> by lazy {
doResolveMetadataDependencies()
@@ -26,33 +26,33 @@ internal class FragmentGranularMetadataResolver(
get() = requestingFragment.containingModule.project
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 variantResolver = GradleModuleVariantResolver.getForCurrentBuild(project)
private val fragmentResolver = DefaultModuleFragmentsResolver(variantResolver)
private val dependencyGraphResolver = KpmGradleDependencyGraphResolver(moduleResolver)
private val moduleResolver = GradleKpmModuleDependencyResolver.getForCurrentBuild(project)
private val variantResolver = KpmGradleModuleVariantResolver.getForCurrentBuild(project)
private val fragmentResolver = KpmDefaultFragmentsResolver(variantResolver)
private val dependencyGraphResolver = GradleKpmDependencyGraphResolver(moduleResolver)
private fun doResolveMetadataDependencies(): Iterable<MetadataDependencyResolution> {
val configurationToResolve = configurationToResolveMetadataDependencies(project, requestingFragment.containingModule)
val resolvedComponentsByModuleId =
configurationToResolve.incoming.resolutionResult.allComponents.associateBy { it.toSingleModuleIdentifier() }
configurationToResolve.incoming.resolutionResult.allComponents.associateBy { it.toSingleKpmModuleIdentifier() }
val resolvedDependenciesByModuleId =
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)
if (dependencyGraph is KpmDependencyGraphResolution.Unknown)
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 requestedDependencies = dependencyGraph.root.dependenciesByFragment.filterKeys { it in fragmentsToInclude }.values.flatten()
val visited = mutableSetOf<GradleDependencyGraphNode>()
val fragmentResolutionQueue = ArrayDeque<GradleDependencyGraphNode>(requestedDependencies)
val visited = mutableSetOf<GradleKpmDependencyGraphNode>()
val fragmentResolutionQueue = ArrayDeque<GradleKpmDependencyGraphNode>(requestedDependencies)
val results = mutableSetOf<MetadataDependencyResolution>()
@@ -63,7 +63,7 @@ internal class FragmentGranularMetadataResolver(
val dependencyModule = dependencyNode.module
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 visibleTransitiveDependencies =
@@ -74,7 +74,7 @@ internal class FragmentGranularMetadataResolver(
val resolvedComponentResult = dependencyNode.selectedComponent
val isResolvedAsProject = resolvedComponentResult.toProjectOrNull(project)
val result = when (dependencyModule) {
is KpmExternalPlainModule -> {
is GradleKpmExternalPlainModule -> {
MetadataDependencyResolution.KeepOriginalDependency(resolvedComponentResult, isResolvedAsProject)
}
else -> run {
@@ -83,7 +83,7 @@ internal class FragmentGranularMetadataResolver(
val visibleFragmentNames = visibleFragments.map { it.fragmentName }.toSet()
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
@@ -96,7 +96,7 @@ internal class FragmentGranularMetadataResolver(
"the presence of a proper Kotlin Module"
)
val projectStructureMetadata = (dependencyModule as? KpmExternalImportedModule)?.projectStructureMetadata
val projectStructureMetadata = (dependencyModule as? GradleKpmExternalImportedModule)?.projectStructureMetadata
?: checkNotNull(projectStructureMetadataExtractor.getProjectStructureMetadata())
@@ -111,7 +111,7 @@ internal class FragmentGranularMetadataResolver(
projectStructureMetadata = projectStructureMetadata,
primaryArtifactFile = projectStructureMetadataExtractor.primaryArtifactFile,
hostSpecificArtifactsBySourceSet = if (
dependencyModule is KpmExternalImportedModule && chosenFragments != null
dependencyModule is GradleKpmExternalImportedModule && chosenFragments != null
) resolveHostSpecificMetadataArtifacts(dependencyModule, chosenFragments) else emptyMap(),
).asMetadataProvider()
}
@@ -147,21 +147,21 @@ internal class FragmentGranularMetadataResolver(
}
private fun resolveHostSpecificMetadataArtifacts(
dependencyModule: KpmExternalImportedModule,
chosenFragments: FragmentResolution.ChosenFragments,
dependencyModule: GradleKpmExternalImportedModule,
chosenFragments: KpmFragmentResolution.ChosenFragments,
): Map<String, File> {
val visibleFragments = chosenFragments.visibleFragments
val variantResolutions = chosenFragments.variantResolutions
val hostSpecificFragments = dependencyModule.hostSpecificFragments
return visibleFragments.intersect(hostSpecificFragments).mapNotNull { hostSpecificFragment ->
val relevantVariantResolution = variantResolutions
.filterIsInstance<VariantResolution.VariantMatch>()
.filterIsInstance<KpmVariantResolution.KpmVariantMatch>()
// find some of our variants that resolved a dependency's variant containing the fragment
.find { hostSpecificFragment in it.chosenVariant.withRefinesClosure }
// resolve the dependencies of that variant getting the host-specific metadata artifact
relevantVariantResolution?.let { resolution ->
val configurationResolvingPlatformVariant =
(resolution.requestingVariant as KpmGradleVariant).compileDependenciesConfiguration
(resolution.requestingVariant as GradleKpmVariant).compileDependenciesConfiguration
val hostSpecificArtifact = ResolvedMppVariantsProvider.get(project)
.getHostSpecificMetadataArtifactByRootModule(
dependencyModule.moduleIdentifier,
@@ -5,11 +5,11 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
internal class FragmentGranularMetadataResolverFactory {
private val resolvers = mutableMapOf<KpmGradleFragment, FragmentGranularMetadataResolver>()
internal class GradleKpmFragmentGranularMetadataResolverFactory {
private val resolvers = mutableMapOf<GradleKpmFragment, GradleKpmFragmentGranularMetadataResolver>()
fun getOrCreate(fragment: KpmGradleFragment): FragmentGranularMetadataResolver = resolvers.getOrPut(fragment) {
FragmentGranularMetadataResolver(fragment, lazy {
fun getOrCreate(fragment: GradleKpmFragment): GradleKpmFragmentGranularMetadataResolver = resolvers.getOrPut(fragment) {
GradleKpmFragmentGranularMetadataResolver(fragment, lazy {
fragment.refinesClosure.map { refinesFragment ->
getOrCreate(refinesFragment)
}
@@ -13,30 +13,30 @@ import java.io.File
typealias SourceRoots = Iterable<File>
typealias SourceRootsProvider = Provider<out SourceRoots>
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
* 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) */
open class FragmentSourcesProvider {
open class GradleKpmFragmentSourcesProvider {
protected open fun getSourcesFromFragmentsAsMap(
fragments: Iterable<KpmGradleFragment>
fragments: Iterable<GradleKpmFragment>
): SourceRootsProvidersByFragment =
fragments.associateWith { it.project.provider { it.kotlinSourceRoots } }
open fun getFragmentOwnSources(fragment: KpmGradleFragment): SourceRootsProvider =
open fun getFragmentOwnSources(fragment: GradleKpmFragment): SourceRootsProvider =
getSourcesFromFragmentsAsMap(listOf(fragment)).values.single()
open fun getAllFragmentSourcesAsMap(module: KpmGradleModule): SourceRootsProvidersByFragment =
open fun getAllFragmentSourcesAsMap(module: GradleKpmModule): SourceRootsProvidersByFragment =
getSourcesFromFragmentsAsMap(module.fragments)
open fun getSourcesFromRefinesClosureAsMap(fragment: KpmGradleFragment): SourceRootsProvidersByFragment =
open fun getSourcesFromRefinesClosureAsMap(fragment: GradleKpmFragment): SourceRootsProvidersByFragment =
getSourcesFromFragmentsAsMap(fragment.withRefinesClosure)
open fun getSourcesFromRefinesClosure(fragment: KpmGradleFragment): MultipleSourceRootsProvider =
open fun getSourcesFromRefinesClosure(fragment: GradleKpmFragment): MultipleSourceRootsProvider =
fragment.project.provider { getSourcesFromRefinesClosureAsMap(fragment).values }
open fun getCommonSourcesFromRefinesClosure(fragment: KpmGradleFragment): MultipleSourceRootsProvider {
open fun getCommonSourcesFromRefinesClosure(fragment: GradleKpmFragment): MultipleSourceRootsProvider {
val containingModule = fragment.containingModule
val project = containingModule.project
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
internal fun Project.compilerPluginProviderForMetadata(
fragment: KpmGradleFragment,
fragment: GradleKpmFragment,
compilationData: KotlinCommonFragmentMetadataCompilationData
) = compilerPluginDataProvider(compilationData, fragment::metadataCompilationPluginData)
internal fun Project.compilerPluginProviderForNativeMetadata(
fragment: KpmGradleFragment,
fragment: GradleKpmFragment,
compilationData: KotlinNativeFragmentMetadataCompilationData
) = compilerPluginDataProvider(compilationData, fragment::nativeMetadataCompilationPluginData)
internal fun Project.compilerPluginProviderForPlatformCompilation(
variant: KpmGradleVariant,
variant: GradleKpmVariant,
compilationData: KotlinCompilationData<*>
) = compilerPluginDataProvider(compilationData, variant::platformCompilationPluginData)
@@ -46,7 +46,7 @@ private fun Project.compilerPluginDataProvider(
}.apply { disallowUnsafeRead() }
}
internal class CompilerPluginOptionsBuilder(
private class CompilerPluginOptionsBuilder(
private val project: Project,
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) {
project.pm20Extension.apply {
modules.create(KpmGradleModule.MAIN_MODULE_NAME)
modules.create(KpmGradleModule.TEST_MODULE_NAME)
modules.create(GradleKpmModule.MAIN_MODULE_NAME)
modules.create(GradleKpmModule.TEST_MODULE_NAME)
main { makePublic() }
}
}
private fun setupPublicationForModule(module: KpmGradleModule) {
private fun setupPublicationForModule(module: GradleKpmModule) {
val project = module.project
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")
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) }
val modules: NamedDomainObjectContainer<KpmGradleModule>
val modules: NamedDomainObjectContainer<GradleKpmModule>
get() = project.kpmModules
@Suppress("unused") // DSL function
fun mainAndTest(configure: KpmGradleModule.() -> Unit) {
fun mainAndTest(configure: GradleKpmModule.() -> Unit) {
main(configure)
test(configure)
}
val main: KpmGradleModule
get() = modules.getByName(KpmGradleModule.MAIN_MODULE_NAME)
val main: GradleKpmModule
get() = modules.getByName(GradleKpmModule.MAIN_MODULE_NAME)
val test: KpmGradleModule
get() = modules.getByName(KpmGradleModule.TEST_MODULE_NAME)
val test: GradleKpmModule
get() = modules.getByName(GradleKpmModule.TEST_MODULE_NAME)
fun main(configure: KpmGradleModule.() -> Unit = { }) = main.apply(configure)
fun test(configure: KpmGradleModule.() -> Unit = { }) = test.apply(configure)
fun main(configure: GradleKpmModule.() -> Unit = { }) = main.apply(configure)
fun test(configure: GradleKpmModule.() -> Unit = { }) = test.apply(configure)
@PublishedApi
@JvmName("isAllowCommonizer")
internal fun isAllowCommonizerForIde(@Suppress("UNUSED_PARAMETER") project: Project): Boolean = false
}
val KpmGradleModule.jvm: KpmJvmVariant
get() = fragments.maybeCreate("jvm", KpmJvmVariant::class.java)
val GradleKpmModule.jvm: GradleKpmJvmVariant
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) {
val getOrCreateVariant: KpmGradleModule.() -> KpmJvmVariant = { jvm }
fun KotlinPm20ProjectExtension.jvm(configure: KotlinFragmentSlice<GradleKpmJvmVariant>.() -> Unit) {
val getOrCreateVariant: GradleKpmModule.() -> GradleKpmJvmVariant = { jvm }
mainAndTest { getOrCreateVariant(this) }
val slice = KotlinFragmentSlice(this, getOrCreateVariant)
configure(slice)
}
open class KotlinFragmentSlice<T : KpmGradleFragment>(
open class KotlinFragmentSlice<T : GradleKpmFragment>(
val pm20ProjectExtension: KotlinPm20ProjectExtension,
val getOrCreateFragment: (KpmGradleModule) -> T
val getOrCreateFragment: (GradleKpmModule) -> T
) {
fun inMain(configure: T.() -> Unit) {
pm20ProjectExtension.modules.getByName(KpmGradleModule.MAIN_MODULE_NAME).apply {
pm20ProjectExtension.modules.getByName(GradleKpmModule.MAIN_MODULE_NAME).apply {
getOrCreateFragment(this).configure()
}
}
fun inTest(configure: T.() -> Unit) {
pm20ProjectExtension.modules.getByName(KpmGradleModule.TEST_MODULE_NAME).apply {
pm20ProjectExtension.modules.getByName(GradleKpmModule.TEST_MODULE_NAME).apply {
getOrCreateFragment(this).configure()
}
}
@@ -161,11 +161,11 @@ open class KotlinFragmentSlice<T : KpmGradleFragment>(
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) }
}
fun inModule(module: KpmGradleModule, configure: T.() -> Unit) {
fun inModule(module: GradleKpmModule, configure: T.() -> Unit) {
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
typealias KotlinCommonFragmentFactory = KotlinGradleFragmentFactory<KpmGradleFragmentInternal>
typealias GradleKpmCommonFragmentFactory = GradleKpmFragmentFactory<GradleKpmFragmentInternal>
fun KotlinCommonFragmentFactory(module: KpmGradleModule): KotlinCommonFragmentFactory =
KotlinCommonFragmentFactory(KotlinCommonFragmentInstantiator(module))
fun GradleKpmCommonFragmentFactory(module: GradleKpmModule): GradleKpmCommonFragmentFactory =
GradleKpmCommonFragmentFactory(GradleKpmCommonFragmentInstantiator(module))
fun KotlinCommonFragmentFactory(
commonFragmentInstantiator: KotlinCommonFragmentInstantiator,
commonFragmentConfigurator: KotlinCommonFragmentConfigurator = KotlinCommonFragmentConfigurator()
): KotlinGradleFragmentFactory<KpmGradleFragmentInternal> = KotlinGradleFragmentFactory(
fun GradleKpmCommonFragmentFactory(
commonFragmentInstantiator: GradleKpmCommonFragmentInstantiator,
commonFragmentConfigurator: GradleKpmCommonFragmentConfigurator = GradleKpmCommonFragmentConfigurator()
): GradleKpmFragmentFactory<GradleKpmFragmentInternal> = GradleKpmFragmentFactory(
fragmentInstantiator = commonFragmentInstantiator,
fragmentConfigurator = commonFragmentConfigurator
)
class KotlinCommonFragmentInstantiator(
private val module: KpmGradleModule,
private val dependencyConfigurationsFactory: KotlinFragmentDependencyConfigurationsFactory =
DefaultKotlinFragmentDependencyConfigurationsFactory
) : KotlinGradleFragmentFactory.FragmentInstantiator<KpmGradleFragmentInternal> {
override fun create(name: String): KpmGradleFragmentInternal {
class GradleKpmCommonFragmentInstantiator(
private val module: GradleKpmModule,
private val dependencyConfigurationsFactory: GradleKpmFragmentDependencyConfigurationsFactory =
GradleKpmDefaultFragmentDependencyConfigurationsFactory
) : GradleKpmFragmentFactory.FragmentInstantiator<GradleKpmFragmentInternal> {
override fun create(name: String): GradleKpmFragmentInternal {
val names = FragmentNameDisambiguation(module, name)
return KpmGradleFragmentInternal(module, name, dependencyConfigurationsFactory.create(module, names))
return GradleKpmFragmentInternal(module, name, dependencyConfigurationsFactory.create(module, names))
}
}
class KotlinCommonFragmentConfigurator(
private val sourceDirectoriesSetup: KotlinSourceDirectoriesConfigurator<KpmGradleFragmentInternal> =
DefaultKotlinSourceDirectoriesConfigurator
) : KotlinGradleFragmentFactory.FragmentConfigurator<KpmGradleFragmentInternal> {
override fun configure(fragment: KpmGradleFragmentInternal) {
class GradleKpmCommonFragmentConfigurator(
private val sourceDirectoriesSetup: GradleKpmSourceDirectoriesConfigurator<GradleKpmFragmentInternal> =
GradleKpmDefaultSourceDirectoriesConfigurator
) : GradleKpmFragmentFactory.FragmentConfigurator<GradleKpmFragmentInternal> {
override fun configure(fragment: GradleKpmFragmentInternal) {
sourceDirectoriesSetup.configure(fragment)
}
}
@@ -7,24 +7,22 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.tasks.TaskProvider
interface KotlinCompileTaskConfigurator<in T : KpmGradleVariant> {
interface GradleKpmCompileTaskConfigurator<in T : GradleKpmVariant> {
fun registerCompileTasks(variant: T): TaskProvider<*>
}
object KotlinJvmCompileTaskConfigurator : KotlinCompileTaskConfigurator<KpmJvmVariant> {
override fun registerCompileTasks(variant: KpmJvmVariant): TaskProvider<*> {
object GradleKpmJvmCompileTaskConfigurator : GradleKpmCompileTaskConfigurator<GradleKpmJvmVariant> {
override fun registerCompileTasks(variant: GradleKpmJvmVariant): TaskProvider<*> {
val compilationData = variant.compilationData
LifecycleTasksManager(variant.project).registerClassesTask(compilationData)
return KotlinCompilationTaskConfigurator(variant.project).createKotlinJvmCompilationTask(variant, compilationData)
return GradleKpmCompilationTaskConfigurator(variant.project).createKotlinJvmCompilationTask(variant, compilationData)
}
}
object KotlinNativeCompileTaskConfigurator : KotlinCompileTaskConfigurator<KpmNativeVariantInternal> {
override fun registerCompileTasks(variant: KpmNativeVariantInternal): TaskProvider<*> {
object GradleKpmNativeCompileTaskConfigurator : GradleKpmCompileTaskConfigurator<GradleKpmNativeVariantInternal> {
override fun registerCompileTasks(variant: GradleKpmNativeVariantInternal): TaskProvider<*> {
val compilationData = variant.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.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
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.pm20.util.allDependencyModules
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.disambiguateName
import org.jetbrains.kotlin.gradle.utils.filesProvider
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
get() = lowerCamelCaseName("compile", compilationPurpose.takeIf { it != "main" }, "Kotlin", compilationClassifier)
@@ -26,7 +26,7 @@ interface KotlinVariantCompilationDataInternal<T : KotlinCommonOptions> : Kotlin
get() = owner.disambiguateName("classes")
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>
get() {
@@ -54,21 +54,21 @@ interface KotlinVariantCompilationDataInternal<T : KotlinCommonOptions> : Kotlin
override val moduleName: String
get() = // TODO accurate module names that don't rely on all variants having a main counterpart
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
get() = owner.ownModuleName()
private fun resolveFriendVariants(): Iterable<KpmGradleVariant> {
val moduleResolver = KpmGradleModuleDependencyResolver.getForCurrentBuild(project)
val variantResolver = GradleModuleVariantResolver.getForCurrentBuild(project)
val dependencyGraphResolver = KpmGradleDependencyGraphResolver(moduleResolver)
private fun resolveFriendVariants(): Iterable<GradleKpmVariant> {
val moduleResolver = GradleKpmModuleDependencyResolver.getForCurrentBuild(project)
val variantResolver = KpmGradleModuleVariantResolver.getForCurrentBuild(project)
val dependencyGraphResolver = GradleKpmDependencyGraphResolver(moduleResolver)
val friendModules =
((dependencyGraphResolver.resolveDependencyGraph(owner.containingModule) as? KpmGradleDependencyGraph)
((dependencyGraphResolver.resolveDependencyGraph(owner.containingModule) as? GradleKpmDependencyGraph)
?: error("Failed to resolve dependencies of ${owner.containingModule}"))
.allDependencyModules
.filterIsInstance<KpmGradleModule>()
.filterIsInstance<GradleKpmModule>()
.filter { dependencyModule ->
// the module comes from the same Gradle project // todo: extend to other friends once supported
dependencyModule.project == owner.containingModule.project
@@ -77,12 +77,12 @@ interface KotlinVariantCompilationDataInternal<T : KotlinCommonOptions> : Kotlin
return friendModules
.map { friendModule -> variantResolver.getChosenVariant(owner, friendModule) }
// also, important to check that the owner variant really requests this module:
.filterIsInstance<VariantResolution.VariantMatch>()
.mapNotNull { variantMatch -> variantMatch.chosenVariant as? KpmGradleVariant }
.filterIsInstance<KpmVariantResolution.KpmVariantMatch>()
.mapNotNull { variantMatch -> variantMatch.chosenVariant as? GradleKpmVariant }
}
}
fun KotlinCompilationData<*>.isMainCompilationData(): Boolean = when (this) {
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.KotlinTasksProvider
open class KotlinCompilationTaskConfigurator(
open class GradleKpmCompilationTaskConfigurator(
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)
open fun getCommonSourcesForFragmentCompilation(fragment: KpmGradleFragment): MultipleSourceRootsProvider =
open fun getCommonSourcesForFragmentCompilation(fragment: GradleKpmFragment): MultipleSourceRootsProvider =
fragmentSourcesProvider.getCommonSourcesFromRefinesClosure(fragment)
fun createKotlinJvmCompilationTask(
variant: KpmGradleVariant,
variant: GradleKpmVariant,
compilationData: KotlinCompilationData<*>
): TaskProvider<out KotlinCompile> {
Kotlin2JvmSourceSetProcessor(KotlinTasksProvider(), compilationData).run()
@@ -46,7 +46,7 @@ open class KotlinCompilationTaskConfigurator(
}
protected fun createKotlinNativeCompilationTask(
fragment: KpmGradleFragment,
fragment: GradleKpmFragment,
compilationData: KotlinNativeCompilationData<*>,
configure: KotlinNativeCompile.() -> Unit
): TaskProvider<KotlinNativeCompile> {
@@ -65,7 +65,7 @@ open class KotlinCompilationTaskConfigurator(
}
fun createKotlinNativeCompilationTask(
variant: KpmGradleVariant,
variant: GradleKpmVariant,
compilationData: KotlinNativeCompilationData<*>
): TaskProvider<KotlinNativeCompile> = createKotlinNativeCompilationTask(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.
*/
val KotlinFragmentCompilationOutputsJarArtifact = FragmentArtifacts<KpmGradleVariant> {
val GradleKpmCompilationOutputsJarArtifact = GradleKpmConfigurationArtifactsSetup<GradleKpmVariant> {
val jar = project.locateOrRegisterTask<Jar>(fragment.outputsJarTaskName) {
it.from(fragment.compilationOutputs.allOutputs)
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)
}
internal val KpmGradleVariant.outputsJarTaskName: String
internal val GradleKpmVariant.outputsJarTaskName: String
get() = FragmentNameDisambiguationOmittingMain(containingModule, name).disambiguateName("jar")
@@ -5,15 +5,15 @@
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 {
fun create(module: KpmGradleModule, names: KotlinNameDisambiguation): KotlinFragmentDependencyConfigurations
interface GradleKpmFragmentDependencyConfigurationsFactory {
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 apiConfiguration = configurations.maybeCreate(names.disambiguateName("api"))
val implementationConfiguration = configurations.maybeCreate(names.disambiguateName("implementation"))
@@ -40,7 +40,7 @@ object DefaultKotlinFragmentDependencyConfigurationsFactory : KotlinFragmentDepe
transitiveImplementationConfiguration.extendsFrom(implementationConfiguration)
transitiveRuntimeOnlyConfiguration.extendsFrom(runtimeOnlyConfiguration)
return KotlinFragmentDependencyConfigurations.create(
return GradleKpmFragmentDependencyConfigurations.create(
apiConfiguration = apiConfiguration,
implementationConfiguration = implementationConfiguration,
compileOnlyConfiguration = compileOnlyConfiguration,
@@ -17,7 +17,7 @@ import org.jetbrains.kotlin.library.KLIB_FILE_EXTENSION
* 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 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.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.ComputedCapability
val KotlinFragmentModuleCapability = FragmentCapabilities<KpmGradleFragment> {
capability(fragment.containingModule.moduleCapability ?: return@FragmentCapabilities)
val GradleKpmModuleCapability = GradleKpmConfigurationCapabilitiesSetup<GradleKpmFragment> {
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)
}
internal val KpmGradleModule.moduleCapability: Capability?
internal val GradleKpmModule.moduleCapability: Capability?
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.ConfigurationVariant
/* Internal abbreviation */
internal typealias FragmentArtifacts<T> = KotlinGradleFragmentConfigurationArtifacts<T>
interface KotlinGradleFragmentConfigurationArtifacts<in T : KpmGradleFragment> {
fun addArtifacts(outgoing: ConfigurationPublications, fragment: T)
interface GradleKpmConfigurationArtifactsSetup<in T : GradleKpmFragment> {
fun setupArtifacts(outgoing: ConfigurationPublications, fragment: T)
object None : KotlinGradleFragmentConfigurationArtifacts<KpmGradleFragment> {
override fun addArtifacts(outgoing: ConfigurationPublications, fragment: KpmGradleFragment) = Unit
object None : GradleKpmConfigurationArtifactsSetup<GradleKpmFragment> {
override fun setupArtifacts(outgoing: ConfigurationPublications, fragment: GradleKpmFragment) = Unit
}
}
class KotlinGradleFragmentConfigurationArtifactsContext<T : KpmGradleFragment> internal constructor(
class GradleKpmConfigurationArtifactsSetupContext<T : GradleKpmFragment> internal constructor(
internal val outgoing: ConfigurationPublications,
val fragment: T
) {
@@ -40,40 +38,43 @@ class KotlinGradleFragmentConfigurationArtifactsContext<T : KpmGradleFragment> i
}
@Suppress("FunctionName")
fun <T : KpmGradleFragment> FragmentArtifacts(
addArtifacts: KotlinGradleFragmentConfigurationArtifactsContext<T>.() -> Unit
): KotlinGradleFragmentConfigurationArtifacts<T> {
return object : KotlinGradleFragmentConfigurationArtifacts<T> {
override fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) {
val context = KotlinGradleFragmentConfigurationArtifactsContext(outgoing, fragment)
fun <T : GradleKpmFragment> GradleKpmConfigurationArtifactsSetup(
addArtifacts: GradleKpmConfigurationArtifactsSetupContext<T>.() -> Unit
): GradleKpmConfigurationArtifactsSetup<T> {
return object : GradleKpmConfigurationArtifactsSetup<T> {
override fun setupArtifacts(outgoing: ConfigurationPublications, fragment: T) {
val context = GradleKpmConfigurationArtifactsSetupContext(outgoing, fragment)
context.addArtifacts()
}
}
}
operator fun <T : KpmGradleFragment> FragmentArtifacts<T>.plus(other: FragmentArtifacts<T>): FragmentArtifacts<T> {
if (this === KotlinGradleFragmentConfigurationArtifacts.None) return other
if (other === KotlinGradleFragmentConfigurationArtifacts.None) return this
operator fun <T : GradleKpmFragment> GradleKpmConfigurationArtifactsSetup<T>.plus(
other: GradleKpmConfigurationArtifactsSetup<T>
): GradleKpmConfigurationArtifactsSetup<T> {
if (this === GradleKpmConfigurationArtifactsSetup.None) return other
if (other === GradleKpmConfigurationArtifactsSetup.None) return this
if (this is CompositeFragmentArtifacts && other is CompositeFragmentArtifacts) {
return CompositeFragmentArtifacts(this.children + other.children)
if (this is CompositeFragmentConfigurationArtifactsSetup && other is CompositeFragmentConfigurationArtifactsSetup) {
return CompositeFragmentConfigurationArtifactsSetup(this.children + other.children)
}
if (this is CompositeFragmentArtifacts) {
return CompositeFragmentArtifacts(this.children + other)
if (this is CompositeFragmentConfigurationArtifactsSetup) {
return CompositeFragmentConfigurationArtifactsSetup(this.children + other)
}
if (other is CompositeFragmentArtifacts) {
return CompositeFragmentArtifacts(listOf(this) + other.children)
if (other is CompositeFragmentConfigurationArtifactsSetup) {
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>>) :
FragmentArtifacts<T> {
internal class CompositeFragmentConfigurationArtifactsSetup<in T : GradleKpmFragment>(
val children: List<GradleKpmConfigurationArtifactsSetup<T>>
) : GradleKpmConfigurationArtifactsSetup<T> {
override fun addArtifacts(outgoing: ConfigurationPublications, fragment: T) {
children.forEach { child -> child.addArtifacts(outgoing, fragment) }
override fun setupArtifacts(outgoing: ConfigurationPublications, fragment: T) {
children.forEach { child -> child.setupArtifacts(outgoing, fragment) }
}
}
@@ -11,18 +11,17 @@ import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeContainer
/* 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> {
override fun setAttributes(attributes: AttributeContainer, fragment: KpmGradleFragment) = Unit
object None : GradleKpmConfigurationAttributesSetup<GradleKpmFragment> {
override fun setupAttributes(attributes: AttributeContainer, fragment: GradleKpmFragment) = Unit
}
}
class KotlinGradleFragmentConfigurationAttributesContext<T : KpmGradleFragment> internal constructor(
class GradleKpmConfigurationAttributesSetupContext<T : GradleKpmFragment> internal constructor(
internal val attributes: AttributeContainer,
val fragment: T,
) : 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)) }
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)
}
}
@Suppress("FunctionName")
fun <T : KpmGradleFragment> FragmentAttributes(
setAttributes: KotlinGradleFragmentConfigurationAttributesContext<T>.() -> Unit
): KotlinGradleFragmentConfigurationAttributes<T> {
return object : KotlinGradleFragmentConfigurationAttributes<T> {
override fun setAttributes(attributes: AttributeContainer, fragment: T) {
val context = KotlinGradleFragmentConfigurationAttributesContext(attributes, fragment)
fun <T : GradleKpmFragment> GradleKpmConfigurationAttributesSetup(
setAttributes: GradleKpmConfigurationAttributesSetupContext<T>.() -> Unit
): GradleKpmConfigurationAttributesSetup<T> {
return object : GradleKpmConfigurationAttributesSetup<T> {
override fun setupAttributes(attributes: AttributeContainer, fragment: T) {
val context = GradleKpmConfigurationAttributesSetupContext(attributes, fragment)
context.setAttributes()
}
}
}
fun <T : KpmGradleFragment> AttributeContainer.apply(
attributes: KotlinGradleFragmentConfigurationAttributes<T>, fragment: T
fun <T : GradleKpmFragment> AttributeContainer.apply(
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> {
if (this === KotlinGradleFragmentConfigurationAttributes.None) return other
if (other === KotlinGradleFragmentConfigurationAttributes.None) return this
operator fun <T : GradleKpmFragment> GradleKpmConfigurationAttributesSetup<T>.plus(other: GradleKpmConfigurationAttributesSetup<T>): GradleKpmConfigurationAttributesSetup<T> {
if (this === GradleKpmConfigurationAttributesSetup.None) return other
if (other === GradleKpmConfigurationAttributesSetup.None) return this
if (this is CompositeFragmentAttributes && other is CompositeFragmentAttributes) {
return CompositeFragmentAttributes(this.children + other.children)
if (this is GradleKpmCompositeConfigurationAttributesSetup && other is GradleKpmCompositeConfigurationAttributesSetup) {
return GradleKpmCompositeConfigurationAttributesSetup(this.children + other.children)
}
if (this is CompositeFragmentAttributes) {
return CompositeFragmentAttributes(this.children + other)
if (this is GradleKpmCompositeConfigurationAttributesSetup) {
return GradleKpmCompositeConfigurationAttributesSetup(this.children + other)
}
if (other is CompositeFragmentAttributes) {
return CompositeFragmentAttributes(listOf(this) + other.children)
if (other is GradleKpmCompositeConfigurationAttributesSetup) {
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>>) :
FragmentAttributes<T> {
override fun setAttributes(attributes: AttributeContainer, fragment: T) {
children.forEach { child -> child.setAttributes(attributes, fragment) }
internal class GradleKpmCompositeConfigurationAttributesSetup<in T : GradleKpmFragment>(val children: List<GradleKpmConfigurationAttributesSetup<T>>) :
GradleKpmConfigurationAttributesSetup<T> {
override fun setupAttributes(attributes: AttributeContainer, fragment: T) {
children.forEach { child -> child.setupAttributes(attributes, fragment) }
}
}
@@ -8,78 +8,72 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationPublications
import org.gradle.api.capabilities.Capability
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentConfigurationCapabilities.CapabilitiesContainer
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmConfigurationCapabilitiesSetup.CapabilitiesContainer
/* Internal abbreviation */
internal typealias FragmentCapabilities<T> = KotlinGradleFragmentConfigurationCapabilities<T>
interface KotlinGradleFragmentConfigurationCapabilities<in T : KpmGradleFragment> {
interface GradleKpmConfigurationCapabilitiesSetup<in T : GradleKpmFragment> {
interface CapabilitiesContainer {
fun capability(notation: Any)
}
fun setCapabilities(container: CapabilitiesContainer, fragment: T)
object None : KotlinGradleFragmentConfigurationCapabilities<KpmGradleFragment> {
override fun setCapabilities(container: CapabilitiesContainer, fragment: KpmGradleFragment) = Unit
object None : GradleKpmConfigurationCapabilitiesSetup<GradleKpmFragment> {
override fun setCapabilities(container: CapabilitiesContainer, fragment: GradleKpmFragment) = Unit
}
}
fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationCapabilities<T>.setCapabilities(
fun <T : GradleKpmFragment> GradleKpmConfigurationCapabilitiesSetup<T>.setCapabilities(
publications: ConfigurationPublications, fragment: T
) = setCapabilities(CapabilitiesContainer(publications), fragment)
fun CapabilitiesContainer(configuration: ConfigurationPublications): CapabilitiesContainer =
CapabilitiesContainerImpl(configuration)
fun CapabilitiesContainer(configuration: Configuration): CapabilitiesContainer =
CapabilitiesContainerImpl(configuration.outgoing)
private class CapabilitiesContainerImpl(
private val publications: ConfigurationPublications
) : CapabilitiesContainer {
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
) : CapabilitiesContainer by container {
val project: Project get() = fragment.project
}
fun <T : KpmGradleFragment> FragmentCapabilities(
setCapabilities: KotlinGradleFragmentConfigurationCapabilitiesContext<T>.() -> Unit
): KotlinGradleFragmentConfigurationCapabilities<T> = object : KotlinGradleFragmentConfigurationCapabilities<T> {
fun <T : GradleKpmFragment> GradleKpmConfigurationCapabilitiesSetup(
setCapabilities: GradleKpmConfigurationCapabilitiesSetupContext<T>.() -> Unit
): GradleKpmConfigurationCapabilitiesSetup<T> = object : GradleKpmConfigurationCapabilitiesSetup<T> {
override fun setCapabilities(container: CapabilitiesContainer, fragment: T) {
val context = KotlinGradleFragmentConfigurationCapabilitiesContext(container, fragment)
val context = GradleKpmConfigurationCapabilitiesSetupContext(container, fragment)
context.setCapabilities()
}
}
operator fun <T : KpmGradleFragment> FragmentCapabilities<T>.plus(other: FragmentCapabilities<T>): FragmentCapabilities<T> {
if (this === KotlinGradleFragmentConfigurationCapabilities.None) return other
if (other === KotlinGradleFragmentConfigurationCapabilities.None) return this
operator fun <T : GradleKpmFragment> GradleKpmConfigurationCapabilitiesSetup<T>.plus(
other: GradleKpmConfigurationCapabilitiesSetup<T>
): GradleKpmConfigurationCapabilitiesSetup<T> {
if (this === GradleKpmConfigurationCapabilitiesSetup.None) return other
if (other === GradleKpmConfigurationCapabilitiesSetup.None) return this
if (this is CompositeFragmentCapabilities && other is CompositeFragmentCapabilities) {
return CompositeFragmentCapabilities(this.children + other.children)
if (this is CompositeKpmCapabilitiesSetup && other is CompositeKpmCapabilitiesSetup) {
return CompositeKpmCapabilitiesSetup(this.children + other.children)
}
if (this is CompositeFragmentCapabilities) {
return CompositeFragmentCapabilities(this.children + other)
if (this is CompositeKpmCapabilitiesSetup) {
return CompositeKpmCapabilitiesSetup(this.children + other)
}
if (other is CompositeFragmentCapabilities) {
return CompositeFragmentCapabilities(listOf(this) + other.children)
if (other is CompositeKpmCapabilitiesSetup) {
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>>) :
FragmentCapabilities<T> {
internal class CompositeKpmCapabilitiesSetup<in T : GradleKpmFragment>(val children: List<GradleKpmConfigurationCapabilitiesSetup<T>>) :
GradleKpmConfigurationCapabilitiesSetup<T> {
override fun setCapabilities(container: CapabilitiesContainer, fragment: T) {
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.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 typealias ConfigurationDefinition<T> = KotlinGradleFragmentConfigurationDefinition<T>
data class KotlinGradleFragmentConfigurationDefinition<in T : KpmGradleFragment>(
val provider: KotlinGradleFragmentConfigurationProvider,
val attributes: KotlinGradleFragmentConfigurationAttributes<T> = KotlinGradleFragmentConfigurationAttributes.None,
val artifacts: KotlinGradleFragmentConfigurationArtifacts<T> = KotlinGradleFragmentConfigurationArtifacts.None,
val relations: KotlinGradleFragmentConfigurationRelation = KotlinGradleFragmentConfigurationRelation.None,
data class GradleKpmConfigurationSetup<in T : GradleKpmFragment>(
val provider: GradleKpmConfigurationProvider,
val attributes: GradleKpmConfigurationAttributesSetup<T> = GradleKpmConfigurationAttributesSetup.None,
val artifacts: GradleKpmConfigurationArtifactsSetup<T> = GradleKpmConfigurationArtifactsSetup.None,
val relations: GradleKpmConfigurationRelationSetup = GradleKpmConfigurationRelationSetup.None,
@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 module: KpmGradleModule
val dependencies: KotlinFragmentDependencyConfigurations
val module: GradleKpmModule
val dependencies: GradleKpmFragmentDependencyConfigurations
}
internal class KotlinGradleFragmentConfigurationContextImpl(
override val module: KpmGradleModule,
override val dependencies: KotlinFragmentDependencyConfigurations,
names: KotlinNameDisambiguation
) : KotlinGradleFragmentConfigurationContext, KotlinNameDisambiguation by names
internal class GradleKpmFragmentConfigureContextImpl(
override val module: GradleKpmModule,
override val dependencies: GradleKpmFragmentDependencyConfigurations,
names: GradleKpmNameDisambiguation
) : GradleKpmFragmentConfigureContext, GradleKpmNameDisambiguation by names
fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.withConfigurationProvider(
provider: KotlinGradleFragmentConfigurationContext.() -> Configuration
) = copy(provider = ConfigurationProvider(provider))
fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.withConfigurationProvider(
provider: GradleKpmFragmentConfigureContext.() -> Configuration
) = copy(provider = GradleKpmConfigurationProvider(provider))
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentAttributes<T>):
KotlinGradleFragmentConfigurationDefinition<T> = copy(attributes = attributes + other)
operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationAttributesSetup<T>):
GradleKpmConfigurationSetup<T> = copy(attributes = attributes + other)
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentArtifacts<T>):
KotlinGradleFragmentConfigurationDefinition<T> = copy(artifacts = artifacts + other)
operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationArtifactsSetup<T>):
GradleKpmConfigurationSetup<T> = copy(artifacts = artifacts + other)
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentConfigurationRelation):
KotlinGradleFragmentConfigurationDefinition<T> = copy(relations = relations + other)
operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationRelationSetup):
GradleKpmConfigurationSetup<T> = copy(relations = relations + other)
@AdvancedKotlinGradlePluginApi
operator fun <T : KpmGradleFragment> KotlinGradleFragmentConfigurationDefinition<T>.plus(other: FragmentCapabilities<T>):
KotlinGradleFragmentConfigurationDefinition<T> = copy(capabilities = capabilities + other)
operator fun <T : GradleKpmFragment> GradleKpmConfigurationSetup<T>.plus(other: GradleKpmConfigurationCapabilitiesSetup<T>):
GradleKpmConfigurationSetup<T> = copy(capabilities = capabilities + other)
@@ -9,11 +9,11 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration
interface KotlinGradleFragmentConfigurationProvider {
fun getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration
interface GradleKpmConfigurationProvider {
fun getConfiguration(context: GradleKpmFragmentConfigureContext): Configuration
}
fun ConfigurationProvider(provider: KotlinGradleFragmentConfigurationContext.() -> Configuration):
KotlinGradleFragmentConfigurationProvider = object : KotlinGradleFragmentConfigurationProvider {
override fun getConfiguration(context: KotlinGradleFragmentConfigurationContext): Configuration = context.provider()
fun GradleKpmConfigurationProvider(provider: GradleKpmFragmentConfigureContext.() -> Configuration):
GradleKpmConfigurationProvider = object : GradleKpmConfigurationProvider {
override fun getConfiguration(context: GradleKpmFragmentConfigureContext): Configuration = context.provider()
}
@@ -8,60 +8,57 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ConfigurationPublications
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation
/* Internal abbreviation */
internal typealias FragmentConfigurationRelation = KotlinGradleFragmentConfigurationRelation
interface KotlinGradleFragmentConfigurationRelation {
fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext)
interface GradleKpmConfigurationRelationSetup {
fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext)
object None : KotlinGradleFragmentConfigurationRelation {
override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) = Unit
object None : GradleKpmConfigurationRelationSetup {
override fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext) = Unit
}
}
operator fun FragmentConfigurationRelation.plus(other: FragmentConfigurationRelation): FragmentConfigurationRelation {
if (this === KotlinGradleFragmentConfigurationRelation.None) return other
if (other === KotlinGradleFragmentConfigurationRelation.None) return this
operator fun GradleKpmConfigurationRelationSetup.plus(other: GradleKpmConfigurationRelationSetup): GradleKpmConfigurationRelationSetup {
if (this === GradleKpmConfigurationRelationSetup.None) return other
if (other === GradleKpmConfigurationRelationSetup.None) return this
if (this is CompositeFragmentConfigurationRelation && other is CompositeFragmentConfigurationRelation) {
return CompositeFragmentConfigurationRelation(this.children + other.children)
if (this is CompositeKpmConfigurationRelationSetup && other is CompositeKpmConfigurationRelationSetup) {
return CompositeKpmConfigurationRelationSetup(this.children + other.children)
}
if (this is CompositeFragmentConfigurationRelation) {
return CompositeFragmentConfigurationRelation(this.children + other)
if (this is CompositeKpmConfigurationRelationSetup) {
return CompositeKpmConfigurationRelationSetup(this.children + other)
}
if (other is CompositeFragmentConfigurationRelation) {
return CompositeFragmentConfigurationRelation(listOf(this) + other.children)
if (other is CompositeKpmConfigurationRelationSetup) {
return CompositeKpmConfigurationRelationSetup(listOf(this) + other.children)
}
return CompositeFragmentConfigurationRelation(listOf(this, other))
return CompositeKpmConfigurationRelationSetup(listOf(this, other))
}
internal class CompositeFragmentConfigurationRelation(val children: List<FragmentConfigurationRelation>) :
FragmentConfigurationRelation {
internal class CompositeKpmConfigurationRelationSetup(val children: List<GradleKpmConfigurationRelationSetup>) :
GradleKpmConfigurationRelationSetup {
override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) {
children.forEach { child -> child.setExtendsFrom(configuration, context) }
override fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext) {
children.forEach { child -> child.setupExtendsFromRelations(configuration, context) }
}
}
class KotlinGradleFragmentConfigurationRelationContext internal constructor(
class GradleKpmFragmentConfigureRelationContext internal constructor(
val configuration: Configuration,
context: KotlinGradleFragmentConfigurationContext
) : KotlinGradleFragmentConfigurationContext by context {
context: GradleKpmFragmentConfigureContext
) : GradleKpmFragmentConfigureContext by context {
fun extendsFrom(configuration: Configuration) = this.configuration.extendsFrom(configuration)
fun extendsFrom(configuration: String) = project.addExtendsFromRelation(this.configuration.name, configuration)
}
fun FragmentConfigurationRelation(
setExtendsFrom: KotlinGradleFragmentConfigurationRelationContext.() -> Unit
): KotlinGradleFragmentConfigurationRelation = object : KotlinGradleFragmentConfigurationRelation {
override fun setExtendsFrom(configuration: Configuration, context: KotlinGradleFragmentConfigurationContext) {
val relationContext = KotlinGradleFragmentConfigurationRelationContext(configuration, context)
fun GradleKpmConfigurationRelationSetup(
setExtendsFrom: GradleKpmFragmentConfigureRelationContext.() -> Unit
): GradleKpmConfigurationRelationSetup = object : GradleKpmConfigurationRelationSetup {
override fun setupExtendsFromRelations(configuration: Configuration, context: GradleKpmFragmentConfigureContext) {
val relationContext = GradleKpmFragmentConfigureRelationContext(configuration, context)
relationContext.setExtendsFrom()
}
}
@@ -7,11 +7,11 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.NamedDomainObjectFactory
import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.FragmentConfigurator
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.FragmentInstantiator
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.GradleKpmFragmentFactory.FragmentConfigurator
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:
*
* [FragmentInstantiator]:
@@ -26,22 +26,22 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinGradleFragmentFactory.F
* - Setting up additional Gradle tasks
* - Setting up publication
*/
class KotlinGradleFragmentFactory<T : KpmGradleFragment>(
class GradleKpmFragmentFactory<T : GradleKpmFragment>(
private val fragmentInstantiator: FragmentInstantiator<T>,
private val fragmentConfigurator: FragmentConfigurator<T>
) : NamedDomainObjectFactory<T> {
/**
* @see KotlinGradleFragmentFactory
* @see GradleKpmFragmentFactory
*/
interface FragmentInstantiator<out T : KpmGradleFragment> {
interface FragmentInstantiator<out T : GradleKpmFragment> {
fun create(name: String): T
}
/**
* @see KotlinGradleFragmentFactory
* @see GradleKpmFragmentFactory
*/
interface FragmentConfigurator<in T : KpmGradleFragment> {
interface FragmentConfigurator<in T : GradleKpmFragment> {
fun configure(fragment: T)
}
@@ -50,10 +50,10 @@ class KotlinGradleFragmentFactory<T : KpmGradleFragment>(
}
}
internal fun <T : KpmGradleFragment> Configuration.configure(
definition: KotlinGradleFragmentConfigurationDefinition<T>, fragment: T
internal fun <T : GradleKpmFragment> Configuration.configure(
definition: GradleKpmConfigurationSetup<T>, fragment: T
) {
definition.attributes.setAttributes(attributes, fragment)
definition.artifacts.addArtifacts(outgoing, fragment)
definition.attributes.setupAttributes(attributes, fragment)
definition.artifacts.setupArtifacts(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.NamedDomainObjectSet
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.project.model.*
import org.jetbrains.kotlin.project.model.utils.variantsContainingFragment
import javax.inject.Inject
open class KpmGradleModuleInternal(
open class GradleKpmModuleInternal(
final override val project: Project,
final override val moduleClassifier: String?
) : KpmGradleModule {
) : GradleKpmModule {
@Inject
constructor(project: Project, moduleName: CharSequence) : this(
project,
moduleName.takeIf { it != KpmGradleModule.MAIN_MODULE_NAME }?.toString()
moduleName.takeIf { it != GradleKpmModule.MAIN_MODULE_NAME }?.toString()
)
override val moduleIdentifier: KpmModuleIdentifier =
KpmLocalModuleIdentifier(project.currentBuildId().name, project.path, moduleClassifier)
override val fragments: ExtensiblePolymorphicDomainObjectContainer<KpmGradleFragment> =
project.objects.polymorphicDomainObjectContainer(KpmGradleFragment::class.java)
override val fragments: ExtensiblePolymorphicDomainObjectContainer<GradleKpmFragment> =
project.objects.polymorphicDomainObjectContainer(GradleKpmFragment::class.java)
// TODO DSL & build script model: find a way to create a flexible typed view on fragments?
override val variants: NamedDomainObjectSet<KpmGradleVariant> by lazy {
fragments.withType(KpmGradleVariant::class.java)
override val variants: NamedDomainObjectSet<GradleKpmVariant> by lazy {
fragments.withType(GradleKpmVariant::class.java)
}
override val plugins: Set<KpmCompilerPlugin> by lazy {
@@ -70,14 +71,14 @@ open class KpmGradleModuleInternal(
override fun toString(): String = "$moduleIdentifier (Gradle)"
}
internal val KpmGradleModule.resolvableMetadataConfigurationName: String
internal val GradleKpmModule.resolvableMetadataConfigurationName: String
get() = lowerCamelCaseName(name, "DependenciesMetadata")
internal val KpmGradleModule.isMain
internal val GradleKpmModule.isMain
get() = moduleIdentifier.moduleClassifier == null
internal fun KpmGradleModule.disambiguateName(simpleName: String) =
internal fun GradleKpmModule.disambiguateName(simpleName: String) =
lowerCamelCaseName(moduleClassifier, simpleName)
internal fun KpmGradleModule.variantsContainingFragment(fragment: KpmFragment): Iterable<KpmGradleVariant> =
(this as KpmModule).variantsContainingFragment(fragment).onEach { it as KpmGradleVariant } as Iterable<KpmGradleVariant>
internal fun GradleKpmModule.variantsContainingFragment(fragment: KpmFragment): Iterable<GradleKpmVariant> =
(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.Project
open class KotlinGradleModuleFactory(private val project: Project) : NamedDomainObjectFactory<KpmGradleModule> {
override fun create(name: String): KpmGradleModule {
val result = project.objects.newInstance(KpmGradleModuleInternal::class.java, project, name)
open class GradleKpmModuleFactory(private val project: Project) : NamedDomainObjectFactory<GradleKpmModule> {
override fun create(name: String): GradleKpmModule {
val result = project.objects.newInstance(GradleKpmModuleInternal::class.java, project, name)
registerFragmentFactory(result)
registerDefaultCommonFragment(result)
addDefaultDependencyOnMainModule(result)
@@ -18,29 +18,29 @@ open class KotlinGradleModuleFactory(private val project: Project) : NamedDomain
return result
}
protected open fun registerDefaultCommonFragment(module: KpmGradleModule) {
module.fragments.register(KpmGradleFragment.COMMON_FRAGMENT_NAME, KpmGradleFragment::class.java)
protected open fun registerDefaultCommonFragment(module: GradleKpmModule) {
module.fragments.register(GradleKpmFragment.COMMON_FRAGMENT_NAME, GradleKpmFragment::class.java)
}
protected open fun addDefaultRefinementDependencyOnCommon(module: KpmGradleModule) {
module.fragments.matching { it.name != KpmGradleFragment.COMMON_FRAGMENT_NAME }.all {
it.refines(module.fragments.named(KpmGradleFragment.COMMON_FRAGMENT_NAME))
protected open fun addDefaultRefinementDependencyOnCommon(module: GradleKpmModule) {
module.fragments.matching { it.name != GradleKpmFragment.COMMON_FRAGMENT_NAME }.all {
it.refines(module.fragments.named(GradleKpmFragment.COMMON_FRAGMENT_NAME))
}
}
protected open fun addDefaultDependencyOnMainModule(module: KpmGradleModule) {
if (module.name != KpmGradleModule.MAIN_MODULE_NAME) {
protected open fun addDefaultDependencyOnMainModule(module: GradleKpmModule) {
if (module.name != GradleKpmModule.MAIN_MODULE_NAME) {
module.fragments
.matching { it.fragmentName == KpmGradleFragment.COMMON_FRAGMENT_NAME }
.matching { it.fragmentName == GradleKpmFragment.COMMON_FRAGMENT_NAME }
.configureEach { commonFragment ->
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) {
module.fragments.registerFactory(KpmGradleFragment::class.java, KotlinCommonFragmentFactory(module))
protected open fun registerFragmentFactory(module: GradleKpmModule) {
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
typealias KotlinJvmVariantFactory = KotlinGradleFragmentFactory<KpmJvmVariant>
typealias GradleKpmJvmVariantFactory = GradleKpmFragmentFactory<GradleKpmJvmVariant>
fun KotlinJvmVariantFactory(
module: KpmGradleModule, config: KotlinJvmVariantConfig = KotlinJvmVariantConfig()
): KotlinJvmVariantFactory = KotlinJvmVariantFactory(
KotlinJvmVariantInstantiator(module, config),
KotlinJvmVariantConfigurator(config)
fun GradleKpmJvmVariantFactory(
module: GradleKpmModule, config: GradleKpmJvmVariantConfig = GradleKpmJvmVariantConfig()
): GradleKpmJvmVariantFactory = GradleKpmJvmVariantFactory(
GradleKpmJvmVariantInstantiator(module, config),
GradleKpmJvmVariantConfigurator(config)
)
data class KotlinJvmVariantConfig(
val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory
= DefaultKotlinFragmentDependencyConfigurationsFactory,
data class GradleKpmJvmVariantConfig(
val dependenciesConfigurationFactory: GradleKpmFragmentDependencyConfigurationsFactory
= GradleKpmDefaultFragmentDependencyConfigurationsFactory,
val compileDependencies: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant>
val compileDependencies: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinCompileDependenciesDefinition,
val runtimeDependencies: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant>
val runtimeDependencies: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinRuntimeDependenciesDefinition,
val apiElements: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant>
= DefaultKotlinApiElementsDefinition + KotlinFragmentCompilationOutputsJarArtifact,
val apiElements: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinApiElementsDefinition + GradleKpmCompilationOutputsJarArtifact,
val runtimeElements: KotlinGradleFragmentConfigurationDefinition<KpmJvmVariant>
val runtimeElements: GradleKpmConfigurationSetup<GradleKpmJvmVariant>
= DefaultKotlinRuntimeElementsDefinition,
val compileTaskConfigurator: KotlinCompileTaskConfigurator<KpmJvmVariant>
= KotlinJvmCompileTaskConfigurator,
val compileTaskConfigurator: GradleKpmCompileTaskConfigurator<GradleKpmJvmVariant>
= GradleKpmJvmCompileTaskConfigurator,
val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator<KpmJvmVariant>
= DefaultKotlinSourceArchiveTaskConfigurator,
val sourceArchiveTaskConfigurator: GradleKpmSourceArchiveTaskConfigurator<GradleKpmJvmVariant>
= GradleKpmDefaultKotlinSourceArchiveTaskConfigurator,
val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator<KpmJvmVariant>
= DefaultKotlinSourceDirectoriesConfigurator,
val sourceDirectoriesConfigurator: GradleKpmSourceDirectoriesConfigurator<GradleKpmJvmVariant>
= GradleKpmDefaultSourceDirectoriesConfigurator,
val publicationConfigurator: KotlinPublicationConfigurator<KpmJvmVariant>
= KotlinPublicationConfigurator.SingleVariantPublication
val publicationConfigurator: GradleKpmPublicationConfigurator<GradleKpmJvmVariant>
= GradleKpmPublicationConfigurator.SingleVariantPublication
)
class KotlinJvmVariantInstantiator internal constructor(
private val module: KpmGradleModule,
private val config: KotlinJvmVariantConfig
) : KotlinGradleFragmentFactory.FragmentInstantiator<KpmJvmVariant> {
class GradleKpmJvmVariantInstantiator internal constructor(
private val module: GradleKpmModule,
private val config: GradleKpmJvmVariantConfig
) : GradleKpmFragmentFactory.FragmentInstantiator<GradleKpmJvmVariant> {
override fun create(name: String): KpmJvmVariant {
override fun create(name: String): GradleKpmJvmVariant {
val names = FragmentNameDisambiguationOmittingMain(module, name)
val context = KotlinGradleFragmentConfigurationContextImpl(
val context = GradleKpmFragmentConfigureContextImpl(
module, config.dependenciesConfigurationFactory.create(module, names), names
)
return KpmJvmVariant(
return GradleKpmJvmVariant(
containingModule = module,
fragmentName = name,
dependencyConfigurations = context.dependencies,
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 ->
config.runtimeElements.relations.setExtendsFrom(configuration, context)
config.runtimeElements.relations.setupExtendsFromRelations(configuration, context)
},
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 ->
config.runtimeElements.relations.setExtendsFrom(configuration, context)
config.runtimeElements.relations.setupExtendsFromRelations(configuration, context)
}
)
}
}
class KotlinJvmVariantConfigurator internal constructor(
private val config: KotlinJvmVariantConfig
) : KotlinGradleFragmentFactory.FragmentConfigurator<KpmJvmVariant> {
class GradleKpmJvmVariantConfigurator internal constructor(
private val config: GradleKpmJvmVariantConfig
) : GradleKpmFragmentFactory.FragmentConfigurator<GradleKpmJvmVariant> {
override fun configure(fragment: KpmJvmVariant) {
override fun configure(fragment: GradleKpmJvmVariant) {
fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment)
fragment.runtimeDependenciesConfiguration.configure(config.runtimeDependencies, 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.plugin.*
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.targets.metadata.ResolvedMetadataFilesProvider
import org.jetbrains.kotlin.gradle.targets.metadata.createMetadataDependencyTransformationClasspath
@@ -32,8 +33,8 @@ interface KotlinCommonFragmentMetadataCompilationData : KotlinMetadataCompilatio
internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : KotlinCommonOptions>(
final override val project: Project,
val fragment: KpmGradleFragment,
private val module: KpmGradleModule,
val fragment: GradleKpmFragment,
private val module: GradleKpmModule,
private val compileAllTask: TaskProvider<DefaultTask>,
val metadataCompilationRegistry: MetadataCompilationRegistry,
private val resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>>
@@ -106,8 +107,8 @@ internal abstract class AbstractKotlinFragmentMetadataCompilationData<T : Kotlin
internal open class KotlinCommonFragmentMetadataCompilationDataImpl(
project: Project,
fragment: KpmGradleFragment,
module: KpmGradleModule,
fragment: GradleKpmFragment,
module: GradleKpmModule,
compileAllTask: TaskProvider<DefaultTask>,
metadataCompilationRegistry: MetadataCompilationRegistry,
resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>>
@@ -133,18 +134,18 @@ interface KotlinNativeFragmentMetadataCompilationData :
KotlinMetadataCompilationData<KotlinCommonOptions>,
KotlinNativeCompilationData<KotlinCommonOptions>
internal fun KpmGradleFragment.isNativeShared(): Boolean =
internal fun GradleKpmFragment.isNativeShared(): Boolean =
containingVariants.run {
any() && all { it.platformType == KotlinPlatformType.native }
}
internal fun KpmGradleFragment.isNativeHostSpecific(): Boolean =
internal fun GradleKpmFragment.isNativeHostSpecific(): Boolean =
this in getHostSpecificFragments(containingModule)
internal open class KotlinNativeFragmentMetadataCompilationDataImpl(
project: Project,
fragment: KpmGradleFragment,
module: KpmGradleModule,
fragment: GradleKpmFragment,
module: GradleKpmModule,
compileAllTask: TaskProvider<DefaultTask>,
metadataCompilationRegistry: MetadataCompilationRegistry,
resolvedMetadataFiles: Lazy<Iterable<ResolvedMetadataFilesProvider>>
@@ -168,7 +169,7 @@ internal open class KotlinNativeFragmentMetadataCompilationDataImpl(
override val konanTarget: KonanTarget
get() {
val nativeVariants =
fragment.containingVariants.filterIsInstance<KpmNativeVariantInternal>()
fragment.containingVariants.filterIsInstance<GradleKpmNativeVariantInternal>()
return nativeVariants.firstOrNull { it.konanTarget.enabledOnCurrentHost }?.konanTarget
?: nativeVariants.firstOrNull()?.konanTarget
?: 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
// what tasks should we create? should there be a generic task for that?
internal class MetadataCompilationRegistry {
private val commonCompilationDataPerFragment = LinkedHashMap<KpmGradleFragment, KotlinCommonFragmentMetadataCompilationDataImpl>()
private val nativeCompilationDataPerFragment = LinkedHashMap<KpmGradleFragment, KotlinNativeFragmentMetadataCompilationDataImpl>()
private val commonCompilationDataPerFragment = LinkedHashMap<GradleKpmFragment, KotlinCommonFragmentMetadataCompilationDataImpl>()
private val nativeCompilationDataPerFragment = LinkedHashMap<GradleKpmFragment, KotlinNativeFragmentMetadataCompilationDataImpl>()
fun registerCommon(fragment: KpmGradleFragment, compilationData: KotlinCommonFragmentMetadataCompilationDataImpl) {
fun registerCommon(fragment: GradleKpmFragment, compilationData: KotlinCommonFragmentMetadataCompilationDataImpl) {
commonCompilationDataPerFragment.compute(fragment) { _, existing ->
existing?.let { error("common compilation data for fragment $fragment already registered") }
compilationData
@@ -193,7 +194,7 @@ internal class MetadataCompilationRegistry {
withAllCommonCallbacks.forEach { it.invoke(compilationData) }
}
fun registerNative(fragment: KpmGradleFragment, compilationData: KotlinNativeFragmentMetadataCompilationDataImpl) {
fun registerNative(fragment: GradleKpmFragment, compilationData: KotlinNativeFragmentMetadataCompilationDataImpl) {
nativeCompilationDataPerFragment.compute(fragment) { _, existing ->
existing?.let { error("native compilation data for fragment $fragment already registered") }
compilationData
@@ -201,7 +202,7 @@ internal class MetadataCompilationRegistry {
withAllNativeCallbacks.forEach { it.invoke(compilationData) }
}
fun getForFragmentOrNull(fragment: KpmGradleFragment): AbstractKotlinFragmentMetadataCompilationData<*>? =
fun getForFragmentOrNull(fragment: GradleKpmFragment): AbstractKotlinFragmentMetadataCompilationData<*>? =
listOf(commonCompilationDataPerFragment.getValue(fragment), nativeCompilationDataPerFragment.getValue(fragment)).singleOrNull {
it.isActive
}
@@ -5,31 +5,29 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.pm20
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.jetbrains.kotlin.gradle.dsl.KotlinCommonOptions
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.konan.target.KonanTarget
abstract class KpmNativeVariantInternal(
containingModule: KpmGradleModule,
abstract class GradleKpmNativeVariantInternal(
containingModule: GradleKpmModule,
fragmentName: String,
val konanTarget: KonanTarget,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
final override val hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariant,
KpmGradleVariantInternal(
) : GradleKpmNativeVariant,
GradleKpmVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
dependencyConfigurations = dependencyConfigurations,
compileDependenciesConfiguration = compileDependencyConfiguration,
apiElementsConfiguration = apiElementsConfiguration
),
SingleMavenPublishedModuleHolder by DefaultSingleMavenPublishedModuleHolder(containingModule, fragmentName) {
GradleKpmSingleMavenPublishedModuleHolder by GradleKpmDefaultSingleMavenPublishedModuleHolder(containingModule, fragmentName) {
override var enableEndorsedLibraries: Boolean = false
@@ -40,35 +38,7 @@ abstract class KpmNativeVariantInternal(
DefaultCInteropSettings(project, cinteropName, compilationData)
}
override val compilationData by lazy { KotlinNativeVariantCompilationData(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
)
override val compilationData by lazy { GradleKpmNativeVariantCompilationData(this) }
}
interface KotlinNativeCompilationData<T : KotlinCommonOptions> : KotlinCompilationData<T> {
@@ -76,27 +46,9 @@ interface KotlinNativeCompilationData<T : KotlinCommonOptions> : KotlinCompilati
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(
target: KotlinNativeTarget,
private val variantClass: Class<out KpmNativeVariantInternal>
private val variantClass: Class<out GradleKpmNativeVariantInternal>
) : KotlinNativeCompilationFactory(target) {
override fun create(name: String): KotlinNativeCompilation {
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
fun <T : KpmNativeVariantInternal> KotlinNativeVariantFactory(
module: KpmGradleModule,
constructor: KotlinNativeVariantConstructor<T>,
config: KotlinNativeVariantConfig<T> = KotlinNativeVariantConfig()
) = KotlinGradleFragmentFactory(
fragmentInstantiator = KotlinNativeVariantInstantiator(module, constructor, config),
fragmentConfigurator = KotlinNativeVariantConfigurator(config)
fun <T : GradleKpmNativeVariantInternal> GradleKpmNativeVariantFactory(
module: GradleKpmModule,
constructor: GradleKpmNativeVariantConstructor<T>,
config: GradleKpmNativeVariantConfig<T> = GradleKpmNativeVariantConfig()
) = GradleKpmFragmentFactory(
fragmentInstantiator = GradleKpmNativeVariantInstantiator(module, constructor, config),
fragmentConfigurator = GradleKpmNativeVariantConfigurator(config)
)
data class KotlinNativeVariantConfig<T : KpmNativeVariantInternal>(
val dependenciesConfigurationFactory: KotlinFragmentDependencyConfigurationsFactory =
DefaultKotlinFragmentDependencyConfigurationsFactory,
data class GradleKpmNativeVariantConfig<T : GradleKpmNativeVariantInternal>(
val dependenciesConfigurationFactory: GradleKpmFragmentDependencyConfigurationsFactory =
GradleKpmDefaultFragmentDependencyConfigurationsFactory,
val compileDependencies: ConfigurationDefinition<T> =
DefaultKotlinCompileDependenciesDefinition + KotlinFragmentKonanTargetAttribute,
val compileDependencies: GradleKpmConfigurationSetup<T> =
DefaultKotlinCompileDependenciesDefinition + GradleKpmKonanTargetAttribute,
val apiElements: ConfigurationDefinition<T> =
val apiElements: GradleKpmConfigurationSetup<T> =
DefaultKotlinApiElementsDefinition
+ KotlinFragmentKonanTargetAttribute
+ FragmentConfigurationRelation { extendsFrom(dependencies.transitiveImplementationConfiguration) },
+ GradleKpmKonanTargetAttribute
+ GradleKpmConfigurationRelationSetup { extendsFrom(dependencies.transitiveImplementationConfiguration) },
val hostSpecificMetadataElements: ConfigurationDefinition<T> =
val hostSpecificMetadataElements: GradleKpmConfigurationSetup<T> =
DefaultKotlinHostSpecificMetadataElementsDefinition,
val compileTaskConfigurator: KotlinCompileTaskConfigurator<T> =
KotlinNativeCompileTaskConfigurator,
val compileTaskConfigurator: GradleKpmCompileTaskConfigurator<T> =
GradleKpmNativeCompileTaskConfigurator,
val sourceArchiveTaskConfigurator: KotlinSourceArchiveTaskConfigurator<T> =
DefaultKotlinSourceArchiveTaskConfigurator,
val sourceArchiveTaskConfigurator: GradleKpmSourceArchiveTaskConfigurator<T> =
GradleKpmDefaultKotlinSourceArchiveTaskConfigurator,
val sourceDirectoriesConfigurator: KotlinSourceDirectoriesConfigurator<T> =
DefaultKotlinSourceDirectoriesConfigurator,
val sourceDirectoriesConfigurator: GradleKpmSourceDirectoriesConfigurator<T> =
GradleKpmDefaultSourceDirectoriesConfigurator,
val publicationConfigurator: KotlinPublicationConfigurator<KpmNativeVariantInternal> =
KotlinPublicationConfigurator.NativeVariantPublication
val publicationConfigurator: GradleKpmPublicationConfigurator<GradleKpmNativeVariantInternal> =
GradleKpmPublicationConfigurator.NativeVariantPublication
)
class KotlinNativeVariantInstantiator<T : KpmNativeVariantInternal>(
private val module: KpmGradleModule,
private val kotlinNativeVariantConstructor: KotlinNativeVariantConstructor<T>,
private val config: KotlinNativeVariantConfig<T>
) : KotlinGradleFragmentFactory.FragmentInstantiator<T> {
class GradleKpmNativeVariantInstantiator<T : GradleKpmNativeVariantInternal>(
private val module: GradleKpmModule,
private val variantConstructor: GradleKpmNativeVariantConstructor<T>,
private val config: GradleKpmNativeVariantConfig<T>
) : GradleKpmFragmentFactory.FragmentInstantiator<T> {
override fun create(name: String): T {
val names = FragmentNameDisambiguation(module, name)
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,
fragmentName = name,
dependencyConfigurations = dependencies,
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 ->
config.apiElements.relations.setExtendsFrom(configuration, context)
config.apiElements.relations.setupExtendsFromRelations(configuration, context)
},
hostSpecificMetadataElementsConfiguration =
config.hostSpecificMetadataElements.provider.getConfiguration(context).also { configuration ->
config.hostSpecificMetadataElements.relations.setExtendsFrom(configuration, context)
config.hostSpecificMetadataElements.relations.setupExtendsFromRelations(configuration, context)
}
)
}
}
class KotlinNativeVariantConfigurator<T : KpmNativeVariantInternal>(
private val config: KotlinNativeVariantConfig<T>
) : KotlinGradleFragmentFactory.FragmentConfigurator<T> {
class GradleKpmNativeVariantConfigurator<T : GradleKpmNativeVariantInternal>(
private val config: GradleKpmNativeVariantConfig<T>
) : GradleKpmFragmentFactory.FragmentConfigurator<T> {
override fun configure(fragment: T) {
fragment.compileDependenciesConfiguration.configure(config.compileDependencies, fragment)
@@ -5,21 +5,21 @@
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> {
override fun configure(fragment: KpmGradleVariant) = Unit
object NoPublication : GradleKpmPublicationConfigurator<GradleKpmVariant> {
override fun configure(fragment: GradleKpmVariant) = Unit
}
object SingleVariantPublication : KotlinPublicationConfigurator<KpmGradlePublishedVariantWithRuntime> {
override fun configure(fragment: KpmGradlePublishedVariantWithRuntime) {
VariantPublishingConfigurator.get(fragment.project).configureSingleVariantPublication(fragment)
object SingleVariantPublication : GradleKpmPublicationConfigurator<GradleKpmPublishedVariantWithRuntime> {
override fun configure(fragment: GradleKpmPublishedVariantWithRuntime) {
GradleKpmVariantPublishingConfigurator.get(fragment.project).configureSingleVariantPublication(fragment)
}
}
object NativeVariantPublication : KotlinPublicationConfigurator<KpmNativeVariantInternal> {
override fun configure(fragment: KpmNativeVariantInternal) {
VariantPublishingConfigurator.get(fragment.project).configureNativeVariantPublication(fragment)
object NativeVariantPublication : GradleKpmPublicationConfigurator<GradleKpmNativeVariantInternal> {
override fun configure(fragment: GradleKpmNativeVariantInternal) {
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.sourcesJarTaskNamed
interface KotlinSourceArchiveTaskConfigurator<in T : KpmGradleVariant> {
interface GradleKpmSourceArchiveTaskConfigurator<in T : GradleKpmVariant> {
fun registerSourceArchiveTask(variant: T): TaskProvider<*>?
}
object DefaultKotlinSourceArchiveTaskConfigurator : KotlinSourceArchiveTaskConfigurator<KpmGradleVariant> {
override fun registerSourceArchiveTask(variant: KpmGradleVariant): TaskProvider<*> {
object GradleKpmDefaultKotlinSourceArchiveTaskConfigurator : GradleKpmSourceArchiveTaskConfigurator<GradleKpmVariant> {
override fun registerSourceArchiveTask(variant: GradleKpmVariant): TaskProvider<*> {
return sourcesJarTaskNamed(
taskName = variant.sourceArchiveTaskName,
project = variant.project,
sourceSets = lazy {
FragmentSourcesProvider().getSourcesFromRefinesClosureAsMap(variant)
GradleKpmFragmentSourcesProvider().getSourcesFromRefinesClosureAsMap(variant)
.entries.associate { it.key.unambiguousNameInProject to it.value.get() }
},
artifactNameAppendix = variant.name
@@ -11,10 +11,10 @@ import org.jetbrains.kotlin.gradle.plugin.sources.kpm.FragmentMappedKotlinSource
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File
interface KotlinSourceDirectoriesConfigurator<in T : KpmGradleFragment>: KotlinGradleFragmentFactory.FragmentConfigurator<T>
interface GradleKpmSourceDirectoriesConfigurator<in T : GradleKpmFragment>: GradleKpmFragmentFactory.FragmentConfigurator<T>
object DefaultKotlinSourceDirectoriesConfigurator : KotlinSourceDirectoriesConfigurator<KpmGradleFragment> {
override fun configure(fragment: KpmGradleFragment) {
object GradleKpmDefaultSourceDirectoriesConfigurator : GradleKpmSourceDirectoriesConfigurator<GradleKpmFragment> {
override fun configure(fragment: GradleKpmFragment) {
fragment.kotlinSourceRoots.srcDir(
fragment.project.provider {
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 isModelMappingEnabled = project.multiplatformExtensionOrNull != null
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)
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 java.util.concurrent.Callable
internal open class KpmAwareTargetConfigurator<T : KotlinTarget>(
internal open class GradleKpmAwareTargetConfigurator<T : KotlinTarget>(
private val legacyModelTargetConfigurator: AbstractKotlinTargetConfigurator<T>,
) : AbstractKotlinTargetConfigurator<T>(true, legacyModelTargetConfigurator.createDefaultSourceSets),
KotlinTargetConfigurator<T> by legacyModelTargetConfigurator {
@@ -31,7 +31,7 @@ internal open class KpmAwareTargetConfigurator<T : KotlinTarget>(
val compilationDetails = (compilation as? AbstractKotlinCompilation)?.compilationDetails
if (compilationDetails is VariantMappedCompilationDetails<*> && compilationDetails.variant.containingModule.isMain) {
val variant = compilationDetails.variant
if (variant is SingleMavenPublishedModuleHolder) {
if (variant is GradleKpmSingleMavenPublishedModuleHolder) {
variant.whenPublicationAssigned { publication ->
target.publicationConfigureActions.all { action ->
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
) :
KpmAwareTargetConfigurator<T>(legacyModelTargetWithTestsConfigurator),
GradleKpmAwareTargetConfigurator<T>(legacyModelTargetWithTestsConfigurator),
KotlinTargetWithTestsConfigurator<R, T>
where C : AbstractKotlinTargetConfigurator<T>,
@@ -95,4 +95,4 @@ internal class KpmAwareTargetWithTestsConfigurator<R : KotlinTargetTestRun<*>, T
override fun createTestRun(name: String, target: T): R =
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.LanguageSettingsBuilder
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.FragmentConsistencyChecker
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 javax.inject.Inject
open class KpmGradleFragmentInternal @Inject constructor(
final override val containingModule: KpmGradleModule,
open class GradleKpmFragmentInternal @Inject constructor(
final override val containingModule: GradleKpmModule,
final override val fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations
) : KpmGradleFragment,
KotlinFragmentDependencyConfigurations by dependencyConfigurations {
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations
) : GradleKpmFragment,
GradleKpmFragmentDependencyConfigurations by dependencyConfigurations {
final override fun getName(): String = fragmentName
@@ -44,12 +44,12 @@ open class KpmGradleFragmentInternal @Inject constructor(
// FIXME check for consistency
override val languageSettings: LanguageSettingsBuilder = DefaultLanguageSettingsBuilder()
override fun refines(other: KpmGradleFragment) {
override fun refines(other: GradleKpmFragment) {
checkCanRefine(other)
refines(containingModule.fragments.named(other.name))
}
override fun refines(other: NamedDomainObjectProvider<KpmGradleFragment>) {
override fun refines(other: NamedDomainObjectProvider<GradleKpmFragment>) {
_directRefinesDependencies.add(other)
other.configure { checkCanRefine(it) }
@@ -66,11 +66,11 @@ open class KpmGradleFragmentInternal @Inject constructor(
)
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) {
"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?>) =
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()
// 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
override val declaredModuleDependencies: Iterable<KpmModuleDependency>
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 =
@@ -106,7 +106,7 @@ open class KpmGradleFragmentInternal @Inject constructor(
FragmentConsistencyChecker(
unitsName = "fragments",
name = { name },
checks = FragmentConsistencyChecks<KpmGradleFragment>(
checks = FragmentConsistencyChecks<GradleKpmFragment>(
unitName = "fragment",
languageSettings = { languageSettings }
).allChecks
@@ -11,17 +11,18 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptionsImpl
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.*
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
open class KpmJvmVariant(
containingModule: KpmGradleModule,
open class GradleKpmJvmVariant(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependenciesConfiguration: Configuration,
apiElementsConfiguration: Configuration,
runtimeDependenciesConfiguration: Configuration,
runtimeElementsConfiguration: Configuration
) : KpmGradlePublishedVariantWithRuntime(
) : GradleKpmPublishedVariantWithRuntime(
containingModule = containingModule,
fragmentName = fragmentName,
dependencyConfigurations = dependencyConfigurations,
@@ -30,20 +31,20 @@ open class KpmJvmVariant(
runtimeDependencyConfiguration = runtimeDependenciesConfiguration,
runtimeElementsConfiguration = runtimeElementsConfiguration
) {
override val compilationData: KotlinJvmVariantCompilationData by lazy { KotlinJvmVariantCompilationData(this) }
override val compilationData: GradleKpmJvmVariantCompilationData by lazy { GradleKpmJvmVariantCompilationData(this) }
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.jvm
}
class KotlinJvmVariantCompilationData(val variant: KpmJvmVariant) : KotlinVariantCompilationDataInternal<KotlinJvmOptions> {
override val owner: KpmJvmVariant get() = variant
class GradleKpmJvmVariantCompilationData(val variant: GradleKpmJvmVariant) : GradleKpmVariantCompilationDataInternal<KotlinJvmOptions> {
override val owner: GradleKpmJvmVariant get() = variant
// TODO pull out to the variant
override val kotlinOptions: KotlinJvmOptions = KotlinJvmOptionsImpl()
}
internal fun KpmGradleVariant.ownModuleName(): String {
internal fun GradleKpmVariant.ownModuleName(): String {
val project = containingModule.project
val baseName = project.archivesName
?: project.name
@@ -56,7 +57,7 @@ internal class KotlinMappedJvmCompilationFactory(
) : KotlinJvmCompilationFactory(target) {
override fun create(name: String): KotlinJvmCompilation {
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(
VariantMappedCompilationDetailsWithRuntime(variant, target),
@@ -5,14 +5,14 @@ import org.jetbrains.kotlin.konan.target.KonanTarget
import javax.inject.Inject
// DO NOT EDIT MANUALLY! Generated by org.jetbrains.kotlin.generators.gradle.dsl.KpmNativeVariantCodegenKt
open class KpmAndroidNativeX64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmAndroidNativeX64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_X64,
@@ -22,20 +22,20 @@ open class KpmAndroidNativeX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.ANDROID_X64, KpmAndroidNativeX64Variant::class.java, ::KpmAndroidNativeX64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_X64, GradleKpmAndroidNativeX64Variant::class.java, ::GradleKpmAndroidNativeX64Variant
)
}
}
open class KpmAndroidNativeX86Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmAndroidNativeX86Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_X86,
@@ -45,20 +45,20 @@ open class KpmAndroidNativeX86Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.ANDROID_X86, KpmAndroidNativeX86Variant::class.java, ::KpmAndroidNativeX86Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_X86, GradleKpmAndroidNativeX86Variant::class.java, ::GradleKpmAndroidNativeX86Variant
)
}
}
open class KpmAndroidNativeArm32Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmAndroidNativeArm32Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_ARM32,
@@ -68,20 +68,20 @@ open class KpmAndroidNativeArm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.ANDROID_ARM32, KpmAndroidNativeArm32Variant::class.java, ::KpmAndroidNativeArm32Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_ARM32, GradleKpmAndroidNativeArm32Variant::class.java, ::GradleKpmAndroidNativeArm32Variant
)
}
}
open class KpmAndroidNativeArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmAndroidNativeArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.ANDROID_ARM64,
@@ -91,20 +91,20 @@ open class KpmAndroidNativeArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.ANDROID_ARM64, KpmAndroidNativeArm64Variant::class.java, ::KpmAndroidNativeArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.ANDROID_ARM64, GradleKpmAndroidNativeArm64Variant::class.java, ::GradleKpmAndroidNativeArm64Variant
)
}
}
open class KpmIosArm32Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmIosArm32Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_ARM32,
@@ -114,20 +114,20 @@ open class KpmIosArm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.IOS_ARM32, KpmIosArm32Variant::class.java, ::KpmIosArm32Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_ARM32, GradleKpmIosArm32Variant::class.java, ::GradleKpmIosArm32Variant
)
}
}
open class KpmIosArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmIosArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_ARM64,
@@ -137,20 +137,20 @@ open class KpmIosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.IOS_ARM64, KpmIosArm64Variant::class.java, ::KpmIosArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_ARM64, GradleKpmIosArm64Variant::class.java, ::GradleKpmIosArm64Variant
)
}
}
open class KpmIosX64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmIosX64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_X64,
@@ -160,20 +160,20 @@ open class KpmIosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.IOS_X64, KpmIosX64Variant::class.java, ::KpmIosX64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_X64, GradleKpmIosX64Variant::class.java, ::GradleKpmIosX64Variant
)
}
}
open class KpmIosSimulatorArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmIosSimulatorArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.IOS_SIMULATOR_ARM64,
@@ -183,20 +183,20 @@ open class KpmIosSimulatorArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.IOS_SIMULATOR_ARM64, KpmIosSimulatorArm64Variant::class.java, ::KpmIosSimulatorArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.IOS_SIMULATOR_ARM64, GradleKpmIosSimulatorArm64Variant::class.java, ::GradleKpmIosSimulatorArm64Variant
)
}
}
open class KpmWatchosArm32Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmWatchosArm32Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_ARM32,
@@ -206,20 +206,20 @@ open class KpmWatchosArm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.WATCHOS_ARM32, KpmWatchosArm32Variant::class.java, ::KpmWatchosArm32Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_ARM32, GradleKpmWatchosArm32Variant::class.java, ::GradleKpmWatchosArm32Variant
)
}
}
open class KpmWatchosArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmWatchosArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_ARM64,
@@ -229,20 +229,20 @@ open class KpmWatchosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.WATCHOS_ARM64, KpmWatchosArm64Variant::class.java, ::KpmWatchosArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_ARM64, GradleKpmWatchosArm64Variant::class.java, ::GradleKpmWatchosArm64Variant
)
}
}
open class KpmWatchosX86Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmWatchosX86Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_X86,
@@ -252,20 +252,20 @@ open class KpmWatchosX86Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.WATCHOS_X86, KpmWatchosX86Variant::class.java, ::KpmWatchosX86Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_X86, GradleKpmWatchosX86Variant::class.java, ::GradleKpmWatchosX86Variant
)
}
}
open class KpmWatchosX64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmWatchosX64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_X64,
@@ -275,20 +275,20 @@ open class KpmWatchosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.WATCHOS_X64, KpmWatchosX64Variant::class.java, ::KpmWatchosX64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_X64, GradleKpmWatchosX64Variant::class.java, ::GradleKpmWatchosX64Variant
)
}
}
open class KpmWatchosSimulatorArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmWatchosSimulatorArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.WATCHOS_SIMULATOR_ARM64,
@@ -298,20 +298,20 @@ open class KpmWatchosSimulatorArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.WATCHOS_SIMULATOR_ARM64, KpmWatchosSimulatorArm64Variant::class.java, ::KpmWatchosSimulatorArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WATCHOS_SIMULATOR_ARM64, GradleKpmWatchosSimulatorArm64Variant::class.java, ::GradleKpmWatchosSimulatorArm64Variant
)
}
}
open class KpmTvosArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmTvosArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.TVOS_ARM64,
@@ -321,20 +321,20 @@ open class KpmTvosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.TVOS_ARM64, KpmTvosArm64Variant::class.java, ::KpmTvosArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.TVOS_ARM64, GradleKpmTvosArm64Variant::class.java, ::GradleKpmTvosArm64Variant
)
}
}
open class KpmTvosX64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmTvosX64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.TVOS_X64,
@@ -344,20 +344,20 @@ open class KpmTvosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.TVOS_X64, KpmTvosX64Variant::class.java, ::KpmTvosX64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.TVOS_X64, GradleKpmTvosX64Variant::class.java, ::GradleKpmTvosX64Variant
)
}
}
open class KpmTvosSimulatorArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmTvosSimulatorArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.TVOS_SIMULATOR_ARM64,
@@ -367,20 +367,20 @@ open class KpmTvosSimulatorArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.TVOS_SIMULATOR_ARM64, KpmTvosSimulatorArm64Variant::class.java, ::KpmTvosSimulatorArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.TVOS_SIMULATOR_ARM64, GradleKpmTvosSimulatorArm64Variant::class.java, ::GradleKpmTvosSimulatorArm64Variant
)
}
}
open class KpmLinuxX64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmLinuxX64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_X64,
@@ -390,20 +390,20 @@ open class KpmLinuxX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.LINUX_X64, KpmLinuxX64Variant::class.java, ::KpmLinuxX64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_X64, GradleKpmLinuxX64Variant::class.java, ::GradleKpmLinuxX64Variant
)
}
}
open class KpmMingwX86Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmMingwX86Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.MINGW_X86,
@@ -413,20 +413,20 @@ open class KpmMingwX86Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.MINGW_X86, KpmMingwX86Variant::class.java, ::KpmMingwX86Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MINGW_X86, GradleKpmMingwX86Variant::class.java, ::GradleKpmMingwX86Variant
)
}
}
open class KpmMingwX64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmMingwX64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.MINGW_X64,
@@ -436,20 +436,20 @@ open class KpmMingwX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.MINGW_X64, KpmMingwX64Variant::class.java, ::KpmMingwX64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MINGW_X64, GradleKpmMingwX64Variant::class.java, ::GradleKpmMingwX64Variant
)
}
}
open class KpmMacosX64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmMacosX64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.MACOS_X64,
@@ -459,20 +459,20 @@ open class KpmMacosX64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.MACOS_X64, KpmMacosX64Variant::class.java, ::KpmMacosX64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MACOS_X64, GradleKpmMacosX64Variant::class.java, ::GradleKpmMacosX64Variant
)
}
}
open class KpmMacosArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmMacosArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.MACOS_ARM64,
@@ -482,20 +482,20 @@ open class KpmMacosArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.MACOS_ARM64, KpmMacosArm64Variant::class.java, ::KpmMacosArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.MACOS_ARM64, GradleKpmMacosArm64Variant::class.java, ::GradleKpmMacosArm64Variant
)
}
}
open class KpmLinuxArm64Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmLinuxArm64Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_ARM64,
@@ -505,20 +505,20 @@ open class KpmLinuxArm64Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.LINUX_ARM64, KpmLinuxArm64Variant::class.java, ::KpmLinuxArm64Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_ARM64, GradleKpmLinuxArm64Variant::class.java, ::GradleKpmLinuxArm64Variant
)
}
}
open class KpmLinuxArm32HfpVariant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmLinuxArm32HfpVariant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_ARM32_HFP,
@@ -528,20 +528,20 @@ open class KpmLinuxArm32HfpVariant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.LINUX_ARM32_HFP, KpmLinuxArm32HfpVariant::class.java, ::KpmLinuxArm32HfpVariant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_ARM32_HFP, GradleKpmLinuxArm32HfpVariant::class.java, ::GradleKpmLinuxArm32HfpVariant
)
}
}
open class KpmLinuxMips32Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmLinuxMips32Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_MIPS32,
@@ -551,20 +551,20 @@ open class KpmLinuxMips32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.LINUX_MIPS32, KpmLinuxMips32Variant::class.java, ::KpmLinuxMips32Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_MIPS32, GradleKpmLinuxMips32Variant::class.java, ::GradleKpmLinuxMips32Variant
)
}
}
open class KpmLinuxMipsel32Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmLinuxMipsel32Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.LINUX_MIPSEL32,
@@ -574,20 +574,20 @@ open class KpmLinuxMipsel32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.LINUX_MIPSEL32, KpmLinuxMipsel32Variant::class.java, ::KpmLinuxMipsel32Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.LINUX_MIPSEL32, GradleKpmLinuxMipsel32Variant::class.java, ::GradleKpmLinuxMipsel32Variant
)
}
}
open class KpmWasm32Variant @Inject constructor(
containingModule: KpmGradleModule,
open class GradleKpmWasm32Variant @Inject constructor(
containingModule: GradleKpmModule,
fragmentName: String,
dependencyConfigurations: KotlinFragmentDependencyConfigurations,
dependencyConfigurations: GradleKpmFragmentDependencyConfigurations,
compileDependencyConfiguration: Configuration,
apiElementsConfiguration: Configuration,
hostSpecificMetadataElementsConfiguration: Configuration?
) : KpmNativeVariantInternal(
) : GradleKpmNativeVariantInternal(
containingModule = containingModule,
fragmentName = fragmentName,
konanTarget = KonanTarget.WASM32,
@@ -597,67 +597,67 @@ open class KpmWasm32Variant @Inject constructor(
hostSpecificMetadataElementsConfiguration = hostSpecificMetadataElementsConfiguration
) {
companion object {
val constructor = KotlinNativeVariantConstructor(
KonanTarget.WASM32, KpmWasm32Variant::class.java, ::KpmWasm32Variant
val constructor = GradleKpmNativeVariantConstructor(
KonanTarget.WASM32, GradleKpmWasm32Variant::class.java, ::GradleKpmWasm32Variant
)
}
}
internal val allKpmNativeVariantConstructors = listOf(
KpmAndroidNativeX64Variant.constructor,
KpmAndroidNativeX86Variant.constructor,
KpmAndroidNativeArm32Variant.constructor,
KpmAndroidNativeArm64Variant.constructor,
KpmIosArm32Variant.constructor,
KpmIosArm64Variant.constructor,
KpmIosX64Variant.constructor,
KpmIosSimulatorArm64Variant.constructor,
KpmWatchosArm32Variant.constructor,
KpmWatchosArm64Variant.constructor,
KpmWatchosX86Variant.constructor,
KpmWatchosX64Variant.constructor,
KpmWatchosSimulatorArm64Variant.constructor,
KpmTvosArm64Variant.constructor,
KpmTvosX64Variant.constructor,
KpmTvosSimulatorArm64Variant.constructor,
KpmLinuxX64Variant.constructor,
KpmMingwX86Variant.constructor,
KpmMingwX64Variant.constructor,
KpmMacosX64Variant.constructor,
KpmMacosArm64Variant.constructor,
KpmLinuxArm64Variant.constructor,
KpmLinuxArm32HfpVariant.constructor,
KpmLinuxMips32Variant.constructor,
KpmLinuxMipsel32Variant.constructor,
KpmWasm32Variant.constructor
GradleKpmAndroidNativeX64Variant.constructor,
GradleKpmAndroidNativeX86Variant.constructor,
GradleKpmAndroidNativeArm32Variant.constructor,
GradleKpmAndroidNativeArm64Variant.constructor,
GradleKpmIosArm32Variant.constructor,
GradleKpmIosArm64Variant.constructor,
GradleKpmIosX64Variant.constructor,
GradleKpmIosSimulatorArm64Variant.constructor,
GradleKpmWatchosArm32Variant.constructor,
GradleKpmWatchosArm64Variant.constructor,
GradleKpmWatchosX86Variant.constructor,
GradleKpmWatchosX64Variant.constructor,
GradleKpmWatchosSimulatorArm64Variant.constructor,
GradleKpmTvosArm64Variant.constructor,
GradleKpmTvosX64Variant.constructor,
GradleKpmTvosSimulatorArm64Variant.constructor,
GradleKpmLinuxX64Variant.constructor,
GradleKpmMingwX86Variant.constructor,
GradleKpmMingwX64Variant.constructor,
GradleKpmMacosX64Variant.constructor,
GradleKpmMacosArm64Variant.constructor,
GradleKpmLinuxArm64Variant.constructor,
GradleKpmLinuxArm32HfpVariant.constructor,
GradleKpmLinuxMips32Variant.constructor,
GradleKpmLinuxMipsel32Variant.constructor,
GradleKpmWasm32Variant.constructor
)
internal fun kpmNativeVariantClass(konanTarget: KonanTarget): Class<out KpmNativeVariantInternal>? = when (konanTarget) {
KonanTarget.ANDROID_X64 -> KpmAndroidNativeX64Variant::class.java
KonanTarget.ANDROID_X86 -> KpmAndroidNativeX86Variant::class.java
KonanTarget.ANDROID_ARM32 -> KpmAndroidNativeArm32Variant::class.java
KonanTarget.ANDROID_ARM64 -> KpmAndroidNativeArm64Variant::class.java
KonanTarget.IOS_ARM32 -> KpmIosArm32Variant::class.java
KonanTarget.IOS_ARM64 -> KpmIosArm64Variant::class.java
KonanTarget.IOS_X64 -> KpmIosX64Variant::class.java
KonanTarget.IOS_SIMULATOR_ARM64 -> KpmIosSimulatorArm64Variant::class.java
KonanTarget.WATCHOS_ARM32 -> KpmWatchosArm32Variant::class.java
KonanTarget.WATCHOS_ARM64 -> KpmWatchosArm64Variant::class.java
KonanTarget.WATCHOS_X86 -> KpmWatchosX86Variant::class.java
KonanTarget.WATCHOS_X64 -> KpmWatchosX64Variant::class.java
KonanTarget.WATCHOS_SIMULATOR_ARM64 -> KpmWatchosSimulatorArm64Variant::class.java
KonanTarget.TVOS_ARM64 -> KpmTvosArm64Variant::class.java
KonanTarget.TVOS_X64 -> KpmTvosX64Variant::class.java
KonanTarget.TVOS_SIMULATOR_ARM64 -> KpmTvosSimulatorArm64Variant::class.java
KonanTarget.LINUX_X64 -> KpmLinuxX64Variant::class.java
KonanTarget.MINGW_X86 -> KpmMingwX86Variant::class.java
KonanTarget.MINGW_X64 -> KpmMingwX64Variant::class.java
KonanTarget.MACOS_X64 -> KpmMacosX64Variant::class.java
KonanTarget.MACOS_ARM64 -> KpmMacosArm64Variant::class.java
KonanTarget.LINUX_ARM64 -> KpmLinuxArm64Variant::class.java
KonanTarget.LINUX_ARM32_HFP -> KpmLinuxArm32HfpVariant::class.java
KonanTarget.LINUX_MIPS32 -> KpmLinuxMips32Variant::class.java
KonanTarget.LINUX_MIPSEL32 -> KpmLinuxMipsel32Variant::class.java
KonanTarget.WASM32 -> KpmWasm32Variant::class.java
internal fun kpmNativeVariantClass(konanTarget: KonanTarget): Class<out GradleKpmNativeVariantInternal>? = when (konanTarget) {
KonanTarget.ANDROID_X64 -> GradleKpmAndroidNativeX64Variant::class.java
KonanTarget.ANDROID_X86 -> GradleKpmAndroidNativeX86Variant::class.java
KonanTarget.ANDROID_ARM32 -> GradleKpmAndroidNativeArm32Variant::class.java
KonanTarget.ANDROID_ARM64 -> GradleKpmAndroidNativeArm64Variant::class.java
KonanTarget.IOS_ARM32 -> GradleKpmIosArm32Variant::class.java
KonanTarget.IOS_ARM64 -> GradleKpmIosArm64Variant::class.java
KonanTarget.IOS_X64 -> GradleKpmIosX64Variant::class.java
KonanTarget.IOS_SIMULATOR_ARM64 -> GradleKpmIosSimulatorArm64Variant::class.java
KonanTarget.WATCHOS_ARM32 -> GradleKpmWatchosArm32Variant::class.java
KonanTarget.WATCHOS_ARM64 -> GradleKpmWatchosArm64Variant::class.java
KonanTarget.WATCHOS_X86 -> GradleKpmWatchosX86Variant::class.java
KonanTarget.WATCHOS_X64 -> GradleKpmWatchosX64Variant::class.java
KonanTarget.WATCHOS_SIMULATOR_ARM64 -> GradleKpmWatchosSimulatorArm64Variant::class.java
KonanTarget.TVOS_ARM64 -> GradleKpmTvosArm64Variant::class.java
KonanTarget.TVOS_X64 -> GradleKpmTvosX64Variant::class.java
KonanTarget.TVOS_SIMULATOR_ARM64 -> GradleKpmTvosSimulatorArm64Variant::class.java
KonanTarget.LINUX_X64 -> GradleKpmLinuxX64Variant::class.java
KonanTarget.MINGW_X86 -> GradleKpmMingwX86Variant::class.java
KonanTarget.MINGW_X64 -> GradleKpmMingwX64Variant::class.java
KonanTarget.MACOS_X64 -> GradleKpmMacosX64Variant::class.java
KonanTarget.MACOS_ARM64 -> GradleKpmMacosArm64Variant::class.java
KonanTarget.LINUX_ARM64 -> GradleKpmLinuxArm64Variant::class.java
KonanTarget.LINUX_ARM32_HFP -> GradleKpmLinuxArm32HfpVariant::class.java
KonanTarget.LINUX_MIPS32 -> GradleKpmLinuxMips32Variant::class.java
KonanTarget.LINUX_MIPSEL32 -> GradleKpmLinuxMipsel32Variant::class.java
KonanTarget.WASM32 -> GradleKpmWasm32Variant::class.java
else -> null
}
}
@@ -13,16 +13,16 @@ import org.jetbrains.kotlin.gradle.dsl.topLevelExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.project.model.KpmModuleIdentifier
internal interface KpmGradleProjectModelContainer {
val modules: NamedDomainObjectContainer<KpmGradleModule>
internal interface GradleKpmProjectModelContainer {
val modules: NamedDomainObjectContainer<GradleKpmModule>
val metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry>
val rootPublication: MavenPublication?
}
internal val Project.kpmModelContainer: KpmGradleProjectModelContainer
internal val Project.kpmModelContainer: GradleKpmProjectModelContainer
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) {
is KotlinPm20ProjectExtension -> ext.kpmModelContainer
is KotlinProjectExtension -> if (PropertiesProvider(project).experimentalKpmModelMapping) ext.kpmModelContainer else null
@@ -32,27 +32,27 @@ internal val Project.kpmModelContainerOrNull: KpmGradleProjectModelContainer?
internal val Project.hasKpmModel: Boolean
get() = kpmModelContainerOrNull != null
internal val Project.kpmModules: NamedDomainObjectContainer<KpmGradleModule>
internal val Project.kpmModules: NamedDomainObjectContainer<GradleKpmModule>
get() = kpmModelContainer.modules
internal val Project.metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry>
get() = kpmModelContainer.metadataCompilationRegistryByModuleId
internal class DefaultKpmGradleProjectModelContainer(
override val modules: NamedDomainObjectContainer<KpmGradleModule>,
internal class GradleKpmDefaultProjectModelContainer(
override val modules: NamedDomainObjectContainer<GradleKpmModule>,
override val metadataCompilationRegistryByModuleId: MutableMap<KpmModuleIdentifier, MetadataCompilationRegistry>,
) : KpmGradleProjectModelContainer {
) : GradleKpmProjectModelContainer {
override var rootPublication: MavenPublication? = null
companion object {
fun create(project: Project): DefaultKpmGradleProjectModelContainer {
return DefaultKpmGradleProjectModelContainer(createKpmModulesContainer(project), mutableMapOf())
fun create(project: Project): GradleKpmDefaultProjectModelContainer {
return GradleKpmDefaultProjectModelContainer(createKpmModulesContainer(project), mutableMapOf())
}
private fun createKpmModulesContainer(project: Project): NamedDomainObjectContainer<KpmGradleModule> =
private fun createKpmModulesContainer(project: Project): NamedDomainObjectContainer<GradleKpmModule> =
project.objects.domainObjectContainer(
KpmGradleModule::class.java,
KotlinGradleModuleFactory(project)
GradleKpmModule::class.java,
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.mutableExtrasOf
internal open class LegacyMappedVariant(
internal open class GradleKpmLegacyMappedVariant(
internal val compilation: KotlinCompilation<*>,
) : KpmGradleVariant {
) : GradleKpmVariant {
override fun toString(): String = "variant mapped to $compilation"
private val fragmentForDefaultSourceSet =
(compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment
override val containingModule: KpmGradleModule get() = fragmentForDefaultSourceSet.containingModule
override val containingModule: GradleKpmModule get() = fragmentForDefaultSourceSet.containingModule
override val platformType: KotlinPlatformType
get() = compilation.platformType
@@ -89,11 +89,11 @@ internal open class LegacyMappedVariant(
override val extras: MutableExtras = mutableExtrasOf()
override fun refines(other: KpmGradleFragment) {
override fun refines(other: GradleKpmFragment) {
fragmentForDefaultSourceSet.refines(other)
}
override fun refines(other: NamedDomainObjectProvider<KpmGradleFragment>) {
override fun refines(other: NamedDomainObjectProvider<GradleKpmFragment>) {
fragmentForDefaultSourceSet.refines(other)
}
@@ -105,7 +105,7 @@ internal open class LegacyMappedVariant(
override val fragmentName: String
get() = fragmentForDefaultSourceSet.fragmentName + "Variant"
override val declaredRefinesDependencies: Iterable<KpmGradleFragment>
override val declaredRefinesDependencies: Iterable<GradleKpmFragment>
get() = fragmentForDefaultSourceSet.declaredRefinesDependencies
override val declaredModuleDependencies: Iterable<KpmModuleDependency>
@@ -148,9 +148,9 @@ internal open class LegacyMappedVariant(
}
}
internal class LegacyMappedVariantWithRuntime(private val compilationWithRuntime: KotlinCompilationToRunnableFiles<*>) :
LegacyMappedVariant(compilationWithRuntime),
KpmGradleVariantWithRuntime {
internal class GradleKpmLegacyMappedVariantWithRuntime(private val compilationWithRuntime: KotlinCompilationToRunnableFiles<*>) :
GradleKpmLegacyMappedVariant(compilationWithRuntime),
GradleKpmVariantWithRuntime {
override val runtimeDependenciesConfiguration: Configuration
get() = project.configurations.getByName(compilationWithRuntime.runtimeDependencyConfigurationName)
@@ -177,8 +177,8 @@ internal enum class PublicationRegistrationMode {
internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, publicationRegistration: PublicationRegistrationMode) {
target.compilations.all { compilation ->
val variant = if (compilation is KotlinCompilationToRunnableFiles)
LegacyMappedVariantWithRuntime(compilation)
else LegacyMappedVariant(compilation)
GradleKpmLegacyMappedVariantWithRuntime(compilation)
else GradleKpmLegacyMappedVariant(compilation)
val defaultSourceSetFragment = (compilation.defaultSourceSet as FragmentMappedKotlinSourceSet).underlyingFragment
variant.refines(defaultSourceSetFragment)
@@ -194,9 +194,9 @@ internal fun mapTargetCompilationsToKpmVariants(target: AbstractKotlinTarget, pu
}
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 ->
val moduleHolder = DefaultSingleMavenPublishedModuleHolder(
val moduleHolder = GradleKpmDefaultSingleMavenPublishedModuleHolder(
mainModule,
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?
val request = BasicPlatformPublicationToMavenRequest(
val request = GradleKpmBasicPlatformPublicationToMavenRequest(
kotlinComponent.name,
mainModule,
moduleHolder,
usages.map { usage ->
val variant = mainModule.variants.withType<LegacyMappedVariant>().single {
val variant = mainModule.variants.withType<GradleKpmLegacyMappedVariant>().single {
it.compilation == usage.compilation
}
(usage as? DefaultKotlinUsageContext) ?: error("unexpected KotlinUsageContext type: ${usage.javaClass}")
AdvancedVariantPublicationRequest(
KpmGradleAdvancedConfigurationPublicationRequest(
variant,
target.project.configurations.getByName(usage.dependencyConfigurationName),
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