From 3ff2bc403cb64cee273833d4dbbaf6d8c928edbc Mon Sep 17 00:00:00 2001 From: Anton Lakotka Date: Fri, 23 Feb 2024 13:15:28 +0100 Subject: [PATCH] [Gradle] Report warning when there is multiple source roots in compilation This issue should warn users about possible problems in K2 compiler. Because in this setup there will be no symbols visibility between those source set roots as it used to be in K1. There is an assumption that this case usually appears in the code generation setup. And users might not experience any problems before. ^KT-64913 Verification Pending --- .../diagnostics/KotlinToolingDiagnostics.kt | 61 ++++++++++ ...tipleSourceSetRootsInCompilationChecker.kt | 103 ++++++++++++++++ .../plugin/registerKotlinPluginExtensions.kt | 1 + ...MultipleSourceSetRootsInCompilationTest.kt | 110 ++++++++++++++++++ .../kotlin/gradle/util/diagnosticUtils.kt | 5 +- .../customCompilations.txt | 20 ++++ .../extraSourceSetInEachTarget.txt | 87 ++++++++++++++ .../secondCommonMain.txt | 23 ++++ .../commonMainOrTestWithDependsOn.txt | 56 +++++++++ .../kotlinCompilationSourceDeprecation.txt | 13 ++- 10 files changed, 476 insertions(+), 3 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MultipleSourceSetRootsInCompilationChecker.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MultipleSourceSetRootsInCompilationTest.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/customCompilations.txt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/extraSourceSetInEachTarget.txt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/secondCommonMain.txt diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt index 2ca7873bc09..9fc9bac00a7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnostics.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinSourceSetConvention.isRegisteredByK import org.jetbrains.kotlin.gradle.dsl.NativeTargetShortcutTrace import org.jetbrains.kotlin.gradle.internal.KOTLIN_BUILD_TOOLS_API_IMPL import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinTarget import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider @@ -98,6 +99,66 @@ object KotlinToolingDiagnostics { } } + object MultipleSourceSetRootsInCompilation : ToolingDiagnosticFactory(WARNING) { + operator fun invoke( + kotlinCompilation: KotlinCompilation<*>, + unexpectedSourceSetRoot: String, + expectedRoot: String, + ): ToolingDiagnostic = build( + """ + Kotlin Source Set '$unexpectedSourceSetRoot' is included to '${kotlinCompilation.name}' compilation of '${kotlinCompilation.target.name}' target, + but it doesn't depend on '$expectedRoot'. + + Please remove '$unexpectedSourceSetRoot' and include its sources to the compilation's default source set: + + kotlin.sourceSets["${kotlinCompilation.defaultSourceSet.name}"].kotlin.srcDir() // <-- pass sources directory of '$unexpectedSourceSetRoot' + + Or provide explicit dependency if the solution above is not applicable + + kotlin.sourceSets["$unexpectedSourceSetRoot"].dependsOn($expectedRoot) + + See https://kotl.in/connecting-source-sets for more details. + """.trimIndent() + ) + + operator fun invoke( + targetNames: Collection, + unexpectedSourceSetRoot: String, + expectedRoot: String, + ): ToolingDiagnostic = build( + """ + Kotlin Source Set '$unexpectedSourceSetRoot' is included in compilations of Kotlin Targets: ${targetNames.joinToString(", ") { "'$it'" }} + but it doesn't depend on '$expectedRoot' + + Please remove '$unexpectedSourceSetRoot' and include its sources to one of the default source set: https://kotl.in/hierarchy-template + For example: + + kotlin.sourceSets.commonMain.kotlin.srcDir() // <-- pass here sources directory + + Or add explicit dependency if the solution above is not applicable: + + kotlin.sourceSets["$unexpectedSourceSetRoot"].dependsOn($expectedRoot) + + See https://kotl.in/connecting-source-sets for more details. + """.trimIndent() + ) + + operator fun invoke(kotlinCompilation: KotlinCompilation<*>, sourceSetRoots: Collection) = build( + """ + Kotlin Source Sets: ${sourceSetRoots.joinToString(", ") { "'$it'" }} + are included to '${kotlinCompilation.name}' compilation of '${kotlinCompilation.target.name}' target. + However, they have no common source set root between them. + + Please remove these kotlin source sets and include their source directories to the compilation's default source set. + + kotlin.sourceSets["${kotlinCompilation.defaultSourceSet.name}"].kotlin.srcDir() // <-- pass sources directories here + + Or, if the solution above is not applicable, specify `dependsOn` edges between these source sets so that there are no multiple roots. + See https://kotl.in/connecting-source-sets for more details. + """.trimIndent() + ) + } + object AndroidSourceSetLayoutV1Deprecation : ToolingDiagnosticFactory(ERROR) { operator fun invoke() = build( """ diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MultipleSourceSetRootsInCompilationChecker.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MultipleSourceSetRootsInCompilationChecker.kt new file mode 100644 index 00000000000..5f7084ce9c5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/checkers/MultipleSourceSetRootsInCompilationChecker.kt @@ -0,0 +1,103 @@ +/* + * Copyright 2010-2024 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.diagnostics.checkers + +import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.ReadyForExecution +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet.Companion.COMMON_MAIN_SOURCE_SET_NAME +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet.Companion.COMMON_TEST_SOURCE_SET_NAME +import org.jetbrains.kotlin.gradle.plugin.await +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectChecker +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinGradleProjectCheckerContext +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics.MultipleSourceSetRootsInCompilation +import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnosticsCollector +import org.jetbrains.kotlin.gradle.plugin.mpp.isMain +import org.jetbrains.kotlin.gradle.plugin.mpp.isTest +import org.jetbrains.kotlin.gradle.plugin.sources.internal +import org.jetbrains.kotlin.gradle.plugin.sources.withDependsOnClosure + +internal object MultipleSourceSetRootsInCompilationChecker : KotlinGradleProjectChecker { + + private fun KotlinCompilation<*>.sourceSetRoots() = kotlinSourceSets.withDependsOnClosure.filter { it.dependsOn.isEmpty() } + + override suspend fun KotlinGradleProjectCheckerContext.runChecks(collector: KotlinToolingDiagnosticsCollector) { + // Await for the last Stage and perform check to ensure that the final state is correct. + ReadyForExecution.await() + + val targets = multiplatformExtension?.awaitTargets() ?: return + + val (allDefaultCompilationsWithMultipleRoots, allNonDefaultCompilationsWithMultipleRoots) = targets + // Exclude metadata target because users don't declare it explicitly, and we don't want to ask them to configure it. + // If some metadata compilation has multiple source set roots, + // then underlying platform compilations should report the same. + .filter { it.platformType != KotlinPlatformType.common } + .flatMap { it.compilations } + .filter { it.sourceSetRoots().size > 1 } + .partition { it.isMain() || it.isTest() } + + collector.reportForDefaultPlatformCompilations(allDefaultCompilationsWithMultipleRoots) + collector.reportForNonDefaultCompilations(allNonDefaultCompilationsWithMultipleRoots) + } + + /** + * Report for 'main' and 'test' compilations. + * These are special because we know that all source sets should depend on `commonMain` or `commonTest` accordingly. + */ + private fun KotlinToolingDiagnosticsCollector.reportForDefaultPlatformCompilations(compilations: Collection>) { + // Some source sets can be included in multiple compilations we don't want to report a diagnostic for each case. + val alreadyReportedSourceSet = mutableSetOf() + + for (compilation in compilations) { + val expectedSourceSetRoot = when { + compilation.isMain() -> COMMON_MAIN_SOURCE_SET_NAME + compilation.isTest() -> COMMON_TEST_SOURCE_SET_NAME + else -> continue + } + + val unexpectedSourceSetRoots = compilation.sourceSetRoots().filter { it.name != expectedSourceSetRoot } + // In most cases, I expect to have only 1 unexpected source set root. + // So it is ok to report diagnostic for each unexpectedSourceSetRoot. + unexpectedSourceSetRoots.forEach { unexpectedSourceSetRoot -> + if (!alreadyReportedSourceSet.add(unexpectedSourceSetRoot)) return@forEach + + val includedIntoCompilations = unexpectedSourceSetRoot.internal + .compilations + .filter { it.platformType != KotlinPlatformType.common } + if (includedIntoCompilations.isEmpty()) return@forEach // this case is handled by a different diagnostic + val singleCompilation = includedIntoCompilations.singleOrNull() + + val diagnostic = if (singleCompilation != null) { + MultipleSourceSetRootsInCompilation( + singleCompilation, + unexpectedSourceSetRoot.name, + expectedSourceSetRoot + ) + } else { + MultipleSourceSetRootsInCompilation( + targetNames = includedIntoCompilations.map { it.target.name }, + unexpectedSourceSetRoot.name, + expectedSourceSetRoot + ) + } + + report(compilation.project, diagnostic) + } + } + } + + /** + * For non-default compilations, we don't know which of the multiple source set roots should win so report diagnostic differently + */ + private fun KotlinToolingDiagnosticsCollector.reportForNonDefaultCompilations(compilations: Collection>) { + for (compilation in compilations) { + // Exclude android compilations as they might incorrectly report due to connection to android source sets + // where no dependsOn relations don't have to be declared. + if (compilation.target.platformType == KotlinPlatformType.androidJvm) continue + val diagnostic = MultipleSourceSetRootsInCompilation(compilation, compilation.sourceSetRoots().map { it.name }) + report(compilation.project, diagnostic) + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt index 555ac3bf9e3..fb1a638e6fa 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt @@ -141,6 +141,7 @@ internal fun Project.registerKotlinPluginExtensions() { if (isMultiplatform) { register(project, KotlinMultiplatformAndroidGradlePluginCompatibilityChecker) + register(project, MultipleSourceSetRootsInCompilationChecker) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MultipleSourceSetRootsInCompilationTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MultipleSourceSetRootsInCompilationTest.kt new file mode 100644 index 00000000000..4b851eb00a9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/diagnosticsTests/MultipleSourceSetRootsInCompilationTest.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2010-2024 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. + */ +@file:Suppress("FunctionName") + +package org.jetbrains.kotlin.gradle.unitTests.diagnosticsTests + +import org.gradle.api.Project +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinTarget +import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName +import org.jetbrains.kotlin.gradle.util.* +import org.jetbrains.kotlin.gradle.util.checkDiagnosticsWithMppProject +import kotlin.test.Test + +class MultipleSourceSetRootsInCompilationTest { + private fun checkDiagnostics(name: String, projectConfiguration: Project.() -> Unit) = + checkDiagnosticsWithMppProject("MultipleSourceSetRootsInCompilationTest/${name}", projectConfiguration) + + @Test + fun extraSourceSetInEachTarget() { + // It is expected to see diagnostic reported for each extra source set + checkDiagnostics("extraSourceSetInEachTarget") { + kotlin { + fun KotlinTarget.addExtraSourceSets() { + val extraMain = project.multiplatformExtension.sourceSets.create(disambiguateName("extraMain")) + val extraTest = project.multiplatformExtension.sourceSets.create(disambiguateName("extraTest")) + compilations.getByName("main").defaultSourceSet.dependsOn(extraMain) + compilations.getByName("test").defaultSourceSet.dependsOn(extraTest) + } + + jvm { + addExtraSourceSets() + } + + js { + nodejs() + addExtraSourceSets() + } + + linuxX64 { + addExtraSourceSets() + } + } + } + } + + @Test + fun secondCommonMain() { + // commonMain2 is included to multiple targets, but it is expected to see only 1 diagnostic reported + checkDiagnostics("secondCommonMain") { + kotlin { + val commonMain2 = sourceSets.create("commonMain2") + listOf(jvm(), js { nodejs() }, linuxX64()).forEach { + it.compilations.getByName("main").defaultSourceSet.dependsOn(commonMain2) + } + } + } + } + + @Test + fun customCompilations() { + checkDiagnostics("customCompilations") { + // Diagnostic should be reported only for JVM target. + // Because of ambiguity between commonIntegrationTest and jvmIntegrationTest2. + kotlin { + val commonIntegrationTest = sourceSets.create("commonIntegrationTest") + val jvmIntegrationTest2 = sourceSets.create("jvmIntegrationTest2") + + jvm { + val integrationTest = compilations.create("integrationTest") + integrationTest.defaultSourceSet.dependsOn(commonIntegrationTest) + integrationTest.defaultSourceSet.dependsOn(jvmIntegrationTest2) + } + + linuxX64 { + compilations.create("integrationTest").defaultSourceSet.dependsOn(commonIntegrationTest) + } + + js { nodejs() } + } + } + } + + @Test + fun androidProjectWithMultipleVariants() { + val project = buildProjectWithMPP { + androidApplication { + compileSdk = 33 + + flavorDimensions.add("country") + productFlavors { + create("arstozka") { it.dimension = "country" } + create("kolechia") { it.dimension = "country" } + } + } + + kotlin { + linuxX64() + androidTarget { + + } + } + } + + project.evaluate() + project.assertNoDiagnostics() + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt index 54006bb68aa..5dcf2c6208e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/util/diagnosticUtils.kt @@ -15,12 +15,13 @@ import java.nio.file.Path import kotlin.test.assertTrue import kotlin.test.fail -internal fun checkDiagnosticsWithMppProject(projectName: String, projectConfiguration: Project.() -> Unit) { +internal fun checkDiagnosticsWithMppProject(expectedDiagnosticsFile: String, projectConfiguration: Project.() -> Unit) { + val projectName = File(expectedDiagnosticsFile).name val project = buildProjectWithMPP(projectBuilder = { withName(projectName) }) project.setMultiplatformAndroidSourceSetLayoutVersion(2) project.projectConfiguration() project.evaluate() - project.checkDiagnostics(projectName) + project.checkDiagnostics(expectedDiagnosticsFile) } internal fun ToolingDiagnostic.equals(that: ToolingDiagnostic, ignoreThrowable: Boolean) = if (ignoreThrowable) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/customCompilations.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/customCompilations.txt new file mode 100644 index 00000000000..164a696c694 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/customCompilations.txt @@ -0,0 +1,20 @@ +[KotlinDefaultHierarchyFallbackDependsOnUsageDetected | WARNING] The Default Kotlin Hierarchy Template was not applied to 'root project 'customCompilations'': +Explicit .dependsOn() edges were configured for the following source sets: +[jvmIntegrationTest, linuxX64IntegrationTest] + +Consider removing dependsOn-calls or disabling the default template by adding + 'kotlin.mpp.applyDefaultHierarchyTemplate=false' +to your gradle.properties + +Learn more about hierarchy templates: https://kotl.in/hierarchy-template +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Sets: 'commonIntegrationTest', 'jvmIntegrationTest2' +are included to 'integrationTest' compilation of 'jvm' target. +However, they have no common source set root between them. + +Please remove these kotlin source sets and include their source directories to the compilation's default source set. + + kotlin.sourceSets["jvmIntegrationTest"].kotlin.srcDir() // <-- pass sources directories here + +Or, if the solution above is not applicable, specify `dependsOn` edges between these source sets so that there are no multiple roots. +See https://kotl.in/connecting-source-sets for more details. diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/extraSourceSetInEachTarget.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/extraSourceSetInEachTarget.txt new file mode 100644 index 00000000000..590011b345b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/extraSourceSetInEachTarget.txt @@ -0,0 +1,87 @@ +[KotlinDefaultHierarchyFallbackDependsOnUsageDetected | WARNING] The Default Kotlin Hierarchy Template was not applied to 'root project 'extraSourceSetInEachTarget'': +Explicit .dependsOn() edges were configured for the following source sets: +[jsMain, jsTest, jvmMain, jvmTest, linuxX64Main, linuxX64Test] + +Consider removing dependsOn-calls or disabling the default template by adding + 'kotlin.mpp.applyDefaultHierarchyTemplate=false' +to your gradle.properties + +Learn more about hierarchy templates: https://kotl.in/hierarchy-template +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'jsExtraMain' is included to 'main' compilation of 'js' target, +but it doesn't depend on 'commonMain'. + +Please remove 'jsExtraMain' and include its sources to the compilation's default source set: + + kotlin.sourceSets["jsMain"].kotlin.srcDir() // <-- pass sources directory of 'jsExtraMain' + +Or provide explicit dependency if the solution above is not applicable + + kotlin.sourceSets["jsExtraMain"].dependsOn(commonMain) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'jsExtraTest' is included to 'test' compilation of 'js' target, +but it doesn't depend on 'commonTest'. + +Please remove 'jsExtraTest' and include its sources to the compilation's default source set: + + kotlin.sourceSets["jsTest"].kotlin.srcDir() // <-- pass sources directory of 'jsExtraTest' + +Or provide explicit dependency if the solution above is not applicable + + kotlin.sourceSets["jsExtraTest"].dependsOn(commonTest) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'jvmExtraMain' is included to 'main' compilation of 'jvm' target, +but it doesn't depend on 'commonMain'. + +Please remove 'jvmExtraMain' and include its sources to the compilation's default source set: + + kotlin.sourceSets["jvmMain"].kotlin.srcDir() // <-- pass sources directory of 'jvmExtraMain' + +Or provide explicit dependency if the solution above is not applicable + + kotlin.sourceSets["jvmExtraMain"].dependsOn(commonMain) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'jvmExtraTest' is included to 'test' compilation of 'jvm' target, +but it doesn't depend on 'commonTest'. + +Please remove 'jvmExtraTest' and include its sources to the compilation's default source set: + + kotlin.sourceSets["jvmTest"].kotlin.srcDir() // <-- pass sources directory of 'jvmExtraTest' + +Or provide explicit dependency if the solution above is not applicable + + kotlin.sourceSets["jvmExtraTest"].dependsOn(commonTest) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'linuxX64ExtraMain' is included to 'main' compilation of 'linuxX64' target, +but it doesn't depend on 'commonMain'. + +Please remove 'linuxX64ExtraMain' and include its sources to the compilation's default source set: + + kotlin.sourceSets["linuxX64Main"].kotlin.srcDir() // <-- pass sources directory of 'linuxX64ExtraMain' + +Or provide explicit dependency if the solution above is not applicable + + kotlin.sourceSets["linuxX64ExtraMain"].dependsOn(commonMain) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'linuxX64ExtraTest' is included to 'test' compilation of 'linuxX64' target, +but it doesn't depend on 'commonTest'. + +Please remove 'linuxX64ExtraTest' and include its sources to the compilation's default source set: + + kotlin.sourceSets["linuxX64Test"].kotlin.srcDir() // <-- pass sources directory of 'linuxX64ExtraTest' + +Or provide explicit dependency if the solution above is not applicable + + kotlin.sourceSets["linuxX64ExtraTest"].dependsOn(commonTest) + +See https://kotl.in/connecting-source-sets for more details. \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/secondCommonMain.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/secondCommonMain.txt new file mode 100644 index 00000000000..b002f4eee7d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/MultipleSourceSetRootsInCompilationTest/secondCommonMain.txt @@ -0,0 +1,23 @@ +[KotlinDefaultHierarchyFallbackDependsOnUsageDetected | WARNING] The Default Kotlin Hierarchy Template was not applied to 'root project 'secondCommonMain'': +Explicit .dependsOn() edges were configured for the following source sets: +[jsMain, jvmMain, linuxX64Main] + +Consider removing dependsOn-calls or disabling the default template by adding + 'kotlin.mpp.applyDefaultHierarchyTemplate=false' +to your gradle.properties + +Learn more about hierarchy templates: https://kotl.in/hierarchy-template +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'commonMain2' is included in compilations of Kotlin Targets: 'jvm', 'js', 'linuxX64' +but it doesn't depend on 'commonMain' + +Please remove 'commonMain2' and include its sources to one of the default source set: https://kotl.in/hierarchy-template +For example: + + kotlin.sourceSets.commonMain.kotlin.srcDir() // <-- pass here sources directory + +Or add explicit dependency if the solution above is not applicable: + + kotlin.sourceSets["commonMain2"].dependsOn(commonMain) + +See https://kotl.in/connecting-source-sets for more details. diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/commonMainOrTestWithDependsOn.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/commonMainOrTestWithDependsOn.txt index 45c33a6ef46..dcfd1b6d2d3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/commonMainOrTestWithDependsOn.txt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/commonMainOrTestWithDependsOn.txt @@ -1,3 +1,59 @@ [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonMain can't declare dependsOn on other source sets ---- [CommonMainOrTestWithDependsOnDiagnostic | ERROR] commonTest can't declare dependsOn on other source sets +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'myCustomCommonMain' is included in compilations of Kotlin Targets: 'jvm', 'linuxX64' +but it doesn't depend on 'commonMain' + +Please remove 'myCustomCommonMain' and include its sources to one of the default source set: https://kotl.in/hierarchy-template +For example: + + kotlin.sourceSets.commonMain.kotlin.srcDir() // <-- pass here sources directory + +Or add explicit dependency if the solution above is not applicable: + + kotlin.sourceSets["myCustomCommonMain"].dependsOn(commonMain) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'myCustomCommonMain2' is included in compilations of Kotlin Targets: 'jvm', 'linuxX64' +but it doesn't depend on 'commonMain' + +Please remove 'myCustomCommonMain2' and include its sources to one of the default source set: https://kotl.in/hierarchy-template +For example: + + kotlin.sourceSets.commonMain.kotlin.srcDir() // <-- pass here sources directory + +Or add explicit dependency if the solution above is not applicable: + + kotlin.sourceSets["myCustomCommonMain2"].dependsOn(commonMain) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'myCustomCommonTest' is included in compilations of Kotlin Targets: 'jvm', 'linuxX64' +but it doesn't depend on 'commonTest' + +Please remove 'myCustomCommonTest' and include its sources to one of the default source set: https://kotl.in/hierarchy-template +For example: + + kotlin.sourceSets.commonMain.kotlin.srcDir() // <-- pass here sources directory + +Or add explicit dependency if the solution above is not applicable: + + kotlin.sourceSets["myCustomCommonTest"].dependsOn(commonTest) + +See https://kotl.in/connecting-source-sets for more details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Set 'myCustomCommonTest2' is included in compilations of Kotlin Targets: 'jvm', 'linuxX64' +but it doesn't depend on 'commonTest' + +Please remove 'myCustomCommonTest2' and include its sources to one of the default source set: https://kotl.in/hierarchy-template +For example: + + kotlin.sourceSets.commonMain.kotlin.srcDir() // <-- pass here sources directory + +Or add explicit dependency if the solution above is not applicable: + + kotlin.sourceSets["myCustomCommonTest2"].dependsOn(commonTest) + +See https://kotl.in/connecting-source-sets for more details. \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlinCompilationSourceDeprecation.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlinCompilationSourceDeprecation.txt index de616f96b23..c2a03f7f453 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlinCompilationSourceDeprecation.txt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/kotlinCompilationSourceDeprecation.txt @@ -1,4 +1,15 @@ [KotlinCompilationSourceDeprecation | WARNING] `KotlinCompilation.source(KotlinSourceSet)` method is deprecated and will be removed in upcoming Kotlin releases. -See https://kotl.in/compilation-source-deprecation for details. \ No newline at end of file +See https://kotl.in/compilation-source-deprecation for details. +---- +[MultipleSourceSetRootsInCompilation | WARNING] Kotlin Source Sets: 'jvmCustom', 'customMain' +are included to 'custom' compilation of 'jvm' target. +However, they have no common source set root between them. + +Please remove these kotlin source sets and include their source directories to the compilation's default source set. + + kotlin.sourceSets["jvmCustom"].kotlin.srcDir() // <-- pass sources directories here + +Or, if the solution above is not applicable, specify `dependsOn` edges between these source sets so that there are no multiple roots. +See https://kotl.in/connecting-source-sets for more details. \ No newline at end of file