Do not use File.canonicalPath in incremental caches
This fix improves performance of incremental compilation on Windows
machines.
When portable JPS caches are used, DirtyFilesHolder.getRemovedFiles
could return file names which are not allowed on current platform.
Previously it resulted in IOException on File.getCanonicalFile.
#KT-53735 Fixed
diff --git a/build-common/src/org/jetbrains/kotlin/incremental/storage/FileToPathConverter.kt b/build-common/src/org/jetbrains/kotlin/incremental/storage/FileToPathConverter.kt
index 553b88d..d238776 100644
--- a/build-common/src/org/jetbrains/kotlin/incremental/storage/FileToPathConverter.kt
+++ b/build-common/src/org/jetbrains/kotlin/incremental/storage/FileToPathConverter.kt
@@ -18,8 +18,8 @@
fun FileToPathConverter.toFiles(paths: Collection<String>): List<File> =
paths.map { toFile(it) }
-object FileToCanonicalPathConverter : FileToPathConverter {
- override fun toPath(file: File): String = file.canonicalPath
+object FileToAbsolutePathConverter : FileToPathConverter {
+ override fun toPath(file: File): String = file.normalize().absolutePath
override fun toFile(path: String): File = File(path)
}
diff --git a/build-common/src/org/jetbrains/kotlin/incremental/storage/RelativeFileToPathConverter.kt b/build-common/src/org/jetbrains/kotlin/incremental/storage/RelativeFileToPathConverter.kt
index dd16c7b..9cf3bcf 100644
--- a/build-common/src/org/jetbrains/kotlin/incremental/storage/RelativeFileToPathConverter.kt
+++ b/build-common/src/org/jetbrains/kotlin/incremental/storage/RelativeFileToPathConverter.kt
@@ -8,10 +8,10 @@
import java.io.File
open class RelativeFileToPathConverter(baseDirFile: File?) : FileToPathConverter {
- private val baseDirPath = baseDirFile?.canonicalFile?.invariantSeparatorsPath
+ private val baseDirPath = baseDirFile?.normalize()?.invariantSeparatorsPath
override fun toPath(file: File): String {
- val path = file.canonicalFile.invariantSeparatorsPath
+ val path = file.normalize().invariantSeparatorsPath
return when {
baseDirPath != null && path.startsWith(baseDirPath) ->
PROJECT_DIR_PLACEHOLDER + path.substring(baseDirPath.length)
diff --git a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/classpathDiff/ClasspathChangesComputer.kt b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/classpathDiff/ClasspathChangesComputer.kt
index 7848d87..32b1003 100644
--- a/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/classpathDiff/ClasspathChangesComputer.kt
+++ b/compiler/incremental-compilation-impl/src/org/jetbrains/kotlin/incremental/classpathDiff/ClasspathChangesComputer.kt
@@ -15,7 +15,7 @@
import org.jetbrains.kotlin.incremental.classpathDiff.BreadthFirstSearch.findReachableNodes
import org.jetbrains.kotlin.incremental.classpathDiff.ClasspathSnapshotShrinker.shrinkClasspath
import org.jetbrains.kotlin.incremental.classpathDiff.ImpactedSymbolsComputer.computeImpactedSymbols
-import org.jetbrains.kotlin.incremental.storage.FileToCanonicalPathConverter
+import org.jetbrains.kotlin.incremental.storage.FileToAbsolutePathConverter
import org.jetbrains.kotlin.incremental.storage.ListExternalizer
import org.jetbrains.kotlin.incremental.storage.loadFromFile
import org.jetbrains.kotlin.name.ClassId
@@ -203,7 +203,7 @@
): ProgramSymbolSet {
val workingDir =
FileUtil.createTempDirectory(this::class.java.simpleName, "_WorkingDir_${UUID.randomUUID()}", /* deleteOnExit */ true)
- val incrementalJvmCache = IncrementalJvmCache(workingDir, /* targetOutputDir */ null, FileToCanonicalPathConverter)
+ val incrementalJvmCache = IncrementalJvmCache(workingDir, /* targetOutputDir */ null, FileToAbsolutePathConverter)
// Step 1:
// - Add previous class snapshots to incrementalJvmCache.