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