From f25d948b3f54b15daad73151fa915c8feab7f115 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Wed, 26 Oct 2016 09:49:46 +0300 Subject: [PATCH] Gradle IC should fail if duplicating class is added #KT-14554 fixed --- .../IncrementalJvmCompilerRunner.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index 3c42d86e0e2..a67283c9149 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -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>): ArrayList { + val result = ArrayList() + 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, sourcesToCompile: Set,