From 7893bb60a6680d6cd12f2b833b372559997353d3 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 18 Oct 2018 17:41:57 +0300 Subject: [PATCH] Kapt: Using 'kapt' configuration without the 'kotlin-kapt' plugin applied should throw an error (KT-26145) --- .../org/jetbrains/kotlin/gradle/Kapt3IT.kt | 10 +++++++ .../testProject/kapt2/nokapt/build.gradle | 26 +++++++++++++++++++ .../kapt2/nokapt/src/main/java/foo.kt | 1 + .../kapt/Kapt3KotlinGradleSubplugin.kt | 4 +-- .../kotlin/gradle/plugin/KotlinPlugin.kt | 23 ++++++++++++++-- 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/build.gradle create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/src/main/java/foo.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 597b3378a02..d7bceddc33c 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 @@ -394,6 +394,16 @@ open class Kapt3IT : Kapt3BaseIT() { } } + @Test + fun testNoKaptPluginApplied() { + val project = Project("nokapt", directoryPrefix = "kapt2") + + project.build("build") { + assertFailed() + assertContains("Could not find method kapt() for arguments") + } + } + @Test fun testChangesInLocalAnnotationProcessor() { val project = Project("localAnnotationProcessor", directoryPrefix = "kapt2") diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/build.gradle new file mode 100644 index 00000000000..d9015c5f19b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/build.gradle @@ -0,0 +1,26 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: "java" +apply plugin: "kotlin" + +repositories { + mavenLocal() + mavenCentral() +} + +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" + testCompile 'junit:junit:4.12' +} + +compileKotlin.kotlinOptions.allWarningsAsErrors = true \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/src/main/java/foo.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/src/main/java/foo.kt new file mode 100644 index 00000000000..7de943c30d9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kapt2/nokapt/src/main/java/foo.kt @@ -0,0 +1 @@ +fun main(args: Array) {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt index beae265b112..193ba8eb70a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt @@ -100,7 +100,7 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { val KAPT_SUBPLUGIN_ID = "org.jetbrains.kotlin.kapt3" fun getKaptConfigurationName(sourceSetName: String): String { - return if (sourceSetName != "main") + return if (sourceSetName != SourceSet.MAIN_SOURCE_SET_NAME) "$MAIN_KAPT_CONFIGURATION_NAME${sourceSetName.capitalize()}" else MAIN_KAPT_CONFIGURATION_NAME @@ -122,7 +122,7 @@ class Kapt3KotlinGradleSubplugin : KotlinGradleSubplugin { return hasProperty(INFO_AS_WARNINGS) && property(INFO_AS_WARNINGS) == "true" } - fun findMainKaptConfiguration(project: Project) = project.findKaptConfiguration(MAIN_KAPT_CONFIGURATION_NAME) + fun findMainKaptConfiguration(project: Project) = project.findKaptConfiguration(SourceSet.MAIN_SOURCE_SET_NAME) fun createAptConfigurationIfNeeded(project: Project, sourceSetName: String): Configuration { val configurationName = Kapt3KotlinGradleSubplugin.getKaptConfigurationName(sourceSetName) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index 3028a15005b..376b879b419 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -161,7 +161,10 @@ internal class Kotlin2JvmSourceSetProcessor( tasksProvider.createKotlinJVMTask(project, taskName, kotlinCompilation) override fun doTargetSpecificProcessing() { - Kapt3KotlinGradleSubplugin.createAptConfigurationIfNeeded(project, kotlinCompilation.compilationName) + ifKaptEnabled(project) { + Kapt3KotlinGradleSubplugin.createAptConfigurationIfNeeded(project, kotlinCompilation.compilationName) + } + ScriptingGradleSubplugin.createDiscoveryConfigurationIfNeeded(project, kotlinCompilation.compilationName) project.afterEvaluate { project -> @@ -662,7 +665,10 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationT kotlin.srcDirs(sourceSet.java.srcDirs) } sourceSet.addConvention(KOTLIN_DSL_NAME, kotlinSourceSet) - Kapt3KotlinGradleSubplugin.createAptConfigurationIfNeeded(project, sourceSet.name) + + ifKaptEnabled(project) { + Kapt3KotlinGradleSubplugin.createAptConfigurationIfNeeded(project, sourceSet.name) + } } val kotlinOptions = KotlinJvmOptionsImpl() @@ -840,6 +846,19 @@ internal fun createSyncOutputTask( return syncTask } +private fun ifKaptEnabled(project: Project, block: () -> Unit) { + var triggered = false + + fun trigger() { + if (triggered) return + triggered = true + block() + } + + project.pluginManager.withPlugin("kotlin-kapt") { trigger() } + project.pluginManager.withPlugin("org.jetbrains.kotlin.kapt") { trigger() } +} + private fun SourceSet.clearJavaSrcDirs() { java.setSrcDirs(emptyList()) }