From 7fc692710f84fef468e7a737f76d0e600a9cf7f8 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 30 Oct 2015 17:46:32 +0300 Subject: [PATCH] Use new lookup tracker only when experimental incremental compilation is enabled Original commit: 67878fe13ac8dcf1692d49459090f5eede3221a9 --- .../kotlin/jps/build/KotlinBuilder.kt | 41 ++++++++++++++++--- .../jps/incremental/IncrementalCacheImpl.kt | 8 ++-- .../jps/incremental/LookupTrackerImpl.kt | 14 ++++++- 3 files changed, 52 insertions(+), 11 deletions(-) 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 9c9a09d13ad..1b30c609e12 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 @@ -35,6 +35,7 @@ import org.jetbrains.jps.incremental.fs.CompilationRound import org.jetbrains.jps.incremental.java.JavaBuilder import org.jetbrains.jps.incremental.messages.BuildMessage import org.jetbrains.jps.incremental.messages.CompilerMessage +import org.jetbrains.jps.incremental.storage.BuildDataManager import org.jetbrains.jps.model.JpsProject import org.jetbrains.jps.model.JpsSimpleElement import org.jetbrains.jps.model.ex.JpsElementChildRoleBase @@ -53,6 +54,7 @@ import org.jetbrains.kotlin.config.CompilerRunnerConstants.INTERNAL_ERROR_PREFIX import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.config.Services import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.incremental.components.ScopeKind import org.jetbrains.kotlin.jps.JpsKotlinCompilerSettings import org.jetbrains.kotlin.jps.incremental.* import org.jetbrains.kotlin.load.kotlin.ModuleMapping @@ -151,9 +153,8 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR messageCollector.report(INFO, "Kotlin JPS plugin version " + KotlinVersion.VERSION, CompilerMessageLocation.NO_LOCATION) val project = projectDescriptor.project - - val lookupTracker = dataManager.getStorage(LOOKUP_TRACKER_TARGET, LOOKUP_TRACKER_STORAGE_PROVIDER) - val incrementalCaches = getIncrementalCaches(chunk, context, lookupTracker) + val (lookupTracker, lookupStorage) = getLookupTrackerAndStorage(dataManager, project) + val incrementalCaches = getIncrementalCaches(chunk, context, lookupStorage) val environment = createCompileEnvironment(incrementalCaches, lookupTracker, context) if (!environment.success()) { environment.reportErrorsTo(messageCollector) @@ -623,7 +624,37 @@ public class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR private val Iterable>.moduleTargets: Iterable get() = filterIsInstance(javaClass()) -private fun getIncrementalCaches(chunk: ModuleChunk, context: CompileContext, lookupTrackerImpl: LookupTrackerImpl?): Map { +private fun getLookupTrackerAndStorage(dataManager: BuildDataManager, project: JpsProject): Pair { + var lookupTracker = LookupTracker.DO_NOTHING + var lookupStorage = LookupStorage.DO_NOTHING + + if (IncrementalCompilation.isExperimental()) { + val lookupTrackerImpl = dataManager.getStorage(LOOKUP_TRACKER_TARGET, LOOKUP_TRACKER_STORAGE_PROVIDER) + lookupTracker = lookupTrackerImpl + lookupStorage = lookupTrackerImpl + } + + val inTest = "true".equals(System.getProperty("kotlin.jps.tests"), ignoreCase = true) + if (inTest) { + val testTracker = project.container.getChild(KotlinBuilder.LOOKUP_TRACKER)?.data + + if (testTracker != null) { + lookupTracker = CopyingLookupTracker(lookupTracker, testTracker) + } + } + + return lookupTracker to lookupStorage +} + +private class CopyingLookupTracker(private val lookupTrackers: Collection) : LookupTracker { + constructor(vararg lookupTrackers: LookupTracker) : this(lookupTrackers.toList()) + + override fun record(lookupContainingFile: String, lookupLine: Int?, lookupColumn: Int?, scopeFqName: String, scopeKind: ScopeKind, name: String) { + lookupTrackers.forEach { it.record(lookupContainingFile, lookupLine, lookupColumn, scopeFqName, scopeKind, name) } + } +} + +private fun getIncrementalCaches(chunk: ModuleChunk, context: CompileContext, lookupStorage: LookupStorage): Map { val dataManager = context.projectDescriptor.dataManager val targets = chunk.targets @@ -654,7 +685,7 @@ private fun getIncrementalCaches(chunk: ModuleChunk, context: CompileContext, lo cache.addDependentCache(caches[it]!!) } - cache.setLookupTracker(lookupTrackerImpl) + cache.setLookupStorage(lookupStorage) } return caches diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt index 45fa8477dc7..09fbd149110 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/IncrementalCacheImpl.kt @@ -89,10 +89,10 @@ public class IncrementalCacheImpl( private val cacheFormatVersion = CacheFormatVersion(targetDataRoot) private val dependents = arrayListOf() private val outputDir = requireNotNull(target.outputDir) { "Target is expected to have output directory: $target" } - private var lookupTrackerImpl: LookupTrackerImpl? = null + private var _lookupStorage: LookupStorage = LookupStorage.DO_NOTHING - public fun setLookupTracker(lookupTrackerImpl: LookupTrackerImpl?) { - this.lookupTrackerImpl = lookupTrackerImpl + public fun setLookupStorage(lookupStorage: LookupStorage) { + this._lookupStorage = lookupStorage } override fun registerInline(fromPath: String, jvmSignature: String, toPath: String) { @@ -503,7 +503,7 @@ public class IncrementalCacheImpl( private fun remove(path: String) { storage.remove(path) - lookupTrackerImpl?.removeLookupsFrom(File(path)) + _lookupStorage.removeLookupsFrom(File(path)) } } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupTrackerImpl.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupTrackerImpl.kt index 9b973baef95..4b4b36a7db4 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupTrackerImpl.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/LookupTrackerImpl.kt @@ -29,7 +29,17 @@ object LOOKUP_TRACKER_STORAGE_PROVIDER : StorageProvider() { override fun createStorage(targetDataDir: File): LookupTrackerImpl = LookupTrackerImpl(targetDataDir) } -class LookupTrackerImpl(private val targetDataDir: File) : BasicMapsOwner(), LookupTracker { +interface LookupStorage { + fun removeLookupsFrom(file: File) + + companion object { + val DO_NOTHING: LookupStorage = object : LookupStorage { + override fun removeLookupsFrom(file: File) {} + } + } +} + +class LookupTrackerImpl(private val targetDataDir: File) : BasicMapsOwner(), LookupTracker, LookupStorage { companion object { private val DELETED_TO_SIZE_TRESHOLD = 0.5 @@ -60,7 +70,7 @@ class LookupTrackerImpl(private val targetDataDir: File) : BasicMapsOwner(), Loo lookupMap.add(name, scopeFqName, fileId) } - fun removeLookupsFrom(file: File) { + override fun removeLookupsFrom(file: File) { val id = fileToId[file] ?: return idToFile.remove(id) fileToId.remove(file)