diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt index d8ccce53fff..c162ac33d49 100644 --- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt +++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/IncrementalJvmCompilerRunner.kt @@ -314,7 +314,9 @@ class IncrementalJvmCompilerRunner( override fun preBuildHook(args: K2JVMCompilerArguments, compilationMode: CompilationMode) { when (compilationMode) { is CompilationMode.Incremental -> { - args.classpathAsList += args.destinationAsFile.apply { mkdirs() } + val destinationDir = args.destinationAsFile + destinationDir.mkdirs() + args.classpathAsList = listOf(destinationDir) + args.classpathAsList } is CompilationMode.Rebuild -> { // there is no point in updating annotation file since all files will be compiled anyway diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index c9a3da5cc4b..a59e2b192b5 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -117,6 +117,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("duplicatedClass") + public void testDuplicatedClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/duplicatedClass/"); + doTest(fileName); + } + @TestMetadata("exportedDependency") public void testExportedDependency() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/multiModule/exportedDependency/"); diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/build.log b/jps-plugin/testData/incremental/multiModule/duplicatedClass/build.log new file mode 100644 index 00000000000..917d81caa03 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/build.log @@ -0,0 +1,17 @@ +================ Step #1 ================= + +Building module1 +Exit code: NOTHING_DONE +------------------------------------------ +Building module2 +Cleaning output files: + out/production/module2/META-INF/module2.kotlin_module + out/production/module2/UseAKt.class + out/production/module2/UseUtilsKt.class +End of files +Compiling files: + module2/src/useA.kt + module2/src/useUtils.kt +End of files +Exit code: OK +------------------------------------------ \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/dependencies.txt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/dependencies.txt new file mode 100644 index 00000000000..827bf04cc58 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/dependencies.txt @@ -0,0 +1,2 @@ +module1-> +module2->module1 diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_A.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_A.kt new file mode 100644 index 00000000000..2f1a23c74eb --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_A.kt @@ -0,0 +1,3 @@ +class A { + fun fizz() {} +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_other1.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_other1.kt new file mode 100644 index 00000000000..76612dffc16 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_other1.kt @@ -0,0 +1,2 @@ +fun other1() { +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_utils.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_utils.kt new file mode 100644 index 00000000000..60843f060c1 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module1_utils.kt @@ -0,0 +1 @@ +fun fizz() {} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_A.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_A.kt new file mode 100644 index 00000000000..dd957f79c67 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_A.kt @@ -0,0 +1,3 @@ +class A { + fun buzz() {} +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_other2.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_other2.kt new file mode 100644 index 00000000000..e7b29d7ffe4 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_other2.kt @@ -0,0 +1,2 @@ +fun other2() { +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useA.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useA.kt new file mode 100644 index 00000000000..d662c17f077 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useA.kt @@ -0,0 +1,3 @@ +fun useA() { + A().buzz() +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useA.kt.touch b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useA.kt.touch new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useUtils.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useUtils.kt new file mode 100644 index 00000000000..11202c9b2f6 --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useUtils.kt @@ -0,0 +1,3 @@ +fun useUtils() { + buzz() +} \ No newline at end of file diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useUtils.kt.touch b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_useUtils.kt.touch new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_utils.kt b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_utils.kt new file mode 100644 index 00000000000..ed02bf9e14f --- /dev/null +++ b/jps-plugin/testData/incremental/multiModule/duplicatedClass/module2_utils.kt @@ -0,0 +1 @@ +fun buzz() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt index c37c5d39fca..501ebb04c17 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/IncrementalCompilationMultiProjectIT.kt @@ -22,6 +22,21 @@ class IncrementalCompilationMultiProjectIT : BaseGradleIT() { override fun defaultBuildOptions(): BuildOptions = super.defaultBuildOptions().copy(withDaemon = true, incremental = true) + @Test + fun testDuplicatedClass() { + val project = Project("duplicatedClass") + project.build("build") { + assertSuccessful() + } + + val usagesFiles = listOf("useBuzz.kt", "useA.kt").map { project.projectFile(it) } + usagesFiles.forEach { file -> file.modify { "$it\n " } } + + project.build("build") { + assertSuccessful() + assertCompiledKotlinSources(project.relativize(usagesFiles)) + } + } @Test fun testMoveFunctionFromLib() { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/build.gradle new file mode 100644 index 00000000000..ed6cb6a85e3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/build.gradle @@ -0,0 +1,5 @@ +apply plugin: 'kotlin' + +dependencies { + compile project(':lib') +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/A.kt new file mode 100644 index 00000000000..dd957f79c67 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/A.kt @@ -0,0 +1,3 @@ +class A { + fun buzz() {} +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/useA.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/useA.kt new file mode 100644 index 00000000000..f4ab19dd3db --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/useA.kt @@ -0,0 +1,3 @@ +fun useA(a: A) { + A().buzz() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/useBuzz.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/useBuzz.kt new file mode 100644 index 00000000000..e3c1dfd6dad --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/useBuzz.kt @@ -0,0 +1,3 @@ +fun useBuzz() { + buzz() +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/utils.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/utils.kt new file mode 100644 index 00000000000..ed02bf9e14f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/app/src/main/kotlin/utils.kt @@ -0,0 +1 @@ +fun buzz() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/build.gradle new file mode 100644 index 00000000000..b1b941981c6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/build.gradle @@ -0,0 +1,9 @@ +buildscript { + repositories { + mavenLocal() + mavenCentral() + } + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/build.gradle new file mode 100644 index 00000000000..90470485bb0 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/build.gradle @@ -0,0 +1 @@ +apply plugin: 'kotlin' diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/src/main/kotlin/A.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/src/main/kotlin/A.kt new file mode 100644 index 00000000000..2f1a23c74eb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/src/main/kotlin/A.kt @@ -0,0 +1,3 @@ +class A { + fun fizz() {} +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/src/main/kotlin/utils.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/src/main/kotlin/utils.kt new file mode 100644 index 00000000000..60843f060c1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/lib/src/main/kotlin/utils.kt @@ -0,0 +1 @@ +fun fizz() {} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/settings.gradle new file mode 100644 index 00000000000..b1de2138f4f --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/duplicatedClass/settings.gradle @@ -0,0 +1 @@ +include ':lib', ':app' \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/fileUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/fileUtils.kt index ca187adfe23..f1c7efab6b4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/fileUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/incremental/fileUtils.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.incremental import org.gradle.api.Project import java.io.File +// todo: Move all files under org.jetbrains.kotlin.gradle package to avoid class clash (KT-18621, KT-20516) + internal fun File.isJavaFile() = extension.equals("java", ignoreCase = true)