diff --git a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt index 6b95e64ebcb..fa693ba1040 100644 --- a/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt +++ b/libraries/tools/kotlin-gradle-plugin-core/src/main/kotlin/org/jetbrains/kotlin/gradle/tasks/Tasks.kt @@ -457,6 +457,11 @@ open class KotlinCompile() : AbstractKotlinCompile() { outputDir: File, args: K2JVMCompilerArguments ): ExitCode { + logger.kotlinDebug("Removing all kotlin classes in $outputDir") + // we're free to delete all classes since only we know about that directory + // todo: can be optimized -- compile and remove only files that were not generated + listClassFiles(outputDir.canonicalPath).forEach { it.delete() } + val moduleFile = makeModuleFile(args.moduleName, isTest = false, outputDir = outputDir, sourcesToCompile = sourcesToCompile, javaSourceRoots = getJavaSourceRoots(), classpath = classpath, friendDirs = listOf()) args.module = moduleFile.absolutePath val messageCollector = GradleMessageCollector(logger) diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/CacheVersionChangedIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/CacheVersionChangedIT.kt index ba3cc399320..06536e343d1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/CacheVersionChangedIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/CacheVersionChangedIT.kt @@ -1,6 +1,6 @@ package org.jetbrains.kotlin.gradle -import org.jetbrains.kotlin.gradle.util.findFileByName +import org.jetbrains.kotlin.gradle.util.getFileByName import org.jetbrains.kotlin.gradle.util.modify import org.junit.Test import java.io.File @@ -44,7 +44,7 @@ class CacheVersionChangedIT : BaseGradleIT() { versionFile.writeText(modifiedVersion) // gradle won't call kotlin task if no file is changed - val dummyKtFile = project.projectDir.findFileByName("Dummy.kt") + val dummyKtFile = project.projectDir.getFileByName("Dummy.kt") dummyKtFile.modify { it + " " } project.build("build", options = options) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/ClassFileIsRemovedIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/ClassFileIsRemovedIT.kt new file mode 100644 index 00000000000..c30108f8ab3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/ClassFileIsRemovedIT.kt @@ -0,0 +1,65 @@ +package org.jetbrains.kotlin.gradle + +import org.jetbrains.kotlin.gradle.util.findFileByName +import org.jetbrains.kotlin.gradle.util.getFileByName +import org.jetbrains.kotlin.gradle.util.modify +import org.junit.Test +import java.io.File +import kotlin.test.assertNull +import kotlin.test.assertTrue + +class ClassFileIsRemovedIT : BaseGradleIT() { + @Test + fun testClassIsRemovedNonIC() { + doTestClassIsRemoved(defaultBuildOptions()) + } + + @Test + fun testClassIsRemovedIC() { + doTestClassIsRemoved(defaultBuildOptions().copy(incremental = true)) + } + + private fun doTestClassIsRemoved(buildOptions: BuildOptions) { + doTest(buildOptions) { dummyFile -> + assertTrue(dummyFile.delete(), "Could not delete $dummyFile") + } + } + + @Test + fun testClassIsRenamedNonIC() { + doTestClassIsRenamed(defaultBuildOptions()) + } + + @Test + fun testClassIsRenamedIC() { + doTestClassIsRenamed(defaultBuildOptions().copy(incremental = true)) + } + + fun doTestClassIsRenamed(buildOptions: BuildOptions) { + doTest(buildOptions) { dummyFile -> + dummyFile.modify { it.replace("Dummy", "ForDummies") } + } + } + + fun doTest(buildOptions: BuildOptions, transformDummy: (File)->Unit) { + val project = Project("kotlinInJavaRoot", "2.10") + project.build("build", options = buildOptions) { + assertSuccessful() + } + + val dummyFile = project.projectDir.getFileByName("Dummy.kt") + transformDummy(dummyFile) + + project.build("build", options = buildOptions) { + assertSuccessful() + val dummyClassFile = project.projectDir.findFileByName("Dummy.class") + assertNull(dummyClassFile, "$dummyClassFile should not exist!") + } + + // check that class removal does not trigger rebuild + project.build("build", options = buildOptions) { + assertSuccessful() + assertContains(":compileKotlin UP-TO-DATE", ":compileJava UP-TO-DATE") + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt index 98beadf4dda..ba96c1012cd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/util/fileUtil.kt @@ -2,9 +2,11 @@ package org.jetbrains.kotlin.gradle.util import java.io.File -fun File.findFileByName(name: String): File = +fun File.getFileByName(name: String): File = + findFileByName(name) ?: throw AssertionError("Could not find file with name '$name' in $this") + +fun File.findFileByName(name: String): File? = walk().filter { it.isFile && it.name.equals(name, ignoreCase = true) }.firstOrNull() - ?: throw AssertionError("Could not find file with name '$name' in $this") fun File.modify(transform: (String)->String) { writeText(transform(readText())) diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kotlinInJavaRoot/gradle.properties b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kotlinInJavaRoot/gradle.properties new file mode 100644 index 00000000000..93ce6a94e63 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kotlinInJavaRoot/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1024m -XX:MaxPermSize=512m \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kotlinInJavaRoot/src/main/java/kotlinPackage/Dummy.kt b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kotlinInJavaRoot/src/main/java/kotlinPackage/Dummy.kt new file mode 100644 index 00000000000..9e813f97944 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/test/resources/testProject/kotlinInJavaRoot/src/main/java/kotlinPackage/Dummy.kt @@ -0,0 +1,3 @@ +package kotlinPackage + +class Dummy