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(