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
|
val moduleId: String
|
||||||
) : PackageFragmentProvider {
|
) : PackageFragmentProvider {
|
||||||
|
|
||||||
private companion object {
|
companion object {
|
||||||
private val LOG = Logger.getLogger(IncrementalPackageFragmentProvider::class.java)
|
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 obsoletePackageParts = incrementalCache.getObsoletePackageParts().toSet()
|
||||||
val fqNameToSubFqNames = MultiMap<FqName, FqName>()
|
val fqNameToSubFqNames = MultiMap<FqName, FqName>()
|
||||||
val fqNameToPackageFragment = HashMap<FqName, PackageFragmentDescriptor>()
|
val fqNameToPackageFragment = HashMap<FqName, PackageFragmentDescriptor>()
|
||||||
val fqNamesToLoad: Set<FqName>
|
val fqNamesToLoad: Set<FqName> = fqNamesToLoad(obsoletePackageParts, sourceFiles)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
fun createPackageFragment(fqName: FqName) {
|
fun createPackageFragment(fqName: FqName) {
|
||||||
@@ -76,11 +80,6 @@ public class IncrementalPackageFragmentProvider(
|
|||||||
fqNameToPackageFragment[fqName] = IncrementalPackageFragment(fqName)
|
fqNameToPackageFragment[fqName] = IncrementalPackageFragment(fqName)
|
||||||
}
|
}
|
||||||
|
|
||||||
fqNamesToLoad = (
|
|
||||||
obsoletePackageParts.map { JvmClassName.byInternalName(it).getPackageFqName() }
|
|
||||||
+ PackagePartClassUtils.getFilesWithCallables(sourceFiles).map { it.getPackageFqName() }
|
|
||||||
).toSet()
|
|
||||||
|
|
||||||
fqNamesToLoad.forEach { createPackageFragment(it) }
|
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.builtins.KotlinBuiltIns;
|
||||||
import org.jetbrains.kotlin.context.ModuleContext;
|
import org.jetbrains.kotlin.context.ModuleContext;
|
||||||
import org.jetbrains.kotlin.context.MutableModuleContext;
|
import org.jetbrains.kotlin.context.MutableModuleContext;
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleParameters;
|
|
||||||
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider;
|
|
||||||
import org.jetbrains.kotlin.frontend.java.di.ContainerForTopDownAnalyzerForJvm;
|
import org.jetbrains.kotlin.frontend.java.di.ContainerForTopDownAnalyzerForJvm;
|
||||||
import org.jetbrains.kotlin.frontend.java.di.DiPackage;
|
import org.jetbrains.kotlin.frontend.java.di.DiPackage;
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker;
|
import org.jetbrains.kotlin.incremental.components.LookupTracker;
|
||||||
import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider;
|
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.IncrementalCache;
|
||||||
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
|
import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
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.psi.JetFile;
|
||||||
import org.jetbrains.kotlin.resolve.*;
|
import org.jetbrains.kotlin.resolve.*;
|
||||||
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisCompletedHandlerExtension;
|
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.lazy.declarations.FileBasedDeclarationProviderFactory;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
import org.jetbrains.kotlin.resolve.scopes.JetScope;
|
||||||
@@ -131,6 +128,8 @@ public enum TopDownAnalyzerFacadeForJVM {
|
|||||||
LookupTracker lookupTracker =
|
LookupTracker lookupTracker =
|
||||||
incrementalCompilationComponents != null ? incrementalCompilationComponents.getLookupTracker() : LookupTracker.DO_NOTHING;
|
incrementalCompilationComponents != null ? incrementalCompilationComponents.getLookupTracker() : LookupTracker.DO_NOTHING;
|
||||||
|
|
||||||
|
packagePartProvider = IncrementalPackagePartProvider.create(packagePartProvider, files, moduleIds, incrementalCompilationComponents, moduleContext.getStorageManager());
|
||||||
|
|
||||||
ContainerForTopDownAnalyzerForJvm container = DiPackage.createContainerForTopDownAnalyzerForJvm(
|
ContainerForTopDownAnalyzerForJvm container = DiPackage.createContainerForTopDownAnalyzerForJvm(
|
||||||
moduleContext,
|
moduleContext,
|
||||||
trace,
|
trace,
|
||||||
|
|||||||
Reference in New Issue
Block a user