From 3832c6a5206c93e8458c8cbaf6e1bcc9ab8b347d Mon Sep 17 00:00:00 2001 From: Andrey Uskov Date: Tue, 18 Oct 2022 00:47:42 +0300 Subject: [PATCH] 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 --- .../kotlin/incremental/storage/FileToPathConverter.kt | 4 ++-- .../kotlin/incremental/storage/RelativeFileToPathConverter.kt | 4 ++-- .../incremental/classpathDiff/ClasspathChangesComputer.kt | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) 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 553b88dc31d..d238776a9e7 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.toPaths(files: Collection): List = fun FileToPathConverter.toFiles(paths: Collection): List = 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 dd16c7b7832..9cf3bcfed3a 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 @@ package org.jetbrains.kotlin.incremental.storage 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 7848d87fbca..32b1003c6ff 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.* 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 @@ object ClasspathChangesComputer { ): 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.