diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt index f32614005bb..5b38dd397e5 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kapt3IT.kt @@ -1180,4 +1180,44 @@ open class Kapt3IT : Kapt3BaseIT() { } } } + + @DisplayName("Kapt-generated Kotlin sources can be used in Kotlin") + @GradleTest + internal fun useGeneratedKotlinSource(gradleVersion: GradleVersion) { + project("useGeneratedKotlinSource".withPrefix, gradleVersion) { + build("build") { + assertKaptSuccessful() + assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin") + } + } + } + + @DisplayName("Kapt-generated Kotlin sources can be used in Kotlin with languageVersion = 2.0") + @GradleTest + internal fun useGeneratedKotlinSourceK2(gradleVersion: GradleVersion) { + project("useGeneratedKotlinSource".withPrefix, gradleVersion) { + buildGradle.appendText( + """ + |tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { + | compilerOptions { + | freeCompilerArgs.addAll([ + | "-Xuse-fir-ic", + | "-Xuse-fir-lt" + | ]) + | } + | kotlinOptions { + | languageVersion = "2.0" + | } + |} + | + |compileKotlin.kotlinOptions.allWarningsAsErrors = false + """.trimMargin() + ) + build("build") { + assertKaptSuccessful() + assertTasksExecuted(":kaptGenerateStubsKotlin", ":kaptKotlin", ":compileKotlin") + assertOutputContains("Falling back to 1.9.") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/build.gradle new file mode 100644 index 00000000000..68578bf5197 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/build.gradle @@ -0,0 +1,17 @@ +plugins { + id "java" + id "org.jetbrains.kotlin.jvm" + id "org.jetbrains.kotlin.kapt" +} + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation(project(":processor")) + kapt(project(":processor")) +} + +compileKotlin.kotlinOptions.allWarningsAsErrors = true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/build.gradle new file mode 100644 index 00000000000..404605016e6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/build.gradle @@ -0,0 +1,11 @@ +plugins { + id "java" + id "org.jetbrains.kotlin.jvm" +} + +repositories { + mavenLocal() + mavenCentral() +} + +compileKotlin.kotlinOptions.allWarningsAsErrors = true diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/src/main/java/GenerateKotlinSourceFile.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/src/main/java/GenerateKotlinSourceFile.kt new file mode 100644 index 00000000000..c60f4cfe25b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/src/main/java/GenerateKotlinSourceFile.kt @@ -0,0 +1,30 @@ +package processor + +import javax.annotation.processing.AbstractProcessor +import javax.annotation.processing.RoundEnvironment +import javax.lang.model.SourceVersion +import javax.lang.model.element.TypeElement +import javax.tools.StandardLocation + +class GenerateKotlinSourceFile : AbstractProcessor() { + override fun process(annotations: Set, roundEnv: RoundEnvironment): Boolean { + val annotation = annotations.singleOrNull() ?: return true + for (type in roundEnv.getElementsAnnotatedWith(annotation)) { + if (type !is TypeElement) continue + val packageName = processingEnv.elementUtils.getPackageOf(type).qualifiedName.toString() + val simpleName = type.simpleName.toString() + "Generated" + val file = processingEnv.filer.createResource(StandardLocation.SOURCE_OUTPUT, "example", "$simpleName.kt", type) + file.openWriter().use { writer -> + writer.write("package $packageName\n\nclass $simpleName") + } + } + + return true + } + + override fun getSupportedSourceVersion(): SourceVersion = + SourceVersion.RELEASE_6 + + override fun getSupportedAnnotationTypes(): Set = + setOf("example.Generate") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor new file mode 100644 index 00000000000..011e206d517 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/processor/src/main/resources/META-INF/services/javax.annotation.processing.Processor @@ -0,0 +1 @@ +processor.GenerateKotlinSourceFile diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/settings.gradle new file mode 100644 index 00000000000..8adb821eab3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/settings.gradle @@ -0,0 +1 @@ +include "processor" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/src/main/java/test.kt new file mode 100644 index 00000000000..841086a9007 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/useGeneratedKotlinSource/src/main/java/test.kt @@ -0,0 +1,8 @@ +package example + +annotation class Generate + +@Generate +class TestClass + +fun testClass(): TestClassGenerated = TestClassGenerated() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt index 48fc8ab4f32..ff807c6c3de 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/tasks/KotlinCompile.kt @@ -230,7 +230,7 @@ abstract class KotlinCompile @Inject constructor( args.javaPackagePrefix = javaPackagePrefix - if (compilerOptions.usesK2.get()) { + if (compilerOptions.usesK2.get() && multiPlatformEnabled.get()) { args.fragments = multiplatformStructure.fragmentsCompilerArgs args.fragmentRefines = multiplatformStructure.fragmentRefinesCompilerArgs }