Introduce IncrementalPackagePartProvider to load unchanged compiled package parts using module mapping info from incremental cache

This commit is contained in:
Zalim Bashorov
2015-09-04 18:32:25 +03:00
committed by Michael Bogdanov
parent ec62cccb1a
commit f48346f272
3 changed files with 70 additions and 13 deletions
@@ -52,14 +52,18 @@ public class IncrementalPackageFragmentProvider(
val moduleId: String
) : PackageFragmentProvider {
private companion object {
companion object {
private val LOG = Logger.getLogger(IncrementalPackageFragmentProvider::class.java)
public fun fqNamesToLoad(obsoletePackageParts: Collection<String>, sourceFiles: Collection<JetFile>): Set<FqName> =
(obsoletePackageParts.map { JvmClassName.byInternalName(it).packageFqName }
+ PackagePartClassUtils.getFilesWithCallables(sourceFiles).map { it.packageFqName }).toSet()
}
val obsoletePackageParts = incrementalCache.getObsoletePackageParts().toSet()
val fqNameToSubFqNames = MultiMap<FqName, FqName>()
val fqNameToPackageFragment = HashMap<FqName, PackageFragmentDescriptor>()
val fqNamesToLoad: Set<FqName>
val fqNamesToLoad: Set<FqName> = fqNamesToLoad(obsoletePackageParts, sourceFiles)
init {
fun createPackageFragment(fqName: FqName) {
@@ -76,11 +80,6 @@ public class IncrementalPackageFragmentProvider(
fqNameToPackageFragment[fqName] = IncrementalPackageFragment(fqName)
}
fqNamesToLoad = (
obsoletePackageParts.map { JvmClassName.byInternalName(it).getPackageFqName() }
+ PackagePartClassUtils.getFilesWithCallables(sourceFiles).map { it.getPackageFqName() }
).toSet()
fqNamesToLoad.forEach { createPackageFragment(it) }
}
@@ -159,4 +158,3 @@ public class IncrementalPackageFragmentProvider(
}
}
}
@@ -0,0 +1,60 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.load.kotlin.incremental
import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.storage.StorageManager
internal class IncrementalPackagePartProvider private constructor(
private val parent: PackagePartProvider,
sourceFiles: Collection<JetFile>,
incrementalCaches: List<IncrementalCache>,
storageManager: StorageManager
) : PackagePartProvider {
private val moduleMappings = storageManager.createLazyValue { incrementalCaches.map { ModuleMapping(it.getModuleMappingData()) } }
private val fqNamesToIgnore =
incrementalCaches.flatMap { IncrementalPackageFragmentProvider.fqNamesToLoad(it.getObsoletePackageParts(), sourceFiles).map { it.asString() } }
override fun findPackageParts(packageFqName: String): List<String> {
val packagePartsFromParent = parent.findPackageParts(packageFqName)
if (packageFqName in fqNamesToIgnore) return packagePartsFromParent
val packagePartsFromCompiled = moduleMappings().map { it.findPackageParts(packageFqName) }.filterNotNull().flatMap { it.parts }
return (packagePartsFromCompiled + packagePartsFromParent).distinct()
}
companion object {
@jvmStatic
public fun create(
parent: PackagePartProvider,
sourceFiles: Collection<JetFile>,
moduleIds: List<String>?,
incrementalCompilationComponents: IncrementalCompilationComponents?,
storageManager: StorageManager
): PackagePartProvider {
if (moduleIds == null || incrementalCompilationComponents == null) return parent
val incrementalCaches = moduleIds.map { incrementalCompilationComponents.getIncrementalCache(it) }
return IncrementalPackagePartProvider(parent, sourceFiles, incrementalCaches, storageManager)
}
}
}
@@ -24,14 +24,12 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.context.ModuleContext;
import org.jetbrains.kotlin.context.MutableModuleContext;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.descriptors.ModuleParameters;
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.frontend.java.di.ContainerForTopDownAnalyzerForJvm;
import org.jetbrains.kotlin.frontend.java.di.DiPackage;
import org.jetbrains.kotlin.incremental.components.LookupTracker;
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider;
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache;
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
import org.jetbrains.kotlin.name.Name;
@@ -40,7 +38,6 @@ import org.jetbrains.kotlin.platform.PlatformToKotlinClassMap;
import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.resolve.*;
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension;
import org.jetbrains.kotlin.descriptors.PackagePartProvider;
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
import org.jetbrains.kotlin.resolve.scopes.JetScope;
@@ -131,6 +128,8 @@ public enum TopDownAnalyzerFacadeForJVM {
LookupTracker lookupTracker =
incrementalCompilationComponents != null ? incrementalCompilationComponents.getLookupTracker() : LookupTracker.DO_NOTHING;
packagePartProvider = IncrementalPackagePartProvider.create(packagePartProvider, files, moduleIds, incrementalCompilationComponents, moduleContext.getStorageManager());
ContainerForTopDownAnalyzerForJvm container = DiPackage.createContainerForTopDownAnalyzerForJvm(
moduleContext,
trace,