From ea255ac85427c09e672501887a6462acabad6197 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Thu, 17 May 2018 03:36:42 +0300 Subject: [PATCH] Rebuild when dependency was built non-incrementally --- .../IncrementalJvmCompilerRunner.kt | 2 + .../IncrementalCompilationMultiProjectIT.kt | 59 ++++++++++++++++--- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index f90f5bfb438..8f46f4f5bd0 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -299,6 +299,8 @@ class IncrementalJvmCompilerRunner( } for (buildDiff in newBuilds) { + if (!buildDiff.isIncremental) return ChangesEither.Unknown("Non-incremental build from dependency $historyFile") + val dirtyData = buildDiff.dirtyData symbols.addAll(dirtyData.dirtyLookupSymbols) fqNames.addAll(dirtyData.dirtyClassesFqNames) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt index 2f02c24e85c..3f44d519d23 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt @@ -5,6 +5,7 @@ import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.getFilesByNames import org.jetbrains.kotlin.gradle.util.modify import org.jetbrains.kotlin.test.KotlinTestUtils +import org.junit.Assert import org.junit.Test import java.io.File @@ -98,28 +99,72 @@ open class A { @Test fun testCleanBuildLib() { - // Test with Gradle 3.4, since Gradle 3.5+ uses classpath hash normalization for JARs - val project = Project("incrementalMultiproject", GradleVersionRequired.Exact("3.4")) - - project.setupWorkingDir() + val project = Project("incrementalMultiproject") project.build("build") { assertSuccessful() } - project.build(":lib:clean", ":lib:build") { + project.build(":lib:clean") { assertSuccessful() - val affectedSources = File(project.projectDir, "lib").allKotlinFiles() + } + + // Change file so Gradle won't skip :app:compile + project.projectFile("BarDummy.kt").modify { + it.replace("class BarDummy", "open class BarDummy") + } + project.build("build") { + assertSuccessful() + val affectedSources = project.projectDir.allKotlinFiles() val relativePaths = project.relativize(affectedSources) assertCompiledKotlinSources(relativePaths, weakTesting = false) } + val aaKt = project.projectFile("AA.kt") + aaKt.modify { "$it " } project.build("build") { assertSuccessful() - val affectedSources = File(project.projectDir, "app").allKotlinFiles() + assertCompiledKotlinSources(project.relativize(aaKt), weakTesting = false) + } + } + + @Test + fun testAddDependencyToLib() { + val project = Project("incrementalMultiproject") + + project.build("build") { + assertSuccessful() + } + + val libBuildGradle = File(project.projectDir, "lib/build.gradle") + Assert.assertTrue("$libBuildGradle does not exist", libBuildGradle.exists()) + libBuildGradle.modify { + """ + $it + + dependencies { + implementation 'junit:junit:4.12' + } + """.trimIndent() + } + // Change file so Gradle won't skip :app:compile + project.projectFile("BarDummy.kt").modify { + it.replace("class BarDummy", "open class BarDummy") + } + + project.build("build") { + assertSuccessful() + val affectedSources = project.projectDir.allKotlinFiles() val relativePaths = project.relativize(affectedSources) assertCompiledKotlinSources(relativePaths, weakTesting = false) } + + val aaKt = project.projectFile("AA.kt") + aaKt.modify { "$it " } + project.build("build") { + assertSuccessful() + assertCompiledKotlinSources(project.relativize(aaKt), weakTesting = false) + } } @Test