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 ca5502bcb39..f361c95c8b6 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
@@ -111,12 +111,8 @@ private fun Project.createKotlinAfterJavaTask(
this
}
- getAllTasks(false)
- .flatMap { it.value }
- .filter { javaTask in it.taskDependencies.getDependencies(it) }
- .forEach { it.dependsOn(kotlinAfterJavaTask) }
-
kotlinAfterJavaTask.dependsOn(javaTask)
+ javaTask.finalizedByIfNotFailed(kotlinAfterJavaTask)
kotlinAfterJavaTask.extensions.extraProperties.set("defaultModuleName", "${project.name}-${kotlinTask.name}")
if (kotlinOptions != null) {
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 73cad19c81e..9b58815827d 100644
--- 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
@@ -512,15 +512,8 @@ private fun createSyncOutputTask(
kotlinAfterJavaTask?.javaOutputDir = javaDir
// copying should be executed after a latter task
- if (kotlinAfterJavaTask != null) {
- // finalizer tasks get executed even if finalizing task has failed;
- // we want to avoid copying classes if kotlin compilation has failed
- syncTask.onlyIf { kotlinAfterJavaTask.state.failure == null }
- kotlinAfterJavaTask.finalizedBy(syncTask)
- }
- else {
- javaTask.finalizedBy(syncTask)
- }
+ val previousTask = kotlinAfterJavaTask ?: javaTask
+ previousTask.finalizedByIfNotFailed(syncTask)
project.logger.kotlinDebug { "Created task ${syncTask.path} to copy kotlin classes from $kotlinDir to $javaDir" }
}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt
index 9f1e4e6f83b..afbb06d54d9 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/taskUtils.kt
@@ -1,5 +1,6 @@
package org.jetbrains.kotlin.gradle.plugin
+import org.gradle.api.Task
import org.gradle.api.file.FileCollection
import org.gradle.api.internal.AbstractTask
import org.gradle.api.tasks.compile.AbstractCompile
@@ -51,6 +52,12 @@ internal fun AbstractCompile.appendClasspathDynamically(file: File) {
}
}
+// Extends finalizedBy clause so that finalizing task does not run if finalized task failed
+internal fun Task.finalizedByIfNotFailed(finalizer: Task) {
+ finalizer.onlyIf { this@finalizedByIfNotFailed.state.failure == null }
+ this.finalizedBy(finalizer)
+}
+
internal var AbstractTask.anyClassesCompiled: Boolean? by TaskPropertyDelegate("anyClassesCompiled")
internal var AbstractTask.friendTaskName: String? by TaskPropertyDelegate("friendTaskName")
internal var AbstractTask.javaOutputDir: File? by TaskPropertyDelegate("javaOutputDir")
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
index e5b9dd2c267..5283a1ad55d 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/AbstractKotlinAndroidGradleTests.kt
@@ -161,4 +161,14 @@ fun getSomething() = 10
assertSuccessful()
}
}
+
+ @Test
+ fun testAndroidKaptChangingDependencies() {
+ val project = Project("AndroidKaptChangingDependencies", gradleVersion)
+
+ project.build("build") {
+ assertSuccessful()
+ assertNotContains("Changed dependencies of configuration .+ after it has been included in dependency resolution".toRegex())
+ }
+ }
}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt
index 7f1ccdb6f21..ccf86d3f898 100644
--- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt
@@ -146,6 +146,10 @@ abstract class BaseGradleIT {
return this
}
+ fun CompiledProject.assertNotContains(regex: Regex) {
+ assertNull(regex.find(output), "Output should not contain '$regex'")
+ }
+
fun CompiledProject.fileInWorkingDir(path: String) = File(File(workingDir, project.projectName), path)
fun CompiledProject.assertReportExists(pathToReport: String = ""): CompiledProject {
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/app/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/app/build.gradle
new file mode 100644
index 00000000000..7c191b97468
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/app/build.gradle
@@ -0,0 +1,32 @@
+apply plugin: 'android-sdk-manager'
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "23.0.1"
+
+ defaultConfig {
+ applicationId "com.example.kapt"
+ minSdkVersion 19
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+}
+
+dependencies {
+ compile project(':lib-b')
+ kapt "com.squareup.dagger:dagger-compiler:$dagger_version"
+}
+
+kapt {
+ generateStubs = true
+}
+
+repositories {
+ mavenCentral()
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/app/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..7dc2669b3ce
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/app/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/build.gradle
new file mode 100644
index 00000000000..529b74f1aa4
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/build.gradle
@@ -0,0 +1,22 @@
+buildscript {
+ ext.kotlin_version = '1.1-SNAPSHOT'
+ ext.support_lib_version = '23.1.1'
+ ext.dagger_version = '1.2.5'
+
+ repositories {
+ maven { url 'file://' + pathToKotlinPlugin }
+ jcenter()
+ }
+ dependencies {
+ classpath "com.android.tools.build:gradle:$androidToolsVersion"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ classpath "com.jakewharton.sdkmanager:gradle-plugin:0.12.+"
+ }
+}
+
+allprojects {
+ repositories {
+ maven { url 'file://' + pathToKotlinPlugin }
+ jcenter()
+ }
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/gradle.properties b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/gradle.properties
new file mode 100644
index 00000000000..5fcc74643cf
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/gradle.properties
@@ -0,0 +1 @@
+org.gradle.jvmargs=-ea -XX:MaxPermSize=512m
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-a/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-a/build.gradle
new file mode 100644
index 00000000000..a84bf6c47f6
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-a/build.gradle
@@ -0,0 +1,24 @@
+apply plugin: 'android-sdk-manager'
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "23.0.1"
+
+ defaultConfig {
+ minSdkVersion 19
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+}
+
+dependencies {
+ compile "com.android.support:appcompat-v7:$support_lib_version"
+ kapt "com.squareup.dagger:dagger-compiler:$dagger_version"
+}
+
+kapt {
+ generateStubs = true
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-a/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-a/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..798316bd7bb
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-a/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-b/build.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-b/build.gradle
new file mode 100644
index 00000000000..74d32b272c5
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-b/build.gradle
@@ -0,0 +1,24 @@
+apply plugin: 'android-sdk-manager'
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion 23
+ buildToolsVersion "23.0.1"
+
+ defaultConfig {
+ minSdkVersion 19
+ targetSdkVersion 23
+ versionCode 1
+ versionName "1.0"
+ }
+}
+
+dependencies {
+ compile project(':lib-a')
+ kapt "com.squareup.dagger:dagger-compiler:$dagger_version"
+}
+
+kapt {
+ generateStubs = true
+}
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-b/src/main/AndroidManifest.xml b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-b/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..0b427afdec6
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/lib-b/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/settings.gradle b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/settings.gradle
new file mode 100644
index 00000000000..6376f8c01c7
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/AndroidKaptChangingDependencies/settings.gradle
@@ -0,0 +1 @@
+include ':app', ':lib-a', ':lib-b'
\ No newline at end of file