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 a894a1fad5c..b863f64c767 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 @@ -477,7 +477,7 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR if (lookupTracker !is LookupTrackerImpl) throw AssertionError("Lookup tracker is expected to be LookupTrackerImpl, got ${lookupTracker.javaClass}") - val lookupStorage = dataManager.getStorage(LOOKUP_TRACKER_TARGET, LOOKUP_TRACKER_STORAGE_PROVIDER) + val lookupStorage = dataManager.getStorage(KotlinDataContainerTarget, LookupStorageProvider) filesToCompile.values().forEach { lookupStorage.removeLookupsFrom(it) } val removedFiles = chunk.targets.flatMap { KotlinSourceFileCollector.getRemovedKotlinFiles(dirtyFilesHolder, it) } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupTrackerTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/KotlinDataContainerTargetType.kt similarity index 67% rename from jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupTrackerTarget.kt rename to jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/KotlinDataContainerTargetType.kt index 68ec5195399..bbaee2504ef 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupTrackerTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/KotlinDataContainerTargetType.kt @@ -24,20 +24,21 @@ import org.jetbrains.jps.indices.ModuleExcludeIndex import org.jetbrains.jps.model.JpsModel import java.io.File -private val KOTLIN_LOOKUP_TRACKER = "kotlin-lookup-tracker" +private val KOTLIN_DATA_CONTAINER = "kotlin-data-container" -object LOOKUP_TRACKER_TARGET_TYPE : BuildTargetType(KOTLIN_LOOKUP_TRACKER) { - override fun computeAllTargets(model: JpsModel): List = listOf(LOOKUP_TRACKER_TARGET) +object KotlinDataContainerTargetType : BuildTargetType(KOTLIN_DATA_CONTAINER) { + override fun computeAllTargets(model: JpsModel): List = listOf(KotlinDataContainerTarget) - override fun createLoader(model: JpsModel): BuildTargetLoader = - object : BuildTargetLoader() { - override fun createTarget(targetId: String): LOOKUP_TRACKER_TARGET? = LOOKUP_TRACKER_TARGET + override fun createLoader(model: JpsModel): BuildTargetLoader = + object : BuildTargetLoader() { + override fun createTarget(targetId: String): KotlinDataContainerTarget? = KotlinDataContainerTarget } } -object LOOKUP_TRACKER_TARGET : BuildTarget(LOOKUP_TRACKER_TARGET_TYPE) { - override fun getId(): String? = KOTLIN_LOOKUP_TRACKER - override fun getPresentableName(): String = KOTLIN_LOOKUP_TRACKER +// Fake target to store data per project for incremental compilation +object KotlinDataContainerTarget : BuildTarget(KotlinDataContainerTargetType) { + override fun getId(): String? = KOTLIN_DATA_CONTAINER + override fun getPresentableName(): String = KOTLIN_DATA_CONTAINER override fun computeRootDescriptors( model: JpsModel?, @@ -49,7 +50,7 @@ object LOOKUP_TRACKER_TARGET : BuildTarget(LOOKUP_TRACKER_T override fun getOutputRoots(context: CompileContext): Collection { val dataManager = context.projectDescriptor.dataManager val storageRoot = dataManager.dataPaths.dataStorageRoot - return listOf(File(storageRoot, KOTLIN_LOOKUP_TRACKER)) + return listOf(File(storageRoot, KOTLIN_DATA_CONTAINER)) } override fun findRootDescriptor(rootId: String?, rootIndex: BuildRootIndex?): BuildRootDescriptor? = null diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupStorage.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupStorage.kt index 994789d4290..349981a99e9 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupStorage.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupStorage.kt @@ -27,7 +27,7 @@ import org.jetbrains.kotlin.utils.Printer import java.io.File import java.util.* -object LOOKUP_TRACKER_STORAGE_PROVIDER : StorageProvider() { +object LookupStorageProvider : StorageProvider() { override fun createStorage(targetDataDir: File): LookupStorage = LookupStorage(targetDataDir) } @@ -55,9 +55,9 @@ class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { } } - public fun add(lookupSymbol: LookupSymbol, containingFiles: Collection) { - val key = lookupSymbol.toHashPair() - val fileIds = containingFiles.map { addFileIfNeeded(it) }.toHashSet() + public fun add(lookupSymbol: LookupSymbol, containingPaths: Collection) { + val key = LookupSymbolKey(lookupSymbol.name, lookupSymbol.scope) + val fileIds = containingPaths.map { addFileIfNeeded(File(it)) }.toHashSet() fileIds.addAll(lookupMap[key] ?: emptySet()) lookupMap[key] = fileIds } @@ -115,7 +115,7 @@ class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { lookupMap[hash] = lookupMap[hash]!!.filter { it in idToFile }.toSet() } - val oldFileToId = fileToId.copyAsMap() + val oldFileToId = fileToId.toMap() val oldIdToNewId = HashMap(oldFileToId.size) idToFile.clean() fileToId.clean() @@ -151,10 +151,11 @@ class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { val sb = StringBuilder() val p = Printer(sb) - val lookupsStrings = lookupSymbols.groupBy { LookupHashPair(it.name, it.scope) } - val lookups = lookupMap.copyAsMap() + val lookupsStrings = lookupSymbols.groupBy { LookupSymbolKey(it.name, it.scope) } + + for (lookup in lookupMap.keys.sorted()) { + val fileIds = lookupMap[lookup]!! - for ((lookup, fileIds) in lookups.entries.sortedBy { it.key }) { val key = if (lookup in lookupsStrings) { lookupsStrings[lookup]!!.map { "${it.scope}#${it.name}" }.sorted().joinToString(", ") } @@ -171,14 +172,12 @@ class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { } class LookupTrackerImpl(private val delegate: LookupTracker) : LookupTracker { - val lookups = MultiMap() + val lookups = MultiMap() override fun record(locationInfo: LocationInfo, scopeFqName: String, scopeKind: ScopeKind, name: String) { - lookups.putValue(LookupSymbol(name, scopeFqName), File(locationInfo.filePath)) + lookups.putValue(LookupSymbol(name, scopeFqName), locationInfo.filePath) delegate.record(locationInfo, scopeFqName, scopeKind, name) } } data class LookupSymbol(val name: String, val scope: String) - -fun LookupSymbol.toHashPair() = LookupHashPair(name, scope) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/BasicMap.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/BasicMap.kt index 7ac1c2188f8..839e645b726 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/BasicMap.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/BasicMap.kt @@ -21,7 +21,6 @@ import com.intellij.util.io.EnumeratorStringDescriptor import com.intellij.util.io.KeyDescriptor import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.utils.Printer -import org.jetbrains.kotlin.utils.keysToMap import java.io.File internal abstract class BasicMap, V>( @@ -43,8 +42,6 @@ internal abstract class BasicMap, V>( storage.close() } - public fun copyAsMap(): Map = storage.keys.keysToMap { storage[it]!! } - @TestOnly fun dump(): String { return with(StringBuilder()) { diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/FileToIdMap.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/FileToIdMap.kt index 5b67eff5664..021768d0fcb 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/FileToIdMap.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/FileToIdMap.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.jps.incremental.storage +import org.jetbrains.kotlin.utils.keysToMap import java.io.File class FileToIdMap(file: File) : BasicMap(file, FileKeyDescriptor, IntExternalizer) { @@ -32,4 +33,6 @@ class FileToIdMap(file: File) : BasicMap(file, FileKeyDescriptor, Int public fun remove(file: File) { storage.remove(file) } + + public fun toMap(): Map = storage.keys.keysToMap { storage[it]!! } } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/LookupMap.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/LookupMap.kt index 5a79a9ae5c1..c20f00541a4 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/LookupMap.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/LookupMap.kt @@ -18,25 +18,25 @@ package org.jetbrains.kotlin.jps.incremental.storage import java.io.File -class LookupMap(storage: File) : BasicMap>(storage, LookupHashPairKeyDescriptor, IntSetExternalizer) { - override fun dumpKey(key: LookupHashPair): String = key.toString() +class LookupMap(storage: File) : BasicMap>(storage, LookupSymbolKeyDescriptor, IntSetExternalizer) { + override fun dumpKey(key: LookupSymbolKey): String = key.toString() override fun dumpValue(value: Set): String = value.toString() public fun add(name: String, scope: String, fileId: Int) { - storage.append(LookupHashPair(name, scope)) { out -> out.writeInt(fileId) } + storage.append(LookupSymbolKey(name, scope)) { out -> out.writeInt(fileId) } } - public operator fun get(lookupHash: LookupHashPair): Set? = storage[lookupHash] + public operator fun get(key: LookupSymbolKey): Set? = storage[key] - public operator fun set(key: LookupHashPair, fileIds: Set) { - storage.set(key, fileIds) + public operator fun set(key: LookupSymbolKey, fileIds: Set) { + storage[key] = fileIds } - public fun remove(key: LookupHashPair) { + public fun remove(key: LookupSymbolKey) { storage.remove(key) } - public val keys: Collection + public val keys: Collection get() = storage.keys } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/externalizers.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/externalizers.kt index 9888fd957fc..96a5071a136 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/externalizers.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/externalizers.kt @@ -29,22 +29,22 @@ import java.io.DataOutput import java.io.File import java.util.* -object LookupHashPairKeyDescriptor : KeyDescriptor { - override fun read(input: DataInput): LookupHashPair { +object LookupSymbolKeyDescriptor : KeyDescriptor { + override fun read(input: DataInput): LookupSymbolKey { val first = input.readInt() val second = input.readInt() - return LookupHashPair(first, second) + return LookupSymbolKey(first, second) } - override fun save(output: DataOutput, value: LookupHashPair) { + override fun save(output: DataOutput, value: LookupSymbolKey) { output.writeInt(value.nameHash) output.writeInt(value.scopeHash) } - override fun getHashCode(value: LookupHashPair): Int = value.hashCode() + override fun getHashCode(value: LookupSymbolKey): Int = value.hashCode() - override fun isEqual(val1: LookupHashPair, val2: LookupHashPair): Boolean = val1 == val2 + override fun isEqual(val1: LookupSymbolKey, val2: LookupSymbolKey): Boolean = val1 == val2 } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/values.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/values.kt index 7ebc2c8e6d7..3eb85f4bb34 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/values.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/storage/values.kt @@ -18,10 +18,10 @@ package org.jetbrains.kotlin.jps.incremental.storage import com.intellij.openapi.util.io.FileUtil -data class LookupHashPair(val nameHash: Int, val scopeHash: Int) : Comparable { +data class LookupSymbolKey(val nameHash: Int, val scopeHash: Int) : Comparable { public constructor(name: String, scope: String) : this(name.hashCode(), scope.hashCode()) - override fun compareTo(other: LookupHashPair): Int { + override fun compareTo(other: LookupSymbolKey): Int { val nameCmp = nameHash.compareTo(other.nameHash) if (nameCmp != 0) return nameCmp diff --git a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt index 10d80382687..fb378feb85f 100644 --- a/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt +++ b/jps/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractIncrementalJpsTest.kt @@ -46,8 +46,8 @@ import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.jps.build.classFilesComparison.assertEqualDirectories -import org.jetbrains.kotlin.jps.incremental.LOOKUP_TRACKER_STORAGE_PROVIDER -import org.jetbrains.kotlin.jps.incremental.LOOKUP_TRACKER_TARGET +import org.jetbrains.kotlin.jps.incremental.LookupStorageProvider +import org.jetbrains.kotlin.jps.incremental.KotlinDataContainerTarget import org.jetbrains.kotlin.jps.incremental.LookupSymbol import org.jetbrains.kotlin.jps.incremental.getKotlinCache import org.jetbrains.kotlin.test.KotlinTestUtils @@ -355,7 +355,7 @@ public abstract class AbstractIncrementalJpsTest( p.println("Begin of Lookup Maps") p.println() - val lookupStorage = project.dataManager.getStorage(LOOKUP_TRACKER_TARGET, LOOKUP_TRACKER_STORAGE_PROVIDER) + val lookupStorage = project.dataManager.getStorage(KotlinDataContainerTarget, LookupStorageProvider) lookupStorage.forceGC() p.print(lookupStorage.dump(lookupsDuringTest))