From 4a2e40994848883cc7007485dc87d1ab449e45d2 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 17 Feb 2017 17:55:19 +0300 Subject: [PATCH] Kapt3: Support Kotlin sources generation (KT-14070) --- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 12 ++++++++ .../kapt2/kaptOutputKotlinCode/build.gradle | 29 +++++++++++++++++++ .../src/main/java/test.kt | 10 +++++++ .../internal/Kapt3KotlinGradleSubplugin.kt | 24 ++++++++++----- 4 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/src/main/java/test.kt 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 c61b9c38a77..753d95481b5 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 @@ -318,4 +318,16 @@ class Kapt3IT : BaseGradleIT() { assert(kaptArgs.contains(arg)) { "Kapt compiler arguments should contain '$arg'" } } } + + @Test + fun testOutputKotlinCode() { + Project("kaptOutputKotlinCode", GRADLE_VERSION, directoryPrefix = "kapt2").build("build") { + assertSuccessful() + assertKaptSuccessful() + assertFileExists("build/generated/source/kapt/main/example/TestClassCustomized.java") + assertFileExists("build/generated/source/kaptKotlin/main/TestClass.kt") + assertFileExists("build/classes/main/example/TestClass.class") + assertFileExists("build/classes/main/example/TestClassCustomized.class") + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/build.gradle new file mode 100644 index 00000000000..468a977d902 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + mavenLocal() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: 'kotlin' +apply plugin: 'kotlin-kapt' + +repositories { + mavenLocal() +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:annotation-processor-example:$kotlin_version" + kapt "org.jetbrains.kotlin:annotation-processor-example:$kotlin_version" +} + +kapt { + generateStubs = true + arguments { + arg("suffix", "Customized") + arg("generate.kotlin.code", "true") + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/src/main/java/test.kt new file mode 100644 index 00000000000..a8d981a9cc3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/kaptOutputKotlinCode/src/main/java/test.kt @@ -0,0 +1,10 @@ +package example + +@example.ExampleAnnotation +public class TestClass { + + fun test() { + println(this.customToString()) + } + +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt index e35af2b9b63..2e4a095d5a4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/Kapt3KotlinGradleSubplugin.kt @@ -29,6 +29,7 @@ import org.gradle.api.tasks.compile.JavaCompile import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.android.AndroidGradleWrapper import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.preprocessor.mkdirsOrFail import java.io.ByteArrayOutputStream import java.io.File import java.io.ObjectOutputStream @@ -75,20 +76,28 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { return File(project.project.buildDir, "generated/source/kapt/$sourceSetName") } + fun getKaptGeneratedDirForKotlin(project: Project, sourceSetName: String): File { + return File(project.project.buildDir, "generated/source/kaptKotlin/$sourceSetName") + } + fun getKaptStubsDir(project: Project, sourceSetName: String): File { val dir = File(project.project.buildDir, "tmp/kapt3/stubs/$sourceSetName") dir.mkdirs() return dir } - private class Kapt3SubpluginContext( + private inner class Kapt3SubpluginContext( val project: Project, val kotlinCompile: KotlinCompile, val javaCompile: AbstractCompile, val variantData: Any?, val sourceSetName: String, val kaptExtension: KaptExtension, - val kaptClasspath: MutableList) + val kaptClasspath: MutableList) { + val sourcesOutputDir = getKaptGeneratedDir(project, sourceSetName) + val kotlinSourcesOutputDir = getKaptGeneratedDirForKotlin(project, sourceSetName) + val classesOutputDir = getKaptClasssesDir(project, sourceSetName) + } override fun apply( project: Project, @@ -173,7 +182,11 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { else emptyMap() - val apOptions = kaptExtension.getAdditionalArguments(project, variantData, androidPlugin) + androidOptions + kotlinSourcesOutputDir.mkdirs() + + val apOptions = kaptExtension.getAdditionalArguments(project, variantData, androidPlugin) + + androidOptions + + mapOf("kapt.kotlin.generated" to kotlinSourcesOutputDir.absolutePath) pluginOptions += SubpluginOption("apoptions", encodeAnnotationProcessingOptions(apOptions)) @@ -211,9 +224,6 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { } private fun Kapt3SubpluginContext.createKaptKotlinTask() { - val sourcesOutputDir = getKaptGeneratedDir(project, sourceSetName) - val classesOutputDir = getKaptClasssesDir(project, sourceSetName) - // Replace compile*Kotlin to kapt*Kotlin assert(kotlinCompile.name.startsWith("compile")) val kaptTaskName = kotlinCompile.name.replaceFirst("compile", "kapt") @@ -232,7 +242,7 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { kotlinCompile.dependsOn(kaptTask) // Add generated source dir as a source root for kotlinCompile and javaCompile - kotlinCompile.source(sourcesOutputDir) + kotlinCompile.source(sourcesOutputDir, kotlinSourcesOutputDir) javaCompile.source(sourcesOutputDir) val pluginOptions = kaptTask.pluginOptions