Gradle IC should fail if duplicating class is added

#KT-14554 fixed
This commit is contained in:
Alexey Tsvetkov
2016-10-26 09:49:46 +03:00
parent 67b3d54b37
commit f25d948b3f
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.incremental
import org.jetbrains.kotlin.annotation.AnnotationFileUpdater
import org.jetbrains.kotlin.annotation.SourceAnnotationsRegistry
import org.jetbrains.kotlin.build.GeneratedFile
import org.jetbrains.kotlin.build.GeneratedJvmClass
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation
@@ -34,6 +35,7 @@ import org.jetbrains.kotlin.config.IncrementalCompilation
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifference
import org.jetbrains.kotlin.incremental.multiproject.ArtifactDifferenceRegistryProvider
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.modules.TargetId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.progress.CompilationCanceledStatus
@@ -319,6 +321,12 @@ internal class IncrementalJvmCompilerRunner(
}
val generatedClassFiles = compilerOutput.generatedFiles
val sourcesWithPossibleRedeclarations = getSourcesWithPossibleRedeclarations(caches, generatedClassFiles)
if (sourcesWithPossibleRedeclarations.isNotEmpty()) {
dirtySources.addAll(sourcesWithPossibleRedeclarations)
continue
}
allGeneratedFiles.addAll(generatedClassFiles)
val compilationResult = updateIncrementalCaches(listOf(targetId), generatedClassFiles,
compiledWithErrors = exitCode != ExitCode.OK,
@@ -396,6 +404,26 @@ internal class IncrementalJvmCompilerRunner(
return exitCode
}
private fun getSourcesWithPossibleRedeclarations(caches: IncrementalCachesManager, generatedFiles: List<GeneratedFile<TargetId>>): ArrayList<File> {
val result = ArrayList<File>()
for (generatedFile in generatedFiles) {
if (generatedFile !is GeneratedJvmClass<*>) continue
val outputClass = generatedFile.outputClass
if (outputClass.classHeader.kind != KotlinClassHeader.Kind.CLASS) continue
assert(generatedFile.sourceFiles.size == 1) { "KotlinClassHeader.Kind.CLASS cannot be generated from multiple files" }
val fqName = outputClass.className.fqNameForClassNameWithoutDollars
val currentSourceFile = generatedFile.sourceFiles.single()
val cachedSourceFile = caches.incrementalCache.getSourceFileIfClass(fqName)
if (cachedSourceFile != null && cachedSourceFile != currentSourceFile) {
result.add(cachedSourceFile)
}
}
return result
}
private fun compileChanged(
targets: List<TargetId>,
sourcesToCompile: Set<File>,