From 596fdab2f2fa9b3de8c79826cd74d70d0c5e6e07 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 27 Sep 2016 11:34:48 +0300 Subject: [PATCH] Extract container for single-module top-down analysis --- .../cli/jvm/repl/CliReplAnalyzerEngine.kt | 12 +++------ .../kotlin/frontend/java/di/injection.kt | 26 ++++++++++++++++--- .../kotlin/resolve/jvm/JvmAnalyzerFacade.kt | 3 +-- .../jvm/TopDownAnalyzerFacadeForJVM.kt | 14 +++++++++- ...tionalBuiltInsMembersSignatureListsTest.kt | 9 +++---- .../AbstractLocalClassProtoTest.kt | 9 +++---- .../AbstractBuiltInsWithJDKMembersTest.kt | 9 +++---- 7 files changed, 49 insertions(+), 33 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt index 675a3f2d65f..94d4c72a834 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/CliReplAnalyzerEngine.kt @@ -20,14 +20,12 @@ import com.intellij.psi.search.ProjectScope import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.Severity -import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm -import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownSingleModuleAnalyzerForJvm import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.* @@ -54,16 +52,14 @@ class CliReplAnalyzerEngine(environment: KotlinCoreEnvironment) { val moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(environment.project, environment.configuration) this.module = moduleContext.module - scriptDeclarationFactory = ScriptMutableDeclarationProviderFactory() + this.scriptDeclarationFactory = ScriptMutableDeclarationProviderFactory() - val container = createContainerForTopDownAnalyzerForJvm( + val container = createContainerForTopDownSingleModuleAnalyzerForJvm( moduleContext, trace, scriptDeclarationFactory, ProjectScope.getAllScope(environment.project), - LookupTracker.DO_NOTHING, - JvmPackagePartProvider(environment), - LanguageVersionSettingsImpl.DEFAULT + JvmPackagePartProvider(environment) ) this.resolveSession = container.get() diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt index eec3bdac7ef..5992afa708c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt @@ -20,6 +20,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.* import org.jetbrains.kotlin.context.LazyResolveToken import org.jetbrains.kotlin.context.ModuleContext @@ -30,6 +31,7 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.load.java.InternalFlexibleTypeTransformer import org.jetbrains.kotlin.load.java.JavaClassFinderImpl import org.jetbrains.kotlin.load.java.components.* +import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolver import org.jetbrains.kotlin.load.java.lazy.SingleModuleClassResolver import org.jetbrains.kotlin.load.java.sam.SamConversionResolverImpl import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava @@ -80,7 +82,7 @@ fun createContainerForLazyResolveWithJava( bindingTrace: BindingTrace, declarationProviderFactory: DeclarationProviderFactory, moduleContentScope: GlobalSearchScope, - registerModuleClassResolver: StorageComponentContainer.() -> Unit, + moduleClassResolver: ModuleClassResolver, targetEnvironment: TargetEnvironment, lookupTracker: LookupTracker, packagePartProvider: PackagePartProvider, @@ -91,7 +93,7 @@ fun createContainerForLazyResolveWithJava( configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, lookupTracker, languageVersionSettings) useInstance(packagePartProvider) - registerModuleClassResolver() + useInstance(moduleClassResolver) useInstance(declarationProviderFactory) targetEnvironment.configure(this) @@ -111,14 +113,30 @@ fun createContainerForTopDownAnalyzerForJvm( moduleContentScope: GlobalSearchScope, lookupTracker: LookupTracker, packagePartProvider: PackagePartProvider, - languageVersionSettings: LanguageVersionSettings + languageVersionSettings: LanguageVersionSettings, + moduleClassResolver: ModuleClassResolver ): ComponentProvider = createContainerForLazyResolveWithJava( - moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, { useImpl() }, + moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, moduleClassResolver, CompilerEnvironment, lookupTracker, packagePartProvider, languageVersionSettings, useLazyResolve = false ).apply { initJvmBuiltInsForTopDownAnalysis(moduleContext.module, languageVersionSettings) } + +fun createContainerForTopDownSingleModuleAnalyzerForJvm( + moduleContext: ModuleContext, + bindingTrace: BindingTrace, + declarationProviderFactory: DeclarationProviderFactory, + moduleContentScope: GlobalSearchScope, + packagePartProvider: PackagePartProvider +): ComponentProvider = createContainerForTopDownAnalyzerForJvm( + moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, + LookupTracker.DO_NOTHING, packagePartProvider, LanguageVersionSettingsImpl.DEFAULT, SingleModuleClassResolver() +).apply { + get().resolver = get() +} + + fun ComponentProvider.initJvmBuiltInsForTopDownAnalysis(module: ModuleDescriptor, languageVersionSettings: LanguageVersionSettings) { get().initialize(module, languageVersionSettings.supportsFeature(LanguageFeature.AdditionalBuiltInsMembers)) } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt index 78a451e0bef..d52fbb1c167 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/JvmAnalyzerFacade.kt @@ -21,7 +21,6 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.analyzer.* import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get -import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider @@ -85,7 +84,7 @@ object JvmAnalyzerFacade : AnalyzerFacade() { trace, declarationProviderFactory, moduleContentScope, - { useInstance(moduleClassResolver) }, + moduleClassResolver, targetEnvironment, LookupTracker.DO_NOTHING, packagePartProvider, diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt index 87d37d66f4a..1b7678bbe7a 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/TopDownAnalyzerFacadeForJVM.kt @@ -32,6 +32,8 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentProvider import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.load.java.lazy.ModuleClassResolverImpl +import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackageFragmentProvider import org.jetbrains.kotlin.load.kotlin.incremental.IncrementalPackagePartProvider @@ -65,6 +67,14 @@ object TopDownAnalyzerFacadeForJVM { val lookupTracker = incrementalComponents?.getLookupTracker() ?: LookupTracker.DO_NOTHING val targetIds = configuration.get(JVMConfigurationKeys.MODULES)?.map(::TargetId) + val resolverByClass = object : (JavaClass) -> JavaDescriptorResolver { + lateinit var resolver: JavaDescriptorResolver + + override fun invoke(javaClass: JavaClass): JavaDescriptorResolver { + return resolver + } + } + val container = createContainerForTopDownAnalyzerForJvm( moduleContext, trace, @@ -72,8 +82,10 @@ object TopDownAnalyzerFacadeForJVM { GlobalSearchScope.allScope(project), lookupTracker, IncrementalPackagePartProvider.create(packagePartProvider, files, targetIds, incrementalComponents, storageManager), - configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, LanguageVersionSettingsImpl.DEFAULT) + configuration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, LanguageVersionSettingsImpl.DEFAULT), + ModuleClassResolverImpl(resolverByClass) ) + resolverByClass.resolver = container.get() val additionalProviders = ArrayList() diff --git a/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt b/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt index cb62498ac61..24bc36a0675 100644 --- a/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt +++ b/compiler/tests-java8/tests/org/jetbrains/kotlin/serialization/builtins/AdditionalBuiltInsMembersSignatureListsTest.kt @@ -19,13 +19,11 @@ package org.jetbrains.kotlin.serialization.builtins import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.resolveClassByFqName -import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm -import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownSingleModuleAnalyzerForJvm import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.load.kotlin.JvmBuiltInsSettings import org.jetbrains.kotlin.load.kotlin.computeJvmDescriptor @@ -54,10 +52,9 @@ class AdditionalBuiltInsMembersSignatureListsTest : KotlinTestWithEnvironment() val moduleContext = ModuleContext(emptyModule, environment.project) val providerFactory = FileBasedDeclarationProviderFactory(moduleContext.storageManager, emptyList()) - val container = createContainerForTopDownAnalyzerForJvm( + val container = createContainerForTopDownSingleModuleAnalyzerForJvm( moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory, - GlobalSearchScope.allScope(environment.project), LookupTracker.DO_NOTHING, PackagePartProvider.EMPTY, - LanguageVersionSettingsImpl.DEFAULT + GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY ) emptyModule.initialize(container.get().packageFragmentProvider) diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt index 33304efb643..01afebb07d3 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/AbstractLocalClassProtoTest.kt @@ -21,11 +21,9 @@ import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.descriptors.PackagePartProvider -import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm -import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownSingleModuleAnalyzerForJvm import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.structure.reflect.classId @@ -61,10 +59,9 @@ abstract class AbstractLocalClassProtoTest : TestCaseWithTmpdir() { val moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(environment.project, configuration) val providerFactory = FileBasedDeclarationProviderFactory(moduleContext.storageManager, emptyList()) - val container = createContainerForTopDownAnalyzerForJvm( + val container = createContainerForTopDownSingleModuleAnalyzerForJvm( moduleContext, CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(), - providerFactory, GlobalSearchScope.allScope(environment.project), LookupTracker.DO_NOTHING, PackagePartProvider.EMPTY, - LanguageVersionSettingsImpl.DEFAULT + providerFactory, GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY ) moduleContext.initializeModuleContents(container.get().packageFragmentProvider) diff --git a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt index d4c4dcb318e..6de58fb824b 100644 --- a/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt +++ b/compiler/tests/org/jetbrains/kotlin/serialization/builtins/AbstractBuiltInsWithJDKMembersTest.kt @@ -20,12 +20,10 @@ import com.intellij.psi.search.GlobalSearchScope import org.jetbrains.kotlin.builtins.KotlinBuiltIns.* import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.PackagePartProvider -import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownAnalyzerForJvm -import org.jetbrains.kotlin.incremental.components.LookupTracker +import org.jetbrains.kotlin.frontend.java.di.createContainerForTopDownSingleModuleAnalyzerForJvm import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.platform.JvmBuiltIns import org.jetbrains.kotlin.renderer.DescriptorRenderer @@ -62,10 +60,9 @@ abstract class AbstractBuiltInsWithJDKMembersTest : KotlinTestWithEnvironment() val moduleContext = ModuleContext(emptyModule, environment.project) val providerFactory = FileBasedDeclarationProviderFactory(moduleContext.storageManager, emptyList()) - val container = createContainerForTopDownAnalyzerForJvm( + val container = createContainerForTopDownSingleModuleAnalyzerForJvm( moduleContext, CliLightClassGenerationSupport.CliBindingTrace(), providerFactory, - GlobalSearchScope.allScope(environment.project), LookupTracker.DO_NOTHING, PackagePartProvider.EMPTY, - LanguageVersionSettingsImpl.DEFAULT + GlobalSearchScope.allScope(environment.project), PackagePartProvider.EMPTY ) emptyModule.initialize(container.get().packageFragmentProvider)