Add option for skipping calculating all names for optimizing reasons in LazyImportScope
This commit is contained in:
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.platform.TargetPlatform
|
||||
import org.jetbrains.kotlin.platform.TargetPlatformVersion
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.resolve.SealedClassInheritorsProvider
|
||||
import org.jetbrains.kotlin.resolve.scopes.optimization.OptimizingOptions
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import org.jetbrains.kotlin.storage.getValue
|
||||
|
||||
@@ -134,6 +135,7 @@ abstract class ResolverForModuleFactory {
|
||||
resolverForProject: ResolverForProject<M>,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
sealedInheritorsProvider: SealedClassInheritorsProvider,
|
||||
resolveOptimizingOptions: OptimizingOptions? = null,
|
||||
): ResolverForModule
|
||||
}
|
||||
|
||||
|
||||
+3
-1
@@ -45,6 +45,7 @@ import org.jetbrains.kotlin.resolve.extensions.AnalysisHandlerExtension
|
||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
||||
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
|
||||
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactoryService
|
||||
import org.jetbrains.kotlin.resolve.scopes.optimization.OptimizingOptions
|
||||
import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragmentProvider
|
||||
import org.jetbrains.kotlin.serialization.deserialization.MetadataPartProvider
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
@@ -90,7 +91,8 @@ class CommonResolverForModuleFactory(
|
||||
moduleContent: ModuleContent<M>,
|
||||
resolverForProject: ResolverForProject<M>,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
sealedInheritorsProvider: SealedClassInheritorsProvider
|
||||
sealedInheritorsProvider: SealedClassInheritorsProvider,
|
||||
resolveOptimizingOptions: OptimizingOptions?,
|
||||
): ResolverForModule {
|
||||
val (moduleInfo, syntheticFiles, moduleContentScope) = moduleContent
|
||||
val project = moduleContext.project
|
||||
|
||||
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.container.StorageComponentContainer
|
||||
import org.jetbrains.kotlin.container.useImpl
|
||||
import org.jetbrains.kotlin.container.useInstance
|
||||
import org.jetbrains.kotlin.container.useInstanceIfNotNull
|
||||
import org.jetbrains.kotlin.context.ModuleContext
|
||||
import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
|
||||
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
|
||||
@@ -43,6 +44,7 @@ import org.jetbrains.kotlin.resolve.checkers.OptInUsageChecker
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isTypeRefinementEnabled
|
||||
import org.jetbrains.kotlin.resolve.lazy.*
|
||||
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
|
||||
import org.jetbrains.kotlin.resolve.scopes.optimization.OptimizingOptions
|
||||
import org.jetbrains.kotlin.types.KotlinTypeRefinerImpl
|
||||
import org.jetbrains.kotlin.types.checker.KotlinTypePreparator
|
||||
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
||||
@@ -58,7 +60,8 @@ fun StorageComponentContainer.configureModule(
|
||||
analyzerServices: PlatformDependentAnalyzerServices,
|
||||
trace: BindingTrace,
|
||||
languageVersionSettings: LanguageVersionSettings,
|
||||
sealedProvider: SealedClassInheritorsProvider = CliSealedClassInheritorsProvider
|
||||
sealedProvider: SealedClassInheritorsProvider = CliSealedClassInheritorsProvider,
|
||||
optimizingOptions: OptimizingOptions? = null,
|
||||
) {
|
||||
useInstance(sealedProvider)
|
||||
useInstance(moduleContext)
|
||||
@@ -69,6 +72,8 @@ fun StorageComponentContainer.configureModule(
|
||||
useInstance(trace)
|
||||
useInstance(languageVersionSettings)
|
||||
|
||||
useInstanceIfNotNull(optimizingOptions)
|
||||
|
||||
useInstance(platform)
|
||||
useInstance(analyzerServices)
|
||||
|
||||
@@ -179,8 +184,9 @@ fun createContainerForLazyBodyResolve(
|
||||
mainFunctionDetectorFactory: MainFunctionDetector.Factory,
|
||||
sealedProvider: SealedClassInheritorsProvider,
|
||||
controlFlowInformationProviderFactory: ControlFlowInformationProvider.Factory,
|
||||
optimizingOptions: OptimizingOptions? = null
|
||||
): StorageComponentContainer = createContainer("LazyBodyResolve", analyzerServices) {
|
||||
configureModule(moduleContext, platform, analyzerServices, bindingTrace, languageVersionSettings, sealedProvider)
|
||||
configureModule(moduleContext, platform, analyzerServices, bindingTrace, languageVersionSettings, sealedProvider, optimizingOptions)
|
||||
useInstance(mainFunctionDetectorFactory)
|
||||
useInstance(kotlinCodeAnalyzer)
|
||||
useInstance(kotlinCodeAnalyzer.fileScopeProvider)
|
||||
|
||||
@@ -41,6 +41,7 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull
|
||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||
import org.jetbrains.kotlin.resolve.scopes.ImportingScope
|
||||
import org.jetbrains.kotlin.resolve.scopes.optimization.OptimizingOptions
|
||||
import org.jetbrains.kotlin.storage.NotNullLazyValue
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import org.jetbrains.kotlin.storage.getValue
|
||||
@@ -94,7 +95,8 @@ class ImportResolutionComponents(
|
||||
val moduleDescriptor: ModuleDescriptor,
|
||||
val platformToKotlinClassMapper: PlatformToKotlinClassMapper,
|
||||
val languageVersionSettings: LanguageVersionSettings,
|
||||
val deprecationResolver: DeprecationResolver
|
||||
val deprecationResolver: DeprecationResolver,
|
||||
val optimizingOptions: OptimizingOptions,
|
||||
)
|
||||
|
||||
open class LazyImportResolver<I : KtImportInfo>(
|
||||
@@ -131,7 +133,17 @@ open class LazyImportResolver<I : KtImportInfo>(
|
||||
indexedImports.imports.asIterable().flatMapToNullable(THashSet()) { getImportScope(it).computeImportedNames() }
|
||||
}
|
||||
|
||||
fun definitelyDoesNotContainName(name: Name) = allNames?.let { name !in it } == true
|
||||
fun definitelyDoesNotContainName(name: Name): Boolean {
|
||||
// Calculation of all names is undesirable for cases when the scope doesn't live long and is big enough.
|
||||
// In such cases we often do the same work twice - first time for computing definitelyDoesNotContainName
|
||||
// and second time for resolution itself. Results seem to be not reused.
|
||||
// This optimization is used in Kotlin Notebooks
|
||||
return if (components.optimizingOptions.shouldCalculateAllNamesForLazyImportScopeOptimizing(packageFragment?.containingDeclaration)) {
|
||||
allNames?.let { name !in it } == true
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
|
||||
fun recordLookup(name: Name, location: LookupLocation) {
|
||||
if (allNames == null) return
|
||||
|
||||
Reference in New Issue
Block a user