diff --git a/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api b/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api index f60bbc03f46..ce0baa821dd 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api +++ b/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api @@ -1026,6 +1026,7 @@ public abstract interface class org/jetbrains/kotlin/gradle/plugin/KotlinJvmFact public abstract fun registerKaptGenerateStubsTask (Ljava/lang/String;)Lorg/gradle/api/tasks/TaskProvider; public abstract fun registerKaptTask (Ljava/lang/String;)Lorg/gradle/api/tasks/TaskProvider; public abstract fun registerKotlinJvmCompileTask (Ljava/lang/String;)Lorg/gradle/api/tasks/TaskProvider; + public abstract fun registerKotlinJvmCompileTask (Ljava/lang/String;Ljava/lang/String;)Lorg/gradle/api/tasks/TaskProvider; } public final class org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType : java/lang/Enum, java/io/Serializable, org/gradle/api/Named { diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmFactory.kt b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmFactory.kt index 4e8e38f5cbf..b8972a20a72 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmFactory.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinJvmFactory.kt @@ -38,9 +38,25 @@ interface KotlinJvmFactory { fun createCompilerJvmOptions(): KotlinJvmCompilerOptions - /** Creates a Kotlin compile task. */ + /** + * Creates a Kotlin compile task. + */ + @Deprecated( + message = "Replaced by registerKotlinJvmCompileTask with module name", + replaceWith = ReplaceWith("registerKotlinJvmCompileTask(taskName: String, moduleName: String)") + ) fun registerKotlinJvmCompileTask(taskName: String): TaskProvider + + /** + * Creates a Kotlin JVM compile task. + * + * @param taskName The name of the task to be created. + * @param moduleName The name of the module for which the task is being created. + * @return The task provider for the Kotlin JVM compile task. + */ + fun registerKotlinJvmCompileTask(taskName: String, moduleName: String): TaskProvider + /** Creates a stub generation task which creates Java sources stubs from Kotlin sources. */ fun registerKaptGenerateStubsTask(taskName: String): TaskProvider diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt index a5cdeb74797..a2ffedfedb1 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinJvmApiTest.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.tasks import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.testbase.* import org.junit.jupiter.api.DisplayName +import kotlin.io.path.appendText import kotlin.io.path.createDirectories import kotlin.io.path.deleteRecursively import kotlin.io.path.writeText @@ -58,6 +59,45 @@ class KotlinJvmApiTest : KGPBaseTest() { } } + + @DisplayName("KT-60541: checks that configuring custom KotlinCompile does not require using internals") + @JvmGradlePluginTests + @GradleTest + internal fun kotlinCompileCustomTask(gradleVersion: GradleVersion) { + project(projectName = "jvm-with-common", gradleVersion = gradleVersion) { + + val customModuleName = "customModuleName" + val customTaskName = "customTask" + val outputDirName = "customTaskOutput" + buildGradleKts.appendText( + """ + val compileKotlin = tasks.getByName("compileKotlinJvm") as KotlinCompile + + apply() + + val myCustomTask = plugins + .findPlugin(KotlinBaseApiPlugin::class)!! + .registerKotlinJvmCompileTask("$customTaskName", moduleName = "$customModuleName") + + myCustomTask { + source("src/jvmMain", "src/commonMain") + libraries.from(compileKotlin.libraries) + useModuleDetection.set(false) + multiPlatformEnabled.set(false) + destinationDirectory.set(File(project.buildDir, "$outputDirName")) + } + """.trimIndent() + ) + + build(customTaskName) { + assertOutputDoesNotContain("No value has been specified for property 'ownModuleName'") + assertFileInProjectExists("build/$outputDirName/org/example/application/MainKt.class") + assertFileInProjectExists("build/$outputDirName/org/example/Lib.class") + assertFileInProjectExists("build/$outputDirName/META-INF/$customModuleName.kotlin_module") + } + } + } + @DisplayName("KAPT can be set up using APIs") @OtherGradlePluginTests @GradleTestVersions(minVersion = TestVersions.Gradle.G_7_0) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/build.gradle.kts new file mode 100644 index 00000000000..41bce198d5c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/build.gradle.kts @@ -0,0 +1,15 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.plugin.KotlinBaseApiPlugin + +plugins { + kotlin("multiplatform") +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin { + jvm() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/src/commonMain/kotlin/org/example/Lib.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/src/commonMain/kotlin/org/example/Lib.kt new file mode 100644 index 00000000000..d987652a8a6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/src/commonMain/kotlin/org/example/Lib.kt @@ -0,0 +1,5 @@ +package org.example + +class Lib { + val hello = "Hello from lib" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/src/jvmMain/kotlin/org.example.application/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/src/jvmMain/kotlin/org.example.application/Main.kt new file mode 100644 index 00000000000..4d6b9f4e696 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/jvm-with-common/src/jvmMain/kotlin/org.example.application/Main.kt @@ -0,0 +1,7 @@ +package org.example.application + +import org.example.Lib + +fun main() { + println(Lib().hello) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinBaseApiPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinBaseApiPlugin.kt index c8c561451c6..e4885151379 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinBaseApiPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinBaseApiPlugin.kt @@ -64,6 +64,10 @@ abstract class KotlinBaseApiPlugin : DefaultKotlinBasePlugin(), KotlinJvmFactory myProject.objects.newInstance(KaptExtension::class.java) } + @Deprecated( + message = "Replaced by registerKotlinJvmCompileTask with module name", + replaceWith = ReplaceWith("registerKotlinJvmCompileTask(taskName: String, moduleName: String)") + ) override fun registerKotlinJvmCompileTask(taskName: String): TaskProvider { return taskCreator.registerKotlinJVMTask( myProject, @@ -73,6 +77,22 @@ abstract class KotlinBaseApiPlugin : DefaultKotlinBasePlugin(), KotlinJvmFactory ) } + override fun registerKotlinJvmCompileTask(taskName: String, moduleName: String): TaskProvider { + val compilerOptions = createCompilerJvmOptions() + compilerOptions.moduleName.set(moduleName) + val registeredKotlinJvmCompileTask = taskCreator.registerKotlinJVMTask( + myProject, + taskName, + compilerOptions, + KotlinCompileConfig(myProject, kotlinExtension) + ) + registeredKotlinJvmCompileTask.configure { + it.ownModuleName.set(compilerOptions.moduleName) + it.moduleName.set(compilerOptions.moduleName) + } + return registeredKotlinJvmCompileTask + } + override fun registerKaptGenerateStubsTask(taskName: String): TaskProvider { val taskConfig = KaptGenerateStubsConfig(myProject, kotlinExtension, kaptExtension) return myProject.registerTask(taskName, KaptGenerateStubsTask::class.java, listOf(myProject)).also { diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt index 9ce4a85eefc..f559a7f62b7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt @@ -31,13 +31,14 @@ class KotlinCompileApiTest { companion object { private const val TASK_NAME = "kotlinCompile" + private const val MODULE_NAME = "customModuleName" } @Before fun setUpProject() { project = buildProject {} plugin = project.plugins.apply(KotlinApiPlugin::class.java) - plugin.registerKotlinJvmCompileTask(TASK_NAME).configure { task -> + plugin.registerKotlinJvmCompileTask(TASK_NAME, MODULE_NAME).configure { task -> taskApi = task } taskImpl = project.tasks.getByName(TASK_NAME) as KotlinCompile