From b767adc66d9da0ab2a995cff48b203f443d044c8 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Sun, 14 Jul 2019 20:39:15 +0300 Subject: [PATCH] Make lookup storage addAll order independent Lookup storage output files could differ for projects with different absolute paths. This happened because, paths for lookups were relativized only before writing to the underlying storage. Storing absolute paths in a hash table could result in different order of adding files to the lookup storage. This commit fixes the issue by sorting lookups and files in LookupStorage#addAll #KT-32674 Fixed Original commit: a4c62d156f12881215d3eb6b26dfac94eb76959e --- .../jps/build/JpsFileToPathConverter.kt | 30 +++---------------- .../kotlin/jps/build/KotlinBuilder.kt | 2 +- 2 files changed, 5 insertions(+), 27 deletions(-) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/JpsFileToPathConverter.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/JpsFileToPathConverter.kt index c8fe4555df7..4cdd0581928 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/JpsFileToPathConverter.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/JpsFileToPathConverter.kt @@ -7,30 +7,8 @@ package org.jetbrains.kotlin.jps.build import org.jetbrains.jps.model.JpsProject import org.jetbrains.jps.model.serialization.JpsModelSerializationDataService -import org.jetbrains.kotlin.incremental.storage.FileToPathConverter -import java.io.File +import org.jetbrains.kotlin.incremental.storage.RelativeFileToPathConverter -private const val PROJECT_DIR_PLACEHOLDER = "${'$'}PROJECT_DIR$" - -internal class JpsFileToPathConverter(jpsProject: JpsProject) : FileToPathConverter { - private val baseDirPath = JpsModelSerializationDataService - .getBaseDirectory(jpsProject)?.canonicalFile?.invariantSeparatorsPath - - override fun toPath(file: File): String { - val path = file.canonicalFile.invariantSeparatorsPath - return when { - baseDirPath != null && path.startsWith(baseDirPath) -> - PROJECT_DIR_PLACEHOLDER + path.substring(baseDirPath.length) - else -> path - } - } - - override fun toFile(path: String): File = - when { - path.startsWith(PROJECT_DIR_PLACEHOLDER) -> { - val basePath = baseDirPath ?: error("Could not get project root dir") - File(basePath + path.substring(PROJECT_DIR_PLACEHOLDER.length)) - } - else -> File(path) - } -} \ No newline at end of file +internal class JpsFileToPathConverter( + jpsProject: JpsProject +) : RelativeFileToPathConverter(JpsModelSerializationDataService.getBaseDirectory(jpsProject)) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index a549d760545..b32b63ec971 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -648,7 +648,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { lookupStorageManager.withLookupStorage { lookupStorage -> lookupStorage.removeLookupsFrom(dirtyFilesHolder.allDirtyFiles.asSequence() + dirtyFilesHolder.allRemovedFilesFiles.asSequence()) - lookupStorage.addAll(lookupTracker.lookups.entrySet(), lookupTracker.pathInterner.values) + lookupStorage.addAll(lookupTracker.lookups, lookupTracker.pathInterner.values) } } }