From 36235e85e7e437ec35993aa63c7cbe9c23648635 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Mon, 8 Feb 2016 16:05:55 +0300 Subject: [PATCH] Reuse code from build-common KT-8487 Original commit: f93562299c339925bdc76e534463c44137bf6750 --- .../kotlin/jps/build/KotlinBuilder.kt | 93 ++----------------- .../incremental/JpsIncrementalCacheImpl.kt | 2 +- 2 files changed, 9 insertions(+), 86 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 60fb5928698..f4aec197e4b 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 @@ -62,7 +62,6 @@ import org.jetbrains.kotlin.jps.incremental.* import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.modules.TargetId -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.progress.CompilationCanceledException import org.jetbrains.kotlin.progress.CompilationCanceledStatus import org.jetbrains.kotlin.utils.JsLibraryUtils @@ -773,88 +772,20 @@ private fun CompilationResult.doProcessChangesUsingLookups( compiledFiles: Set, dataManager: BuildDataManager, fsOperations: FSOperationsHelper, - caches: Collection> + caches: Iterable> ) { - val dirtyLookupSymbols = HashSet() - val dirtyClassesFqNames = HashSet() val lookupStorage = dataManager.getStorage(KotlinDataContainerTarget, JpsLookupStorageProvider) - val allCaches: Sequence> = caches.asSequence().flatMap { it.dependentsWithThis } + val allCaches = caches.flatMap { it.thisWithDependentCaches } + val logAction = { logStr: String -> KotlinBuilder.LOG.debug(logStr) } - KotlinBuilder.LOG.debug("Start processing changes") - - for (change in changes) { - KotlinBuilder.LOG.debug("Process $change") - - if (change is ChangeInfo.SignatureChanged) { - val fqNames = if (!change.areSubclassesAffected) listOf(change.fqName) else withSubtypes(change.fqName, allCaches) - - for (classFqName in fqNames) { - assert(!classFqName.isRoot) { "classFqName is root when processing $change" } - - val scope = classFqName.parent().asString() - val name = classFqName.shortName().identifier - dirtyLookupSymbols.add(LookupSymbol(name, scope)) - } - } - else if (change is ChangeInfo.MembersChanged) { - val fqNames = withSubtypes(change.fqName, allCaches) - // need to recompile subtypes because changed member might break override - dirtyClassesFqNames.addAll(fqNames) - - change.names.forAllPairs(fqNames) { name, fqName -> - dirtyLookupSymbols.add(LookupSymbol(name, fqName.asString())) - } - } - } - - val dirtyFiles = HashSet() - - for (lookup in dirtyLookupSymbols) { - val affectedFiles = lookupStorage.get(lookup).map(::File) - - KotlinBuilder.LOG.debug { "${lookup.scope}#${lookup.name} caused recompilation of: $affectedFiles" } - - dirtyFiles.addAll(affectedFiles) - } - - for (cache in allCaches) { - for (dirtyClassFqName in dirtyClassesFqNames) { - val srcFile = cache.getSourceFileIfClass(dirtyClassFqName) ?: continue - dirtyFiles.add(srcFile) - } - } + logAction("Start processing changes") + val (dirtyLookupSymbols, dirtyClassFqNames) = getDirtyData(allCaches, logAction) + val dirtyFiles = mapLookupSymbolsToFiles(lookupStorage, dirtyLookupSymbols, logAction) + + mapClassesFqNamesToFiles(allCaches, dirtyClassFqNames, logAction) fsOperations.markFiles(dirtyFiles.asIterable(), excludeFiles = compiledFiles) - KotlinBuilder.LOG.debug("End of processing changes") -} -/** - * Returns type with its subtypes transitively - * - * For example: - * open class A - * open class B : A() - * class C : B() - * withSubtypes(A) will return [A, B, C] - */ -private fun withSubtypes( - typeFqName: FqName, - caches: Sequence> -): Set { - val types = LinkedList(listOf(typeFqName)) - val subtypes = hashSetOf() - - while (types.isNotEmpty()) { - val unprocessedType = types.pollFirst() - - caches.flatMap { it.getSubtypesOf(unprocessedType) } - .filter { it !in subtypes } - .forEach { types.addLast(it) } - - subtypes.add(unprocessedType) - } - - return subtypes + logAction("End of processing changes") } private fun getLookupTracker(project: JpsProject): LookupTracker { @@ -948,14 +879,6 @@ private fun hasKotlinDirtyOrRemovedFiles( return chunk.targets.any { KotlinSourceFileCollector.getRemovedKotlinFiles(dirtyFilesHolder, it).isNotEmpty() } } -private inline fun Iterable.forAllPairs(other: Iterable, fn: (T, R)->Unit) { - for (t in this) { - for (r in other) { - fn(t, r) - } - } -} - private inline fun Logger.debug(message: ()->String) { if (isDebugEnabled) { debug(message()) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCacheImpl.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCacheImpl.kt index 8c199778276..1f8782e6712 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCacheImpl.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/incremental/JpsIncrementalCacheImpl.kt @@ -60,7 +60,7 @@ class JpsIncrementalCacheImpl( for ((className, functions) in dirtyInlineFunctionsMap.getEntries()) { val classFilePath = getClassFilePath(className.internalName) - for (cache in dependentsWithThis) { + for (cache in thisWithDependentCaches) { val targetFiles = functions.flatMap { (cache as JpsIncrementalCacheImpl).inlinedTo[classFilePath, it] } result.addAll(targetFiles) }