diff --git a/.idea/dictionaries/bashor.xml b/.idea/dictionaries/bashor.xml index f44edba8ebd..fa362eaa919 100644 --- a/.idea/dictionaries/bashor.xml +++ b/.idea/dictionaries/bashor.xml @@ -2,8 +2,9 @@ ctor + interner lookups unescape - + \ No newline at end of file diff --git a/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt b/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt index 680a9879826..4c691b500e1 100644 --- a/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt +++ b/build-common/src/org/jetbrains/kotlin/incremental/LookupStorage.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.incremental import com.intellij.util.containers.MultiMap +import com.intellij.util.containers.StringInterner import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.Position @@ -62,8 +63,7 @@ open class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { } } - fun addAll(lookups: Set>>) { - val allPaths = lookups.flatMapTo(HashSet()) { it.value } + fun addAll(lookups: Set>>, allPaths: Set) { val pathToId = allPaths.keysToMap { addFileIfNeeded(File(it)) } for ((lookupSymbol, paths) in lookups) { @@ -183,13 +183,19 @@ open class LookupStorage(private val targetDataDir: File) : BasicMapsOwner() { class LookupTrackerImpl(private val delegate: LookupTracker) : LookupTracker { val lookups = MultiMap() + val pathInterner = StringInterner() + private val interner = StringInterner() override val requiresPosition: Boolean get() = delegate.requiresPosition override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) { - lookups.putValue(LookupSymbol(name, scopeFqName), filePath) - delegate.record(filePath, position, scopeFqName, scopeKind, name) + val internedScopeFqName = interner.intern(scopeFqName) + val internedName = interner.intern(name) + val internedFilePath = pathInterner.intern(filePath) + + lookups.putValue(LookupSymbol(internedName, internedScopeFqName), internedFilePath) + delegate.record(internedFilePath, position, internedScopeFqName, scopeKind, internedName) } } diff --git a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt index 3599055250c..047e02d419b 100644 --- a/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt +++ b/compiler/daemon/src/org/jetbrains/kotlin/daemon/RemoteLookupTrackerClient.kt @@ -16,26 +16,32 @@ package org.jetbrains.kotlin.daemon +import com.intellij.util.containers.StringInterner +import org.jetbrains.kotlin.daemon.common.CompilerCallbackServicesFacade +import org.jetbrains.kotlin.daemon.common.DummyProfiler +import org.jetbrains.kotlin.daemon.common.Profiler import org.jetbrains.kotlin.incremental.components.LookupInfo import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.Position import org.jetbrains.kotlin.incremental.components.ScopeKind -import org.jetbrains.kotlin.daemon.common.CompilerCallbackServicesFacade -import org.jetbrains.kotlin.daemon.common.DummyProfiler -import org.jetbrains.kotlin.daemon.common.Profiler class RemoteLookupTrackerClient(val facade: CompilerCallbackServicesFacade, val eventManger: EventManger, val profiler: Profiler = DummyProfiler()) : LookupTracker { private val isDoNothing = profiler.withMeasure(this) { facade.lookupTracker_isDoNothing() } private val lookups = hashSetOf() + private val interner = StringInterner() override val requiresPosition: Boolean = profiler.withMeasure(this) { facade.lookupTracker_requiresPosition() } override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) { if (isDoNothing) return - lookups.add(LookupInfo(filePath, position, scopeFqName, scopeKind, name)) + val internedFilePath = interner.intern(filePath) + val internedScopeFqName = interner.intern(scopeFqName) + val internedName = interner.intern(name) + + lookups.add(LookupInfo(internedFilePath, position, internedScopeFqName, scopeKind, internedName)) } init { diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 6ab0bf66423..62773565ebb 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -542,7 +542,7 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val removedFiles = chunk.targets.flatMap { KotlinSourceFileCollector.getRemovedKotlinFiles(dirtyFilesHolder, it) } removedFiles.forEach { lookupStorage.removeLookupsFrom(it) } - lookupStorage.addAll(lookupTracker.lookups.entrySet()) + lookupStorage.addAll(lookupTracker.lookups.entrySet(), lookupTracker.pathInterner.values) } // if null is returned, nothing was done diff --git a/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt b/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt index 28455f8773a..bf79ec43766 100644 --- a/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt +++ b/jps-plugin/test/org/jetbrains/kotlin/jps/build/AbstractLookupTrackerTest.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.jps.build import com.intellij.openapi.util.io.FileUtil +import com.intellij.util.containers.StringInterner import org.jetbrains.kotlin.incremental.components.LookupInfo import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.Position @@ -119,12 +120,17 @@ abstract class AbstractLookupTrackerTest : AbstractIncrementalJpsTest( class TestLookupTracker : LookupTracker { val lookups = arrayListOf() + private val interner = StringInterner() override val requiresPosition: Boolean get() = true override fun record(filePath: String, position: Position, scopeFqName: String, scopeKind: ScopeKind, name: String) { - lookups.add(LookupInfo(filePath, position, scopeFqName, scopeKind, name)) + val internedFilePath = interner.intern(filePath) + val internedScopeFqName = interner.intern(scopeFqName) + val internedName = interner.intern(name) + + lookups.add(LookupInfo(internedFilePath, position, internedScopeFqName, scopeKind, internedName)) } }