Remove the out-projection from kotlinSourceSets in kotlin extension
Gradle versions older than 4.10 could not correctly provide access to the source set via delegation (i.e. `getting`, `creating` etc.) because of the out-projection. Remove the out-projection and expose just `DomainObjectContainer<KotlinSourceSet>`, as under the hood we can still use the `DefaultKotlinSourceSet` type for the items.
This commit is contained in:
+9
-5
@@ -37,18 +37,20 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
@Test
|
@Test
|
||||||
fun testLibAndApp() = doTestLibAndApp(
|
fun testLibAndApp() = doTestLibAndApp(
|
||||||
"sample-lib",
|
"sample-lib",
|
||||||
"sample-app",
|
"sample-app"
|
||||||
gradleVersion
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp(
|
fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp(
|
||||||
"sample-lib-gradle-kotlin-dsl",
|
"sample-lib-gradle-kotlin-dsl",
|
||||||
"sample-app-gradle-kotlin-dsl",
|
"sample-app-gradle-kotlin-dsl",
|
||||||
GradleVersionRequired.AtLeast("4.10.2") // Using a SNAPSHOT version in the plugins DSL requires 4.10
|
GradleVersionRequired.AtLeast("4.9") // earlier Gradle versions fail at accessors codegen
|
||||||
)
|
)
|
||||||
|
|
||||||
fun doTestLibAndApp(libProjectName: String, appProjectName: String, gradleVersionRequired: GradleVersionRequired) {
|
private fun doTestLibAndApp(
|
||||||
|
libProjectName: String, appProjectName: String,
|
||||||
|
gradleVersionRequired: GradleVersionRequired = gradleVersion
|
||||||
|
) {
|
||||||
val libProject = transformProjectWithPluginsDsl(libProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
|
val libProject = transformProjectWithPluginsDsl(libProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
|
||||||
val appProject = transformProjectWithPluginsDsl(appProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
|
val appProject = transformProjectWithPluginsDsl(appProjectName, gradleVersionRequired, "new-mpp-lib-and-app")
|
||||||
val oldStyleAppProject = Project("sample-old-style-app", gradleVersionRequired, "new-mpp-lib-and-app")
|
val oldStyleAppProject = Project("sample-old-style-app", gradleVersionRequired, "new-mpp-lib-and-app")
|
||||||
@@ -234,7 +236,9 @@ class NewMultiplatformIT : BaseGradleIT() {
|
|||||||
classesWithoutJava = getFilePathsSet("build/classes")
|
classesWithoutJava = getFilePathsSet("build/classes")
|
||||||
}
|
}
|
||||||
|
|
||||||
gradleBuildScript().modify { it.replace("presets.jvm", "presets.jvmWithJava") }
|
gradleBuildScript().modify {
|
||||||
|
it.replace("presets.jvm", "presets.jvmWithJava").replace("jvm(", "targetFromPreset(presets.jvmWithJava, ")
|
||||||
|
}
|
||||||
|
|
||||||
projectDir.resolve("src/main/java").apply {
|
projectDir.resolve("src/main/java").apply {
|
||||||
mkdirs()
|
mkdirs()
|
||||||
|
|||||||
+4
-4
@@ -21,11 +21,11 @@ kotlin {
|
|||||||
macosX64("macos64")
|
macosX64("macos64")
|
||||||
|
|
||||||
targets.all {
|
targets.all {
|
||||||
mavenPublication {
|
mavenPublication(Action<MavenPublication> {
|
||||||
pom.withXml {
|
pom.withXml(Action<XmlProvider> {
|
||||||
asNode().appendNode("name", "Sample MPP library")
|
asNode().appendNode("name", "Sample MPP library")
|
||||||
}
|
})
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
|||||||
+2
-2
@@ -38,9 +38,9 @@ open class KotlinProjectExtension {
|
|||||||
val experimental: ExperimentalExtension
|
val experimental: ExperimentalExtension
|
||||||
get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java)
|
get() = DslObject(this).extensions.getByType(ExperimentalExtension::class.java)
|
||||||
|
|
||||||
var sourceSets: NamedDomainObjectContainer<out KotlinSourceSet>
|
var sourceSets: NamedDomainObjectContainer<KotlinSourceSet>
|
||||||
@Suppress("UNCHECKED_CAST")
|
@Suppress("UNCHECKED_CAST")
|
||||||
get() = DslObject(this).extensions.getByName("sourceSets") as NamedDomainObjectContainer<out KotlinSourceSet>
|
get() = DslObject(this).extensions.getByName("sourceSets") as NamedDomainObjectContainer<KotlinSourceSet>
|
||||||
internal set(value) {
|
internal set(value) {
|
||||||
DslObject(this).extensions.add("sourceSets", value)
|
DslObject(this).extensions.add("sourceSets", value)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.plugin
|
package org.jetbrains.kotlin.gradle.plugin
|
||||||
|
|
||||||
|
import org.gradle.api.NamedDomainObjectFactory
|
||||||
import org.gradle.api.Plugin
|
import org.gradle.api.Plugin
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.internal.FeaturePreviews
|
import org.gradle.api.internal.FeaturePreviews
|
||||||
@@ -28,7 +29,6 @@ import org.jetbrains.kotlin.gradle.dsl.*
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
|
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory
|
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
|
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE
|
||||||
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP
|
import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP
|
||||||
import java.io.FileNotFoundException
|
import java.io.FileNotFoundException
|
||||||
@@ -44,7 +44,7 @@ abstract class KotlinBasePluginWrapper(
|
|||||||
|
|
||||||
open val projectExtensionClass: KClass<out KotlinProjectExtension> get() = KotlinProjectExtension::class
|
open val projectExtensionClass: KClass<out KotlinProjectExtension> get() = KotlinProjectExtension::class
|
||||||
|
|
||||||
internal open fun kotlinSourceSetFactory(project: Project): KotlinSourceSetFactory<out KotlinSourceSet> =
|
internal open fun kotlinSourceSetFactory(project: Project): NamedDomainObjectFactory<KotlinSourceSet> =
|
||||||
DefaultKotlinSourceSetFactory(project, fileResolver)
|
DefaultKotlinSourceSetFactory(project, fileResolver)
|
||||||
|
|
||||||
override fun apply(project: Project) {
|
override fun apply(project: Project) {
|
||||||
@@ -64,8 +64,8 @@ abstract class KotlinBasePluginWrapper(
|
|||||||
val kotlinGradleBuildServices = KotlinGradleBuildServices.getInstance(project.gradle)
|
val kotlinGradleBuildServices = KotlinGradleBuildServices.getInstance(project.gradle)
|
||||||
|
|
||||||
project.createKotlinExtension(projectExtensionClass).apply {
|
project.createKotlinExtension(projectExtensionClass).apply {
|
||||||
fun <T : KotlinSourceSet> kotlinSourceSetContainer(factory: KotlinSourceSetFactory<T>) =
|
fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory<KotlinSourceSet>) =
|
||||||
project.container(factory.itemClass, factory)
|
project.container(KotlinSourceSet::class.java, factory)
|
||||||
|
|
||||||
project.kotlinExtension.sourceSets = kotlinSourceSetContainer(kotlinSourceSetFactory(project))
|
project.kotlinExtension.sourceSets = kotlinSourceSetContainer(kotlinSourceSetFactory(project))
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ import java.io.File
|
|||||||
internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal constructor(
|
internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal constructor(
|
||||||
protected val fileResolver: FileResolver,
|
protected val fileResolver: FileResolver,
|
||||||
protected val project: Project
|
protected val project: Project
|
||||||
) : NamedDomainObjectFactory<T> {
|
) : NamedDomainObjectFactory<KotlinSourceSet> {
|
||||||
|
|
||||||
abstract val itemClass: Class<T>
|
abstract val itemClass: Class<T>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user