Introduce IncrementalPackagePartProvider to load unchanged compiled package parts using module mapping info from incremental cache
This commit is contained in:
committed by
Michael Bogdanov
parent
ec62cccb1a
commit
f48346f272
+6
-8
@@ -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(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+60
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-5
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user