Simplify injection of LanguageVersionSettings into JVM analysis

Pass the LanguageVersionSettings instance inside the CompilerConfiguration,
since it's needed anyway. In compiler and tests, the configuration comes from
KotlinCoreEnvironment; in IDE, we're constructing it in JvmAnalyzerFacade
This commit is contained in:
Alexander Udalov
2017-02-10 18:56:57 +03:00
parent f2aacf774e
commit ee1152bc98
4 changed files with 39 additions and 46 deletions
@@ -19,9 +19,7 @@ package org.jetbrains.kotlin.frontend.java.di
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.builtins.JvmBuiltInsPackageFragmentProvider
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.container.*
import org.jetbrains.kotlin.context.LazyResolveToken
import org.jetbrains.kotlin.context.ModuleContext
@@ -46,11 +44,10 @@ import org.jetbrains.kotlin.resolve.lazy.KotlinCodeAnalyzer
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory
fun StorageComponentContainer.configureJavaTopDownAnalysis(
private fun StorageComponentContainer.configureJavaTopDownAnalysis(
moduleContentScope: GlobalSearchScope,
project: Project,
lookupTracker: LookupTracker,
languageVersionSettings: LanguageVersionSettings
lookupTracker: LookupTracker
) {
useInstance(moduleContentScope)
useInstance(lookupTracker)
@@ -75,7 +72,6 @@ fun StorageComponentContainer.configureJavaTopDownAnalysis(
useImpl<JavaSourceElementFactoryImpl>()
useInstance(InternalFlexibleTypeTransformer)
useInstance(languageVersionSettings)
useImpl<CompilerDeserializationConfiguration>()
}
@@ -88,19 +84,20 @@ fun createContainerForLazyResolveWithJava(
targetEnvironment: TargetEnvironment,
lookupTracker: LookupTracker,
packagePartProvider: PackagePartProvider,
languageVersionSettings: LanguageVersionSettings,
compilerConfiguration: CompilerConfiguration,
useBuiltInsProvider: Boolean,
useLazyResolve: Boolean,
compilerConfiguration: CompilerConfiguration
useLazyResolve: Boolean
): StorageComponentContainer = createContainer("LazyResolveWithJava", JvmPlatform) {
configureModule(moduleContext, JvmPlatform, bindingTrace)
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, lookupTracker, languageVersionSettings)
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, lookupTracker)
useInstance(compilerConfiguration)
useInstance(packagePartProvider)
useInstance(moduleClassResolver)
useInstance(declarationProviderFactory)
useInstance(compilerConfiguration.get(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, LanguageVersionSettingsImpl.DEFAULT))
if (useBuiltInsProvider) {
useInstance((moduleContext.module.builtIns as JvmBuiltIns).settings)
useImpl<JvmBuiltInsPackageFragmentProvider>()
@@ -123,18 +120,17 @@ fun createContainerForTopDownAnalyzerForJvm(
moduleContentScope: GlobalSearchScope,
lookupTracker: LookupTracker,
packagePartProvider: PackagePartProvider,
languageVersionSettings: LanguageVersionSettings,
moduleClassResolver: ModuleClassResolver,
compilerConfiguration: CompilerConfiguration
): ComponentProvider = createContainerForLazyResolveWithJava(
moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, moduleClassResolver,
CompilerEnvironment, lookupTracker, packagePartProvider, languageVersionSettings,
useBuiltInsProvider = true, useLazyResolve = false, compilerConfiguration = compilerConfiguration
CompilerEnvironment, lookupTracker, packagePartProvider, compilerConfiguration,
useBuiltInsProvider = true, useLazyResolve = false
)
fun ComponentProvider.initJvmBuiltInsForTopDownAnalysis(module: ModuleDescriptor, languageVersionSettings: LanguageVersionSettings) {
get<JvmBuiltIns>().initialize(module, languageVersionSettings)
fun ComponentProvider.initJvmBuiltInsForTopDownAnalysis() {
get<JvmBuiltIns>().initialize(get<ModuleDescriptor>(), get<LanguageVersionSettings>())
}
internal fun JvmBuiltIns.initialize(module: ModuleDescriptor, languageVersionSettings: LanguageVersionSettings) {
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm
import com.intellij.openapi.diagnostic.Logger
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.*
import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmTarget
@@ -81,15 +82,20 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
resolverForModule.componentProvider.get<JavaDescriptorResolver>()
}
val languageSettingsProvider = LanguageSettingsProvider.getInstance(project)
val trace = CodeAnalyzerInitializer.getInstance(project).createTrace()
//TODO: need to propagate full CompilerConfiguration to frontend
val compilerConfiguration = CompilerConfiguration()
val platform = languageSettingsProvider.getTargetPlatform(moduleInfo)
if (platform is JvmTarget) {
compilerConfiguration.put(JVMConfigurationKeys.JVM_TARGET, platform)
val configuration = CompilerConfiguration().apply {
val languageSettingsProvider = LanguageSettingsProvider.getInstance(project)
put(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project))
val platform = languageSettingsProvider.getTargetPlatform(moduleInfo)
if (platform is JvmTarget) {
put(JVMConfigurationKeys.JVM_TARGET, platform)
}
isReadOnly = true
}
compilerConfiguration.isReadOnly = true
val trace = CodeAnalyzerInitializer.getInstance(project).createTrace()
val container = createContainerForLazyResolveWithJava(
moduleContext,
trace,
@@ -99,10 +105,9 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
targetEnvironment,
LookupTracker.DO_NOTHING,
packagePartProvider,
languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project),
configuration,
useBuiltInsProvider = false, // TODO: load built-ins from module dependencies in IDE
useLazyResolve = true,
compilerConfiguration = compilerConfiguration
useLazyResolve = true
)
StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(container, moduleInfo) }
@@ -158,7 +158,7 @@ object TopDownAnalyzerFacadeForJVM {
val dependenciesContainer = createContainerForTopDownAnalyzerForJvm(
dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, lookupTracker,
packagePartProvider(dependencyScope), languageVersionSettings, moduleClassResolver, configuration
packagePartProvider(dependencyScope), moduleClassResolver, configuration
)
StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(dependenciesContainer, null) }
@@ -185,9 +185,9 @@ object TopDownAnalyzerFacadeForJVM {
// TODO: get rid of duplicate invocation of CodeAnalyzerInitializer#initialize, or refactor CliLightClassGenerationSupport
val container = createContainerForTopDownAnalyzerForJvm(
moduleContext, trace, declarationProviderFactory(storageManager, files), sourceScope, lookupTracker,
partProvider, languageVersionSettings, moduleClassResolver, configuration
partProvider, moduleClassResolver, configuration
).apply {
initJvmBuiltInsForTopDownAnalysis(module, languageVersionSettings)
initJvmBuiltInsForTopDownAnalysis()
(partProvider as? IncrementalPackagePartProvider)?.deserializationConfiguration = get<DeserializationConfiguration>()
StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(this, null) }