From f48346f272a69f454e6434e71e8f36300d898ed6 Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 4 Sep 2015 18:32:25 +0300 Subject: [PATCH] Introduce IncrementalPackagePartProvider to load unchanged compiled package parts using module mapping info from incremental cache --- .../IncrementalPackageFragmentProvider.kt | 14 ++--- .../IncrementalPackagePartProvider.kt | 60 +++++++++++++++++++ .../jvm/TopDownAnalyzerFacadeForJVM.java | 9 ++- 3 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt index eb2be0b2111..0f3a25a09fa 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackageFragmentProvider.kt @@ -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, sourceFiles: Collection): Set = + (obsoletePackageParts.map { JvmClassName.byInternalName(it).packageFqName } + + PackagePartClassUtils.getFilesWithCallables(sourceFiles).map { it.packageFqName }).toSet() } val obsoletePackageParts = incrementalCache.getObsoletePackageParts().toSet() val fqNameToSubFqNames = MultiMap() val fqNameToPackageFragment = HashMap() - val fqNamesToLoad: Set + val fqNamesToLoad: Set = 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( } } } - diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt new file mode 100644 index 00000000000..41df41bd8a7 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/incremental/IncrementalPackagePartProvider.kt @@ -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, + incrementalCaches: List, + 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 { + 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, + moduleIds: List?, + 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) + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java index 2562d1b814b..5dda520fea7 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.java @@ -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,