@@ -309,7 +309,6 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) {
|
||||
}
|
||||
|
||||
changesInfo.processChangesUsingLookups(filesToCompile.values().toSet(), dataManager, fsOperations, incrementalCaches.values)
|
||||
incrementalCaches.values.forEach { it.cleanDirtyInlineFunctions() }
|
||||
|
||||
return OK
|
||||
}
|
||||
|
||||
@@ -16,110 +16,22 @@
|
||||
|
||||
package org.jetbrains.kotlin.jps.incremental
|
||||
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import gnu.trove.THashSet
|
||||
import org.jetbrains.jps.builders.storage.BuildDataPaths
|
||||
import org.jetbrains.jps.builders.storage.StorageProvider
|
||||
import org.jetbrains.jps.incremental.ModuleBuildTarget
|
||||
import org.jetbrains.jps.incremental.storage.BuildDataManager
|
||||
import org.jetbrains.jps.incremental.storage.StorageOwner
|
||||
import org.jetbrains.kotlin.config.IncrementalCompilation
|
||||
import org.jetbrains.kotlin.incremental.IncrementalCacheImpl
|
||||
import org.jetbrains.kotlin.incremental.dumpCollection
|
||||
import org.jetbrains.kotlin.incremental.storage.BasicMap
|
||||
import org.jetbrains.kotlin.incremental.storage.BasicStringMap
|
||||
import org.jetbrains.kotlin.incremental.storage.StringCollectionExternalizer
|
||||
import org.jetbrains.kotlin.jps.build.KotlinBuilder
|
||||
import org.jetbrains.kotlin.jps.incremental.storages.PathCollectionExternalizer
|
||||
import org.jetbrains.kotlin.jps.incremental.storages.PathFunctionPair
|
||||
import org.jetbrains.kotlin.jps.incremental.storages.PathFunctionPairKeyDescriptor
|
||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||
import java.io.File
|
||||
|
||||
class JpsIncrementalCacheImpl(
|
||||
target: ModuleBuildTarget,
|
||||
paths: BuildDataPaths
|
||||
) : IncrementalCacheImpl<ModuleBuildTarget>(paths.getTargetDataRoot(target), target.outputDir, target), StorageOwner {
|
||||
|
||||
private val dirtyInlineFunctionsMap = registerMap(DirtyInlineFunctionsMap(DIRTY_INLINE_FUNCTIONS.storageFile))
|
||||
private val inlinedTo = registerMap(InlineFunctionsFilesMap(INLINED_TO.storageFile))
|
||||
|
||||
override fun registerInline(fromPath: String, jvmSignature: String, toPath: String) {
|
||||
if (!IncrementalCompilation.isEnabled()) {
|
||||
inlinedTo.add(fromPath, jvmSignature, toPath)
|
||||
}
|
||||
}
|
||||
|
||||
override fun debugLog(message: String) {
|
||||
KotlinBuilder.LOG.debug(message)
|
||||
}
|
||||
|
||||
fun getFilesToReinline(): Collection<File> {
|
||||
val result = THashSet(FileUtil.PATH_HASHING_STRATEGY)
|
||||
|
||||
for ((className, functions) in dirtyInlineFunctionsMap.getEntries()) {
|
||||
val classFilePath = getClassFilePath(className.internalName)
|
||||
|
||||
for (cache in thisWithDependentCaches) {
|
||||
val targetFiles = functions.flatMap { (cache as JpsIncrementalCacheImpl).inlinedTo[classFilePath, it] }
|
||||
result.addAll(targetFiles)
|
||||
}
|
||||
}
|
||||
|
||||
return result.map(::File)
|
||||
}
|
||||
|
||||
fun cleanDirtyInlineFunctions() {
|
||||
dirtyInlineFunctionsMap.clean()
|
||||
}
|
||||
|
||||
override fun processChangedInlineFunctions(className: JvmClassName, changedFunctions: Collection<String>) {
|
||||
if (changedFunctions.isNotEmpty()) {
|
||||
dirtyInlineFunctionsMap.put(className, changedFunctions.toList())
|
||||
}
|
||||
}
|
||||
|
||||
private inner class DirtyInlineFunctionsMap(storageFile: File) : BasicStringMap<Collection<String>>(storageFile, StringCollectionExternalizer) {
|
||||
fun getEntries(): Map<JvmClassName, Collection<String>> =
|
||||
storage.keys.associateBy(JvmClassName::byInternalName) { storage[it]!! }
|
||||
|
||||
fun put(className: JvmClassName, changedFunctions: List<String>) {
|
||||
storage[className.internalName] = changedFunctions
|
||||
}
|
||||
|
||||
override fun dumpValue(value: Collection<String>) = value.dumpCollection()
|
||||
}
|
||||
|
||||
/**
|
||||
* Mapping: (sourceFile+inlineFunction)->(targetFiles)
|
||||
*
|
||||
* Where:
|
||||
* * sourceFile - path to some kotlin source
|
||||
* * inlineFunction - jvmSignature of some inline function in source file
|
||||
* * target files - collection of files inlineFunction has been inlined to
|
||||
*/
|
||||
private inner class InlineFunctionsFilesMap(storageFile: File) : BasicMap<PathFunctionPair, Collection<String>>(storageFile, PathFunctionPairKeyDescriptor, PathCollectionExternalizer) {
|
||||
fun add(sourcePath: String, jvmSignature: String, targetPath: String) {
|
||||
val key = PathFunctionPair(sourcePath, jvmSignature)
|
||||
storage.append(key, targetPath)
|
||||
}
|
||||
|
||||
operator fun get(sourcePath: String, jvmSignature: String): Collection<String> {
|
||||
val key = PathFunctionPair(sourcePath, jvmSignature)
|
||||
return storage[key] ?: emptySet()
|
||||
}
|
||||
|
||||
override fun dumpKey(key: PathFunctionPair): String =
|
||||
"(${key.path}, ${key.function})"
|
||||
|
||||
override fun dumpValue(value: Collection<String>) =
|
||||
value.dumpCollection()
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val DIRTY_INLINE_FUNCTIONS = "dirty-inline-functions"
|
||||
private val INLINED_TO = "inlined-to"
|
||||
}
|
||||
}
|
||||
|
||||
private class KotlinIncrementalStorageProvider(
|
||||
|
||||
Reference in New Issue
Block a user