diff --git a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/ChangesEither.kt b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/ChangesEither.kt index a120d1dce5c..b291f3ce58e 100644 --- a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/ChangesEither.kt +++ b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/ChangesEither.kt @@ -1,8 +1,12 @@ package org.jetbrains.kotlin.gradle.tasks import org.jetbrains.kotlin.incremental.LookupSymbol +import org.jetbrains.kotlin.name.FqName internal sealed class ChangesEither { - internal class Known(val lookupSymbols: Set) : ChangesEither() + internal class Known( + val lookupSymbols: Collection = emptyList(), + val fqNames: Collection = emptyList() + ) : ChangesEither() internal class Unknown : ChangesEither() } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index fbe6c99a361..849e67d28eb 100644 --- a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -293,20 +293,20 @@ open class KotlinCompile() : AbstractKotlinCompile() { symbols } - fun getClasspathChanges(modifiedClasspath: List): DirtyData? { + fun getClasspathChanges(modifiedClasspath: List): ChangesEither { if (modifiedClasspath.isEmpty()) { logger.kotlinDebug { "No classpath changes" } - return DirtyData() + return ChangesEither.Known() } if (artifactDifferenceRegistry == null) { logger.kotlinDebug { "No artifact history provider" } - return null + return ChangesEither.Unknown() } val lastBuildTS = lastBuildInfo?.startTS if (lastBuildTS == null) { logger.kotlinDebug { "Could not determine last build timestamp" } - return null + return ChangesEither.Unknown() } val symbols = HashSet() @@ -315,13 +315,13 @@ open class KotlinCompile() : AbstractKotlinCompile() { val diffs = artifactDifferenceRegistry!![file] if (diffs == null) { logger.kotlinDebug { "Could not get changes for file: $file" } - return null + return ChangesEither.Unknown() } val (beforeLastBuild, afterLastBuild) = diffs.partition { it.buildTS < lastBuildTS } if (beforeLastBuild.isEmpty()) { logger.kotlinDebug { "No known build preceding timestamp $lastBuildTS for file $file" } - return null + return ChangesEither.Unknown() } afterLastBuild.forEach { @@ -330,7 +330,7 @@ open class KotlinCompile() : AbstractKotlinCompile() { } } - return DirtyData(symbols, fqNames) + return ChangesEither.Known(symbols, fqNames) } fun calculateSourcesToCompile(): Pair, Boolean> { @@ -354,12 +354,17 @@ open class KotlinCompile() : AbstractKotlinCompile() { val modifiedClasspathEntries = modified.filter { it in classpath } val classpathChanges = getClasspathChanges(modifiedClasspathEntries) - ?: return rebuild("could not get changes from modified classpath entries: ${filesToString(modifiedClasspathEntries)}") + if (classpathChanges is ChangesEither.Unknown) { + return rebuild("could not get changes from modified classpath entries: ${filesToString(modifiedClasspathEntries)}") + } + if (classpathChanges !is ChangesEither.Known) { + throw AssertionError("Unknown implementation of ChangesEither: ${classpathChanges.javaClass}") + } val dirtyFiles = modified.filter { it.isKotlinFile() }.toMutableSet() val lookupSymbols = HashSet() lookupSymbols.addAll(dirtyJavaLookupSymbols.value) - lookupSymbols.addAll(classpathChanges.dirtyLookupSymbols) + lookupSymbols.addAll(classpathChanges.lookupSymbols) if (lookupSymbols.any()) { val dirtyFilesFromLookups = mapLookupSymbolsToFiles(lookupStorage, lookupSymbols, logAction, ::projectRelativePath) @@ -367,7 +372,7 @@ open class KotlinCompile() : AbstractKotlinCompile() { } val allCaches = targets.map(::getIncrementalCache) - val dirtyClassesFqNames = classpathChanges.dirtyClassesFqNames.flatMap { withSubtypes(it, allCaches) } + val dirtyClassesFqNames = classpathChanges.fqNames.flatMap { withSubtypes(it, allCaches) } if (dirtyClassesFqNames.any()) { val dirtyFilesFromFqNames = mapClassesFqNamesToFiles(allCaches, dirtyClassesFqNames, logAction, ::projectRelativePath) dirtyFiles.addAll(dirtyFilesFromFqNames) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt index be4b2d80c09..a8db4a7cb6f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt @@ -89,7 +89,10 @@ class KotlinGradleBuildServices private constructor(gradle: Gradle): BuildAdapte override fun buildFinished(result: BuildResult) { val gradle = result.gradle!! - val kotlinCompilerCalled = gradle.rootProject.allprojects.flatMap { it.tasks }.any { it is AbstractKotlinCompile<*> && it.compilerCalled } + val kotlinCompilerCalled = gradle.rootProject + .allprojects + .flatMap { it.tasks } + .any { it is AbstractKotlinCompile<*> && it.compilerCalled } if (kotlinCompilerCalled) { log.kotlinDebug("Cleanup after kotlin") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/ArtifactDifferenceRegistryImpl.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/ArtifactDifferenceRegistryImpl.kt index 1b1cefe76b3..2f40ccd189c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/ArtifactDifferenceRegistryImpl.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/ArtifactDifferenceRegistryImpl.kt @@ -42,7 +42,7 @@ internal class ArtifactDifferenceRegistryImpl( value.sortedBy { it.buildTS }.joinToString(separator = ",\n\t") { diff -> "{ " + "timestamp: ${diff.buildTS}, " + - "lookup symbols: [${diff.dirtyData.dirtyLookupSymbols.dumpLookupSymbols()}], " + + "lookup symbols: [${diff.dirtyData.dirtyLookupSymbols.dumpLookupSymbols()}], " + "fq names: [${diff.dirtyData.dirtyClassesFqNames.dumpFqNames()}]" "}" } @@ -86,7 +86,7 @@ private object ArtifactDifferenceCollectionExternalizer : DataExternalizer DataInput.readCollectionTo(col: MutableCollection, readT: DataInput.()->T): Collection { +private inline fun DataInput.readCollectionTo(col: MutableCollection, readT: DataInput.() -> T): Collection { val size = readInt() repeat(size) { @@ -96,7 +96,7 @@ private inline fun DataInput.readCollectionTo(col: MutableCollection, rea return col } -private inline fun DataOutput.writeCollection(col: Collection, writeT: DataOutput.(T)->Unit) { +private inline fun DataOutput.writeCollection(col: Collection, writeT: DataOutput.(T) -> Unit) { writeInt(col.size) col.forEach { writeT(it) } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/BuildCacheStorage.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/BuildCacheStorage.kt index 0d3244d828d..11e5766144b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/BuildCacheStorage.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/incremental/BuildCacheStorage.kt @@ -52,8 +52,4 @@ internal class BuildCacheStorage(workingDir: File) : BasicMapsOwner() { super.close() version.saveIfNeeded() } - - override fun flush(memoryCachesOnly: Boolean) { - super.flush(memoryCachesOnly) - } } \ 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 dcf4d6df84d..854089196fc 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 @@ -10,6 +10,7 @@ import org.junit.AfterClass import org.junit.Assert import org.junit.Before import java.io.File +import java.util.regex.Pattern import kotlin.test.* private val SYSTEM_LINE_SEPARATOR = System.getProperty("line.separator") @@ -162,7 +163,7 @@ abstract class BaseGradleIT { } fun CompiledProject.assertSubstringCount(substring: String, expectedCount: Int) { - val actualCount = substring.toRegex().findAll(output).count() + val actualCount = Pattern.quote(substring).toRegex().findAll(output).count() assertEquals(expectedCount, actualCount, "Number of occurrences in output for substring '$substring'") }