Simplified process of filtering out obsolete package parts and loading descriptors from incremental caches.

Now when file is deleted or dirty (compiled right now), its old package part is used. Current package of file doesn't matter.
This commit is contained in:
Evgeny Gerashchenko
2015-02-03 17:18:17 +03:00
parent 512ea72e69
commit f071802e19
23 changed files with 176 additions and 62 deletions
@@ -24,21 +24,13 @@ import java.util.HashMap
import java.io.File
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
public fun IncrementalCache.getPackagesWithRemovedFiles(sourceFilesToCompile: Collection<JetFile>): Collection<FqName> {
return getRemovedPackageParts(sourceFilesToCompile).map { it.getPackageFqName() }
// TODO JetFiles are redundant
public fun IncrementalCache.getPackagesWithObsoleteParts(sourceFilesToCompile: Collection<JetFile>): Collection<FqName> {
return getObsoletePackageParts(sourceFilesToCompile).map { it.getPackageFqName() }
}
public fun IncrementalCache.getRemovedPackageParts(sourceFilesToCompile: Collection<JetFile>): Collection<JvmClassName> {
val sourceFilesToFqName = HashMap<File, String?>()
for (sourceFile in sourceFilesToCompile) {
sourceFilesToFqName[File(sourceFile.getVirtualFile()!!.getPath())] =
if (PackagePartClassUtils.fileHasCallables(sourceFile))
sourceFile.getPackageFqName().asString()
else
null
}
return getRemovedPackageParts(sourceFilesToFqName).map { JvmClassName.byInternalName(it) }
public fun IncrementalCache.getObsoletePackageParts(sourceFilesToCompile: Collection<JetFile>): Collection<JvmClassName> {
return getObsoletePackageParts(sourceFilesToCompile.map { File(it.getVirtualFile()!!.getPath()) }).map { JvmClassName.byInternalName(it) }
}
public fun IncrementalCache.getPackageData(fqName: FqName): ByteArray? {
@@ -47,10 +47,7 @@ public class IncrementalPackageFragmentProvider(
val moduleId: String
) : PackageFragmentProvider {
val packagePartsToNotLoadFromCache = (
sourceFiles.map { PackagePartClassUtils.getPackagePartInternalName(it) }
+ incrementalCache.getRemovedPackageParts(sourceFiles).map { it.getInternalName() }
).toSet()
val obsoletePackageParts = incrementalCache.getObsoletePackageParts(sourceFiles).map { it.getInternalName() }.toSet()
val fqNameToSubFqNames = MultiMap<FqName, FqName>()
val fqNameToPackageFragment = HashMap<FqName, PackageFragmentDescriptor>()
val fqNamesToLoad: Set<FqName>
@@ -70,10 +67,7 @@ public class IncrementalPackageFragmentProvider(
fqNameToPackageFragment[fqName] = IncrementalPackageFragment(fqName)
}
fqNamesToLoad = (
PackagePartClassUtils.getPackageFilesWithCallables(sourceFiles).map { it.getPackageFqName() }
+ incrementalCache.getPackagesWithRemovedFiles(sourceFiles)
).toSet()
fqNamesToLoad = incrementalCache.getPackagesWithObsoleteParts(sourceFiles).toSet()
fqNamesToLoad.forEach { createPackageFragment(it) }
}
@@ -119,7 +113,7 @@ public class IncrementalPackageFragmentProvider(
if (member.hasExtension(JvmProtoBuf.implClassName)) {
val shortName = packageData.getNameResolver().getName(member.getExtension(JvmProtoBuf.implClassName)!!)
val internalName = JvmClassName.byFqNameWithoutInnerClasses(fqName.child(shortName)).getInternalName()
internalName !in packagePartsToNotLoadFromCache
internalName !in obsoletePackageParts
}
else {
true
@@ -19,10 +19,7 @@ package org.jetbrains.kotlin.load.kotlin.incremental.cache
import java.io.File
public trait IncrementalCache {
public fun getRemovedPackageParts(
// null value means source file has no top-level callables (won't produce package part)
sourceFilesToCompileAndFqNames: Map<File, String?>
): Collection<String>
public fun getObsoletePackageParts(sourceFilesToCompile: Collection<File>): Collection<String>
public fun getPackageData(fqName: String): ByteArray?