From 40fa5fb758a38eddcefcb20b9eaa039bfefbf270 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 21 Feb 2017 19:29:26 +0300 Subject: [PATCH] Kapt3: Support 'processors' option in Gradle plugin (KT-8558) Also warn if kapt3 options are used without the "apply plugin: 'kotlin-kapt'" specified. --- .../example/ExampleAnnotationProcessor.kt | 8 +++++- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 15 ++++++++++ .../annotationProcessorAsFqName/build.gradle | 28 +++++++++++++++++++ .../gradle.properties | 1 + .../src/main/java/test.kt | 20 +++++++++++++ .../internal/AnnotationProcessingManager.kt | 8 ++++++ .../internal/Kapt3KotlinGradleSubplugin.kt | 5 ++++ .../kotlin/gradle/plugin/KaptExtension.kt | 2 ++ 8 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/gradle.properties create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/src/main/java/test.kt diff --git a/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt b/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt index 99a387e2c39..34227456f0b 100644 --- a/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt +++ b/libraries/examples/annotation-processor-example/src/main/kotlin/example/ExampleAnnotationProcessor.kt @@ -6,6 +6,7 @@ import javax.annotation.processing.RoundEnvironment import javax.lang.model.SourceVersion import javax.lang.model.element.ElementKind import javax.lang.model.element.TypeElement +import javax.tools.Diagnostic import kotlin.reflect.KClass class ExampleAnnotationProcessor : AbstractProcessor() { @@ -18,6 +19,7 @@ class ExampleAnnotationProcessor : AbstractProcessor() { val SUFFIX_OPTION = "suffix" val GENERATE_KOTLIN_CODE_OPTION = "generate.kotlin.code" + val GENERATE_ERROR = "generate.error" val KAPT_KOTLIN_GENERATED_OPTION = "kapt.kotlin.generated" } @@ -57,11 +59,15 @@ class ExampleAnnotationProcessor : AbstractProcessor() { } } } + + if (options[GENERATE_ERROR] == "true") { + processingEnv.messager.printMessage(Diagnostic.Kind.ERROR, "Error from annotation processor!") + } } override fun getSupportedSourceVersion() = SourceVersion.RELEASE_6 override fun getSupportedAnnotationTypes() = ANNOTATION_TO_PREFIX.keys.map { it.java.canonicalName }.toSet() - override fun getSupportedOptions() = setOf(SUFFIX_OPTION) + override fun getSupportedOptions() = setOf(SUFFIX_OPTION, GENERATE_KOTLIN_CODE_OPTION, GENERATE_ERROR) } \ No newline at end of file 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 753d95481b5..29445dc75a1 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 @@ -43,6 +43,21 @@ class Kapt3IT : BaseGradleIT() { KAPT_SUCCESSFUL_REGEX.findAll(this.output).count() > 0 } + @Test + fun testAnnotationProcessorAsFqName() { + val project = Project("annotationProcessorAsFqName", GRADLE_VERSION, directoryPrefix = "kapt2") + + project.build("build") { + assertSuccessful() + assertKaptSuccessful() + assertContains(":compileKotlin") + assertContains(":compileJava") + assertFileExists("build/generated/source/kapt/main/example/TestClassGenerated.java") + assertFileExists("build/classes/main/example/TestClass.class") + assertFileExists("build/classes/main/example/TestClassGenerated.class") + } + } + @Test fun testSimple() { val project = Project("simple", GRADLE_VERSION, directoryPrefix = "kapt2") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/build.gradle new file mode 100644 index 00000000000..60ca5218d8d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/build.gradle @@ -0,0 +1,28 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: "java" +apply plugin: "kotlin" +apply plugin: "kotlin-kapt" + +repositories { + mavenLocal() + mavenCentral() +} + +kapt { + processors = "example.ExampleAnnotationProcessor" +} + +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + kapt "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + compile "org.jetbrains.kotlin:annotation-processor-example:$kotlin_version" +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/gradle.properties new file mode 100644 index 00000000000..dc3793168f1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/gradle.properties @@ -0,0 +1 @@ +kapt.verbose=true \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/src/main/java/test.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/src/main/java/test.kt new file mode 100644 index 00000000000..8df7132280c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/annotationProcessorAsFqName/src/main/java/test.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package example + +@example.ExampleAnnotation +class TestClass \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt index d8f5d735f2d..40c1623e829 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/AnnotationProcessingManager.kt @@ -51,6 +51,14 @@ internal fun Project.initKapt( val kaptExtension = extensions.getByType(KaptExtension::class.java) val kotlinAfterJavaTask: KotlinCompile? + fun warnUnsupportedKapt1Option(optionName: String) { + kotlinTask.logger.kotlinWarn("'$optionName' option is not supported by this kapt implementation. " + + "Please add the \"apply plugin: 'kotlin-kapt\" line to your build script to enable it.") + } + + if (kaptExtension.processors.isNotEmpty()) warnUnsupportedKapt1Option("processors") + if (kaptExtension.correctErrorTypes) warnUnsupportedKapt1Option("correctErrorTypes") + if (kaptExtension.generateStubs) { kotlinAfterJavaTask = createKotlinAfterJavaTask(javaTask, kotlinTask, kotlinOptions, tasksProvider) 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 2e4a095d5a4..04d5c3fbac1 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 @@ -173,6 +173,11 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { pluginOptions += SubpluginOption("sources", generatedFilesDir.canonicalPath) pluginOptions += SubpluginOption("classes", getKaptClasssesDir(project, sourceSetName).canonicalPath) + val annotationProcessors = kaptExtension.processors + if (annotationProcessors.isNotEmpty()) { + pluginOptions += SubpluginOption("processors", annotationProcessors) + } + val androidPlugin = variantData?.let { project.extensions.findByName("android") as? BaseExtension } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt index 86819fcfa7b..f49e14fa931 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KaptExtension.kt @@ -30,6 +30,8 @@ open class KaptExtension { open var correctErrorTypes: Boolean = false + open var processors: String = "" + private var closure: Closure<*>? = null open fun arguments(closure: Closure<*>) {