Fixes after review

This commit is contained in:
Alexey Tsvetkov
2016-08-23 16:38:47 +03:00
parent 4e8deb9566
commit 9f6509cd8e
6 changed files with 29 additions and 20 deletions
@@ -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<LookupSymbol>) : ChangesEither()
internal class Known(
val lookupSymbols: Collection<LookupSymbol> = emptyList(),
val fqNames: Collection<FqName> = emptyList()
) : ChangesEither()
internal class Unknown : ChangesEither()
}
@@ -293,20 +293,20 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
symbols
}
fun getClasspathChanges(modifiedClasspath: List<File>): DirtyData? {
fun getClasspathChanges(modifiedClasspath: List<File>): 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<LookupSymbol>()
@@ -315,13 +315,13 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
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<K2JVMCompilerArguments>() {
}
}
return DirtyData(symbols, fqNames)
return ChangesEither.Known(symbols, fqNames)
}
fun calculateSourcesToCompile(): Pair<Set<File>, Boolean> {
@@ -354,12 +354,17 @@ open class KotlinCompile() : AbstractKotlinCompile<K2JVMCompilerArguments>() {
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<LookupSymbol>()
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<K2JVMCompilerArguments>() {
}
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)
@@ -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")
@@ -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<Colle
}
}
private inline fun <T> DataInput.readCollectionTo(col: MutableCollection<T>, readT: DataInput.()->T): Collection<T> {
private inline fun <T> DataInput.readCollectionTo(col: MutableCollection<T>, readT: DataInput.() -> T): Collection<T> {
val size = readInt()
repeat(size) {
@@ -96,7 +96,7 @@ private inline fun <T> DataInput.readCollectionTo(col: MutableCollection<T>, rea
return col
}
private inline fun <T> DataOutput.writeCollection(col: Collection<T>, writeT: DataOutput.(T)->Unit) {
private inline fun <T> DataOutput.writeCollection(col: Collection<T>, writeT: DataOutput.(T) -> Unit) {
writeInt(col.size)
col.forEach { writeT(it) }
}
@@ -52,8 +52,4 @@ internal class BuildCacheStorage(workingDir: File) : BasicMapsOwner() {
super.close()
version.saveIfNeeded()
}
override fun flush(memoryCachesOnly: Boolean) {
super.flush(memoryCachesOnly)
}
}
@@ -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'")
}