From fe64d33ae41818a5b0baade23295e8ce22e81676 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Mon, 12 Nov 2018 17:21:34 +0300 Subject: [PATCH] Add `defaultSourceSet` to `KotlinCompilation` Previously, the connection between a `KotlinCompilation` and its default `KotlinSourceSet` (the one automatically created and added into the compilation) was not expressed in the MPP model in any reasonable way that can be used in the build scripts. However, this connection seems to have settled in the build logic, and it may be useful to be able to get the default source set from a compilation, for example, to be able to configure dependencies across several targets in a uniform way. The metadata compilations don't have their dedicated source sets, but we can think of commonMain as a default source set for the project's metadata, is it is currently in fact only contains the declarations from commonMain. Issue #KT-27685 Fixed --- .../kotlin/gradle/plugin/KotlinCompilation.kt | 4 +++ .../kotlin/gradle/NewMultiplatformIT.kt | 36 +++++++++++++++++++ .../gradle/plugin/mpp/kotlinCompilations.kt | 16 +++++++++ 3 files changed, 56 insertions(+) diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt index f3e0cb5bda4..96358d7dc7f 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinCompilation.kt @@ -29,6 +29,10 @@ interface KotlinCompilation : Named, HasAttributes, val kotlinSourceSets: Set + val defaultSourceSet: KotlinSourceSet + + fun defaultSourceSet(configure: KotlinSourceSet.() -> Unit) + val compileDependencyConfigurationName: String var compileDependencyFiles: FileCollection diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt index 6870e958b20..2fa28392ab3 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/NewMultiplatformIT.kt @@ -1114,6 +1114,42 @@ class NewMultiplatformIT : BaseGradleIT() { } } + @Test + fun testDefaultSourceSetsDsl() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) { + setupWorkingDir() + + val testOutputPrefix = "# default source set " + val testOutputRegex = Regex("${Regex.escape(testOutputPrefix)} (.*?) (.*?) (.*)") + + gradleBuildScript().appendText( + "\n" + """ + kotlin.targets.each { target -> + target.compilations.each { compilation -> + println "$testOutputPrefix ${'$'}{target.name} ${'$'}{compilation.name} ${'$'}{compilation.defaultSourceSet.name}" + } + } + """.trimIndent() + ) + + build { + assertSuccessful() + + val actualDefaultSourceSets = testOutputRegex.findAll(output).mapTo(mutableSetOf()) { + it.groupValues.let { (_, target, compilation, sourceSet) -> Triple(target, compilation, sourceSet) } + } + + val expectedDefaultSourceSets = listOf( + "jvm6", "nodeJs", "wasm32", "mingw64", "linux64", "macos64" + ).flatMapTo(mutableSetOf()) { target -> + listOf("main", "test").map { compilation -> + Triple(target, compilation, "$target${compilation.capitalize()}") + } + } + Triple("metadata", "main", "commonMain") + + assertEquals(expectedDefaultSourceSets, actualDefaultSourceSets) + } + } + @Test fun testUnusedSourceSetsReport() = with(Project("sample-lib", gradleVersion, "new-mpp-lib-and-app")) { setupWorkingDir() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt index 5363a423217..565c9ac1bbe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/kotlinCompilations.kt @@ -80,6 +80,12 @@ abstract class AbstractKotlinCompilation( override val kotlinSourceSets: MutableSet = mutableSetOf() + override val defaultSourceSet: KotlinSourceSet + get() = target.project.kotlinExtension.sourceSets.getByName(defaultSourceSetName) + + override fun defaultSourceSet(configure: KotlinSourceSet.() -> Unit) = + configure(defaultSourceSet) + override val output: KotlinCompilationOutput by lazy { DefaultKotlinCompilationOutput( target.project, @@ -285,6 +291,16 @@ class KotlinCommonCompilation( ) : AbstractKotlinCompilation(target, name) { override val compileKotlinTask: KotlinCompileCommon get() = super.compileKotlinTask as KotlinCompileCommon + + // TODO once we properly compile metadata for each source set, the default source sets will likely become just the source sets + // which are transformed to metadata + private val commonSourceSetName = when (compilationName) { + KotlinCompilation.MAIN_COMPILATION_NAME -> KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME + else -> error("Custom metadata compilations are not supported yet") + } + + override val defaultSourceSet: KotlinSourceSet + get() = target.project.kotlinExtension.sourceSets.getByName(commonSourceSetName) } class KotlinNativeCompilation(