Print recompilation reasons in build report
This commit is contained in:
@@ -25,6 +25,20 @@ interface ICReporter {
|
||||
|
||||
fun reportCompileIteration(incremental: Boolean, sourceFiles: Collection<File>, exitCode: ExitCode) {}
|
||||
|
||||
fun reportMarkDirtyClass(affectedFiles: Iterable<File>, classFqName: String) {
|
||||
reportMarkDirty(affectedFiles, "dirty class $classFqName")
|
||||
}
|
||||
|
||||
fun reportMarkDirtyMember(affectedFiles: Iterable<File>, scope: String, name: String) {
|
||||
reportMarkDirty(affectedFiles, "dirty member $scope#$name")
|
||||
}
|
||||
|
||||
fun reportMarkDirty(affectedFiles: Iterable<File>, reason: String) {
|
||||
affectedFiles.forEach { file ->
|
||||
reportVerbose { "${pathsAsString(file)} is marked dirty: $reason" }
|
||||
}
|
||||
}
|
||||
|
||||
fun pathsAsString(files: Iterable<File>): String =
|
||||
files.joinToString { it.canonicalPath }
|
||||
|
||||
|
||||
@@ -31,8 +31,10 @@ import org.jetbrains.kotlin.modules.TargetId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
|
||||
import org.jetbrains.kotlin.synthetic.SAM_LOOKUP_NAME
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
|
||||
import java.io.File
|
||||
import java.util.*
|
||||
import kotlin.collections.HashSet
|
||||
|
||||
const val DELETE_MODULE_FILE_PROPERTY = "kotlin.delete.module.file.after.build"
|
||||
|
||||
@@ -143,8 +145,7 @@ fun ChangesCollector.getDirtyData(
|
||||
val name = classFqName.shortName().identifier
|
||||
dirtyLookupSymbols.add(LookupSymbol(name, scope))
|
||||
}
|
||||
}
|
||||
else if (change is ChangeInfo.MembersChanged) {
|
||||
} else if (change is ChangeInfo.MembersChanged) {
|
||||
val fqNames = withSubtypes(change.fqName, caches)
|
||||
// need to recompile subtypes because changed member might break override
|
||||
dirtyClassesFqNames.addAll(fqNames)
|
||||
@@ -161,16 +162,16 @@ fun ChangesCollector.getDirtyData(
|
||||
}
|
||||
|
||||
fun mapLookupSymbolsToFiles(
|
||||
lookupStorage: LookupStorage,
|
||||
lookupSymbols: Iterable<LookupSymbol>,
|
||||
reporter: ICReporter,
|
||||
excludes: Set<File> = emptySet()
|
||||
lookupStorage: LookupStorage,
|
||||
lookupSymbols: Iterable<LookupSymbol>,
|
||||
reporter: ICReporter,
|
||||
excludes: Set<File> = emptySet()
|
||||
): Set<File> {
|
||||
val dirtyFiles = HashSet<File>()
|
||||
|
||||
for (lookup in lookupSymbols) {
|
||||
val affectedFiles = lookupStorage.get(lookup).map(::File).filter { it !in excludes }
|
||||
reporter.report { "${lookup.scope}#${lookup.name} caused recompilation of: ${reporter.pathsAsString(affectedFiles)}" }
|
||||
reporter.reportMarkDirtyMember(affectedFiles, scope = lookup.scope, name = lookup.name)
|
||||
dirtyFiles.addAll(affectedFiles)
|
||||
}
|
||||
|
||||
@@ -183,19 +184,22 @@ fun mapClassesFqNamesToFiles(
|
||||
reporter: ICReporter,
|
||||
excludes: Set<File> = emptySet()
|
||||
): Set<File> {
|
||||
val dirtyFiles = HashSet<File>()
|
||||
val fqNameToAffectedFiles = HashMap<FqName, MutableSet<File>>()
|
||||
|
||||
for (cache in caches) {
|
||||
for (dirtyClassFqName in classesFqNames) {
|
||||
val srcFile = cache.getSourceFileIfClass(dirtyClassFqName)
|
||||
for (classFqName in classesFqNames) {
|
||||
val srcFile = cache.getSourceFileIfClass(classFqName)
|
||||
if (srcFile == null || srcFile in excludes || srcFile.isJavaFile()) continue
|
||||
|
||||
reporter.report { "Class $dirtyClassFqName caused recompilation of: ${reporter.pathsAsString(srcFile)}" }
|
||||
dirtyFiles.add(srcFile)
|
||||
fqNameToAffectedFiles.getOrPut(classFqName) { HashSet() }.add(srcFile)
|
||||
}
|
||||
}
|
||||
|
||||
return dirtyFiles
|
||||
for ((classFqName, affectedFiles) in fqNameToAffectedFiles) {
|
||||
reporter.reportMarkDirtyClass(affectedFiles, classFqName.asString())
|
||||
}
|
||||
|
||||
return fqNameToAffectedFiles.values.flattenTo(HashSet())
|
||||
}
|
||||
|
||||
fun withSubtypes(
|
||||
|
||||
Reference in New Issue
Block a user