Do not inject CompilerConfiguration into compiler front-end

Inject LanguageVersionSettings instead; all information relevant to the
analysis should be now passed via an instance of LanguageVersionSettings
(which should be renamed to a more general name in the future).

This is partially a revert of d499998 and related commits
This commit is contained in:
Alexander Udalov
2017-03-02 16:28:59 +03:00
parent a879cb0cfd
commit cf7048dd0f
19 changed files with 51 additions and 99 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.frontend.java.di
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.builtins.JvmBuiltInsPackageFragmentProvider import org.jetbrains.kotlin.builtins.JvmBuiltInsPackageFragmentProvider
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
@@ -28,7 +27,6 @@ import org.jetbrains.kotlin.context.LazyResolveToken
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.frontend.di.configureCommon
import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.InternalFlexibleTypeTransformer import org.jetbrains.kotlin.load.java.InternalFlexibleTypeTransformer
@@ -89,7 +87,7 @@ fun createContainerForLazyResolveWithJava(
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
jvmTarget: JvmTarget, jvmTarget: JvmTarget,
compilerConfiguration: CompilerConfiguration, languageVersionSettings: LanguageVersionSettings,
useBuiltInsProvider: Boolean, useBuiltInsProvider: Boolean,
useLazyResolve: Boolean useLazyResolve: Boolean
): StorageComponentContainer = createContainer("LazyResolveWithJava", JvmPlatform) { ): StorageComponentContainer = createContainer("LazyResolveWithJava", JvmPlatform) {
@@ -100,7 +98,7 @@ fun createContainerForLazyResolveWithJava(
useInstance(moduleClassResolver) useInstance(moduleClassResolver)
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
configureCommon(compilerConfiguration) useInstance(languageVersionSettings)
if (useBuiltInsProvider) { if (useBuiltInsProvider) {
useInstance((moduleContext.module.builtIns as JvmBuiltIns).settings) useInstance((moduleContext.module.builtIns as JvmBuiltIns).settings)
@@ -126,10 +124,10 @@ fun createContainerForTopDownAnalyzerForJvm(
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
moduleClassResolver: ModuleClassResolver, moduleClassResolver: ModuleClassResolver,
jvmTarget: JvmTarget, jvmTarget: JvmTarget,
compilerConfiguration: CompilerConfiguration languageVersionSettings: LanguageVersionSettings
): ComponentProvider = createContainerForLazyResolveWithJava( ): ComponentProvider = createContainerForLazyResolveWithJava(
moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, moduleClassResolver, moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, moduleClassResolver,
CompilerEnvironment, lookupTracker, packagePartProvider, jvmTarget, compilerConfiguration, CompilerEnvironment, lookupTracker, packagePartProvider, jvmTarget, languageVersionSettings,
useBuiltInsProvider = true, useLazyResolve = false useBuiltInsProvider = true, useLazyResolve = false
) )
@@ -19,10 +19,7 @@ package org.jetbrains.kotlin.resolve.jvm
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.* import org.jetbrains.kotlin.analyzer.*
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.PackagePartProvider
@@ -84,12 +81,7 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
val languageSettingsProvider = LanguageSettingsProvider.getInstance(project) val languageSettingsProvider = LanguageSettingsProvider.getInstance(project)
val jvmTarget = languageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget ?: JvmTarget.JVM_1_6 val jvmTarget = languageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget ?: JvmTarget.JVM_1_6
val languageVersionSettings = languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
val configuration = CompilerConfiguration().apply {
languageVersionSettings = languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
put(JVMConfigurationKeys.JVM_TARGET, jvmTarget)
isReadOnly = true
}
val trace = CodeAnalyzerInitializer.getInstance(project).createTrace() val trace = CodeAnalyzerInitializer.getInstance(project).createTrace()
@@ -103,7 +95,7 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
LookupTracker.DO_NOTHING, LookupTracker.DO_NOTHING,
packagePartProvider, packagePartProvider,
jvmTarget, jvmTarget,
configuration, languageVersionSettings,
useBuiltInsProvider = false, // TODO: load built-ins from module dependencies in IDE useBuiltInsProvider = false, // TODO: load built-ins from module dependencies in IDE
useLazyResolve = true useLazyResolve = true
) )
@@ -133,11 +133,12 @@ object TopDownAnalyzerFacadeForJVM {
val moduleClassResolver = SourceOrBinaryModuleClassResolver(sourceScope) val moduleClassResolver = SourceOrBinaryModuleClassResolver(sourceScope)
val jvmTarget = configuration.get(JVMConfigurationKeys.JVM_TARGET) ?: JvmTarget.JVM_1_6 val jvmTarget = configuration.get(JVMConfigurationKeys.JVM_TARGET) ?: JvmTarget.JVM_1_6
val languageVersionSettings = configuration.languageVersionSettings
val optionalBuiltInsModule = val optionalBuiltInsModule =
if (configuration.getBoolean(JVMConfigurationKeys.ADD_BUILT_INS_FROM_COMPILER_TO_DEPENDENCIES)) { if (configuration.getBoolean(JVMConfigurationKeys.ADD_BUILT_INS_FROM_COMPILER_TO_DEPENDENCIES)) {
if (createBuiltInsFromModule) if (createBuiltInsFromModule)
JvmBuiltIns(storageManager).apply { initialize(module, configuration.languageVersionSettings) }.builtInsModule JvmBuiltIns(storageManager).apply { initialize(module, languageVersionSettings) }.builtInsModule
else module.builtIns.builtInsModule else module.builtIns.builtInsModule
} }
else null else null
@@ -153,7 +154,7 @@ object TopDownAnalyzerFacadeForJVM {
val dependenciesContainer = createContainerForTopDownAnalyzerForJvm( val dependenciesContainer = createContainerForTopDownAnalyzerForJvm(
dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, lookupTracker, dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, lookupTracker,
packagePartProvider(dependencyScope), moduleClassResolver, jvmTarget, configuration packagePartProvider(dependencyScope), moduleClassResolver, jvmTarget, languageVersionSettings
) )
StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(dependenciesContainer, null) } StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(dependenciesContainer, null) }
@@ -180,7 +181,7 @@ object TopDownAnalyzerFacadeForJVM {
// TODO: get rid of duplicate invocation of CodeAnalyzerInitializer#initialize, or refactor CliLightClassGenerationSupport // TODO: get rid of duplicate invocation of CodeAnalyzerInitializer#initialize, or refactor CliLightClassGenerationSupport
val container = createContainerForTopDownAnalyzerForJvm( val container = createContainerForTopDownAnalyzerForJvm(
moduleContext, trace, declarationProviderFactory(storageManager, files), sourceScope, lookupTracker, moduleContext, trace, declarationProviderFactory(storageManager, files), sourceScope, lookupTracker,
partProvider, moduleClassResolver, jvmTarget, configuration partProvider, moduleClassResolver, jvmTarget, languageVersionSettings
).apply { ).apply {
initJvmBuiltInsForTopDownAnalysis() initJvmBuiltInsForTopDownAnalysis()
(partProvider as? IncrementalPackagePartProvider)?.deserializationConfiguration = get<DeserializationConfiguration>() (partProvider as? IncrementalPackagePartProvider)?.deserializationConfiguration = get<DeserializationConfiguration>()
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.PackagePartProvider
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.di.configureCommon
import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.kotlin.MetadataFinderFactory import org.jetbrains.kotlin.load.kotlin.MetadataFinderFactory
@@ -49,11 +48,9 @@ import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragmen
* See [TargetPlatform.Default] * See [TargetPlatform.Default]
*/ */
object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() { object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
private val compilerConfiguration = CompilerConfiguration().apply { private val languageVersionSettings = LanguageVersionSettingsImpl(
languageVersionSettings = LanguageVersionSettingsImpl( LanguageVersion.LATEST, ApiVersion.LATEST, additionalFeatures = setOf(LanguageFeature.MultiPlatformProjects)
LanguageVersion.LATEST, ApiVersion.LATEST, additionalFeatures = setOf(LanguageFeature.MultiPlatformProjects) )
)
}
private class SourceModuleInfo( private class SourceModuleInfo(
override val name: Name, override val name: Name,
@@ -135,7 +132,7 @@ object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
useImpl<ResolveSession>() useImpl<ResolveSession>()
useImpl<LazyTopDownAnalyzer>() useImpl<LazyTopDownAnalyzer>()
useImpl<FileScopeProviderImpl>() useImpl<FileScopeProviderImpl>()
configureCommon(compilerConfiguration) useInstance(languageVersionSettings)
useImpl<CompilerDeserializationConfiguration>() useImpl<CompilerDeserializationConfiguration>()
useInstance(packagePartProvider) useInstance(packagePartProvider)
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
@@ -16,9 +16,9 @@
package org.jetbrains.kotlin.frontend.di package org.jetbrains.kotlin.frontend.di
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.config.TargetPlatformVersion import org.jetbrains.kotlin.config.TargetPlatformVersion
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useImpl
@@ -73,18 +73,13 @@ fun StorageComponentContainer.configureModule(
useInstance(trace) useInstance(trace)
} }
fun StorageComponentContainer.configureCommon(configuration: CompilerConfiguration) {
useInstance(configuration)
useInstance(configuration.languageVersionSettings)
}
fun createContainerForBodyResolve( fun createContainerForBodyResolve(
moduleContext: ModuleContext, moduleContext: ModuleContext,
bindingTrace: BindingTrace, bindingTrace: BindingTrace,
platform: TargetPlatform, platform: TargetPlatform,
statementFilter: StatementFilter, statementFilter: StatementFilter,
targetPlatformVersion: TargetPlatformVersion, targetPlatformVersion: TargetPlatformVersion,
compilerConfiguration: CompilerConfiguration languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("BodyResolve", platform) { ): StorageComponentContainer = createContainer("BodyResolve", platform) {
configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace) configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
@@ -92,7 +87,7 @@ fun createContainerForBodyResolve(
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
useInstance(BodyResolveCache.ThrowException) useInstance(BodyResolveCache.ThrowException)
configureCommon(compilerConfiguration) useInstance(languageVersionSettings)
useImpl<BodyResolver>() useImpl<BodyResolver>()
} }
@@ -104,7 +99,7 @@ fun createContainerForLazyBodyResolve(
platform: TargetPlatform, platform: TargetPlatform,
bodyResolveCache: BodyResolveCache, bodyResolveCache: BodyResolveCache,
targetPlatformVersion: TargetPlatformVersion, targetPlatformVersion: TargetPlatformVersion,
compilerConfiguration: CompilerConfiguration languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("LazyBodyResolve", platform) { ): StorageComponentContainer = createContainer("LazyBodyResolve", platform) {
configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace) configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
@@ -112,7 +107,7 @@ fun createContainerForLazyBodyResolve(
useInstance(kotlinCodeAnalyzer) useInstance(kotlinCodeAnalyzer)
useInstance(kotlinCodeAnalyzer.fileScopeProvider) useInstance(kotlinCodeAnalyzer.fileScopeProvider)
useInstance(bodyResolveCache) useInstance(bodyResolveCache)
configureCommon(compilerConfiguration) useInstance(languageVersionSettings)
useImpl<LazyTopDownAnalyzer>() useImpl<LazyTopDownAnalyzer>()
useImpl<BasicAbsentDescriptorHandler>() useImpl<BasicAbsentDescriptorHandler>()
} }
@@ -123,7 +118,7 @@ fun createContainerForLazyLocalClassifierAnalyzer(
platform: TargetPlatform, platform: TargetPlatform,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
targetPlatformVersion: TargetPlatformVersion, targetPlatformVersion: TargetPlatformVersion,
compilerConfiguration: CompilerConfiguration, languageVersionSettings: LanguageVersionSettings,
statementFilter: StatementFilter, statementFilter: StatementFilter,
localClassDescriptorHolder: LocalClassDescriptorHolder localClassDescriptorHolder: LocalClassDescriptorHolder
): StorageComponentContainer = createContainer("LocalClassifierAnalyzer", platform) { ): StorageComponentContainer = createContainer("LocalClassifierAnalyzer", platform) {
@@ -143,7 +138,7 @@ fun createContainerForLazyLocalClassifierAnalyzer(
useImpl<DeclarationScopeProviderForLocalClassifierAnalyzer>() useImpl<DeclarationScopeProviderForLocalClassifierAnalyzer>()
useImpl<LocalLazyDeclarationResolver>() useImpl<LocalLazyDeclarationResolver>()
configureCommon(compilerConfiguration) useInstance(languageVersionSettings)
useInstance(statementFilter) useInstance(statementFilter)
} }
@@ -154,14 +149,13 @@ fun createContainerForLazyResolve(
platform: TargetPlatform, platform: TargetPlatform,
targetPlatformVersion: TargetPlatformVersion, targetPlatformVersion: TargetPlatformVersion,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
compilerConfiguration: CompilerConfiguration languageVersionSettings: LanguageVersionSettings
): StorageComponentContainer = createContainer("LazyResolve", platform) { ): StorageComponentContainer = createContainer("LazyResolve", platform) {
configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace) configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
useInstance(languageVersionSettings)
configureCommon(compilerConfiguration)
useImpl<FileScopeProviderImpl>() useImpl<FileScopeProviderImpl>()
useImpl<CompilerDeserializationConfiguration>() useImpl<CompilerDeserializationConfiguration>()
@@ -179,5 +173,5 @@ fun createLazyResolveSession(moduleContext: ModuleContext, files: Collection<KtF
TargetPlatform.Default, TargetPlatform.Default,
TargetPlatformVersion.NoVersion, TargetPlatformVersion.NoVersion,
CompilerEnvironment, CompilerEnvironment,
CompilerConfiguration.EMPTY LanguageVersionSettingsImpl.DEFAULT
).get<ResolveSession>() ).get<ResolveSession>()
@@ -61,8 +61,7 @@ class CallCompleter(
private val dataFlowAnalyzer: DataFlowAnalyzer, private val dataFlowAnalyzer: DataFlowAnalyzer,
private val callCheckers: Iterable<CallChecker>, private val callCheckers: Iterable<CallChecker>,
private val builtIns: KotlinBuiltIns, private val builtIns: KotlinBuiltIns,
private val languageVersionSettings: LanguageVersionSettings, private val languageVersionSettings: LanguageVersionSettings
private val compilerConfiguration: CompilerConfiguration
) { ) {
fun <D : CallableDescriptor> completeCall( fun <D : CallableDescriptor> completeCall(
context: BasicCallResolutionContext, context: BasicCallResolutionContext,
@@ -93,7 +92,7 @@ class CallCompleter(
if (calleeExpression != null && !calleeExpression.isFakeElement) calleeExpression if (calleeExpression != null && !calleeExpression.isFakeElement) calleeExpression
else resolvedCall.call.callElement else resolvedCall.call.callElement
val callCheckerContext = CallCheckerContext(context, languageVersionSettings, compilerConfiguration) val callCheckerContext = CallCheckerContext(context, languageVersionSettings)
for (callChecker in callCheckers) { for (callChecker in callCheckers) {
callChecker.check(resolvedCall, reportOn, callCheckerContext) callChecker.check(resolvedCall, reportOn, callCheckerContext)
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.resolve.calls.checkers package org.jetbrains.kotlin.resolve.calls.checkers
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
@@ -38,8 +37,7 @@ interface CallChecker {
class CallCheckerContext( class CallCheckerContext(
val resolutionContext: ResolutionContext<*>, val resolutionContext: ResolutionContext<*>,
val trace: BindingTrace, val trace: BindingTrace,
val languageVersionSettings: LanguageVersionSettings, val languageVersionSettings: LanguageVersionSettings
val compilerConfiguration: CompilerConfiguration
) { ) {
val scope: LexicalScope val scope: LexicalScope
get() = resolutionContext.scope get() = resolutionContext.scope
@@ -50,7 +48,7 @@ class CallCheckerContext(
val isAnnotationContext: Boolean val isAnnotationContext: Boolean
get() = resolutionContext.isAnnotationContext get() = resolutionContext.isAnnotationContext
constructor(c: ResolutionContext<*>, languageVersionSettings: LanguageVersionSettings, configuration: CompilerConfiguration) : this(c, c.trace, languageVersionSettings, configuration) constructor(c: ResolutionContext<*>, languageVersionSettings: LanguageVersionSettings) : this(c, c.trace, languageVersionSettings)
} }
// Use this utility to avoid premature computation of deferred return type of a resolved callable descriptor. // Use this utility to avoid premature computation of deferred return type of a resolved callable descriptor.
@@ -687,8 +687,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
trace.record(CALL, expression, call); trace.record(CALL, expression, call);
if (context.trace.wantsDiagnostics()) { if (context.trace.wantsDiagnostics()) {
CallCheckerContext callCheckerContext = CallCheckerContext callCheckerContext = new CallCheckerContext(context, components.languageVersionSettings);
new CallCheckerContext(context, components.languageVersionSettings, components.compilerConfiguration);
for (CallChecker checker : components.callCheckers) { for (CallChecker checker : components.callCheckers) {
checker.check(resolvedCall, expression, callCheckerContext); checker.check(resolvedCall, expression, callCheckerContext);
} }
@@ -996,8 +995,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
if (resolvedCall != null && trace.wantsDiagnostics()) { if (resolvedCall != null && trace.wantsDiagnostics()) {
// Call must be validated with the actual, not temporary trace in order to report operator diagnostic // Call must be validated with the actual, not temporary trace in order to report operator diagnostic
// Only unary assignment expressions (++, --) and +=/... must be checked, normal assignments have the proper trace // Only unary assignment expressions (++, --) and +=/... must be checked, normal assignments have the proper trace
CallCheckerContext callCheckerContext = CallCheckerContext callCheckerContext = new CallCheckerContext(context, trace, components.languageVersionSettings);
new CallCheckerContext(context, trace, components.languageVersionSettings, components.compilerConfiguration);
for (CallChecker checker : components.callCheckers) { for (CallChecker checker : components.callCheckers) {
checker.check(resolvedCall, expression, callCheckerContext); checker.check(resolvedCall, expression, callCheckerContext);
} }
@@ -1064,8 +1062,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
resolvedCall.markCallAsCompleted(); resolvedCall.markCallAsCompleted();
if (context.trace.wantsDiagnostics()) { if (context.trace.wantsDiagnostics()) {
CallCheckerContext callCheckerContext = CallCheckerContext callCheckerContext = new CallCheckerContext(context, components.languageVersionSettings);
new CallCheckerContext(context, components.languageVersionSettings, components.compilerConfiguration);
for (CallChecker checker : components.callCheckers) { for (CallChecker checker : components.callCheckers) {
checker.check(resolvedCall, expression, callCheckerContext); checker.check(resolvedCall, expression, callCheckerContext);
} }
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.types.expressions;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.config.LanguageVersionSettings;
import org.jetbrains.kotlin.context.GlobalContext; import org.jetbrains.kotlin.context.GlobalContext;
import org.jetbrains.kotlin.incremental.components.LookupTracker; import org.jetbrains.kotlin.incremental.components.LookupTracker;
@@ -61,7 +60,6 @@ public class ExpressionTypingComponents {
/*package*/ OverloadChecker overloadChecker; /*package*/ OverloadChecker overloadChecker;
/*package*/ LanguageVersionSettings languageVersionSettings; /*package*/ LanguageVersionSettings languageVersionSettings;
/*package*/ Iterable<RttiExpressionChecker> rttiExpressionCheckers; /*package*/ Iterable<RttiExpressionChecker> rttiExpressionCheckers;
/*package*/ CompilerConfiguration compilerConfiguration;
@Inject @Inject
public void setGlobalContext(@NotNull GlobalContext globalContext) { public void setGlobalContext(@NotNull GlobalContext globalContext) {
@@ -202,9 +200,4 @@ public class ExpressionTypingComponents {
public void setRttiExpressionCheckers(@NotNull Iterable<RttiExpressionChecker> rttiExpressionCheckers) { public void setRttiExpressionCheckers(@NotNull Iterable<RttiExpressionChecker> rttiExpressionCheckers) {
this.rttiExpressionCheckers = rttiExpressionCheckers; this.rttiExpressionCheckers = rttiExpressionCheckers;
} }
@Inject
public void setCompilerConfiguration(CompilerConfiguration compilerConfiguration) {
this.compilerConfiguration = compilerConfiguration;
}
} }
@@ -64,7 +64,7 @@ class LocalClassifierAnalyzer(
private val lookupTracker: LookupTracker, private val lookupTracker: LookupTracker,
private val supertypeLoopChecker: SupertypeLoopChecker, private val supertypeLoopChecker: SupertypeLoopChecker,
private val targetPlatformVersion: TargetPlatformVersion, private val targetPlatformVersion: TargetPlatformVersion,
private val compilerConfiguration: CompilerConfiguration, private val languageVersionSettings: LanguageVersionSettings,
private val delegationFilter: DelegationFilter private val delegationFilter: DelegationFilter
) { ) {
fun processClassOrObject( fun processClassOrObject(
@@ -82,7 +82,7 @@ class LocalClassifierAnalyzer(
platform, platform,
lookupTracker, lookupTracker,
targetPlatformVersion, targetPlatformVersion,
compilerConfiguration, languageVersionSettings,
context.statementFilter, context.statementFilter,
LocalClassDescriptorHolder( LocalClassDescriptorHolder(
scope, scope,
@@ -96,7 +96,7 @@ class LocalClassifierAnalyzer(
typeResolver, typeResolver,
annotationResolver, annotationResolver,
supertypeLoopChecker, supertypeLoopChecker,
compilerConfiguration.languageVersionSettings, languageVersionSettings,
SyntheticResolveExtension.getInstance(project), SyntheticResolveExtension.getInstance(project),
delegationFilter delegationFilter
) )
@@ -266,10 +266,6 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
@Suppress("NAME_SHADOWING") @Suppress("NAME_SHADOWING")
var files = files var files = files
val configuration = environment.configuration.copy().apply {
this.languageVersionSettings = languageVersionSettings
}
// New JavaDescriptorResolver is created for each module, which is good because it emulates different Java libraries for each module, // New JavaDescriptorResolver is created for each module, which is good because it emulates different Java libraries for each module,
// albeit with same class names // albeit with same class names
// See TopDownAnalyzerFacadeForJVM#analyzeFilesWithJavaIntegration // See TopDownAnalyzerFacadeForJVM#analyzeFilesWithJavaIntegration
@@ -282,7 +278,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
moduleContext.project, moduleContext.project,
files, files,
moduleTrace, moduleTrace,
configuration, environment.configuration.copy().apply { this.languageVersionSettings = languageVersionSettings },
{ scope -> JvmPackagePartProvider(environment, scope) } { scope -> JvmPackagePartProvider(environment, scope) }
) )
} }
@@ -318,7 +314,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
JvmPackagePartProvider(environment, moduleContentScope), JvmPackagePartProvider(environment, moduleContentScope),
moduleClassResolver, moduleClassResolver,
JvmTarget.JVM_1_6, JvmTarget.JVM_1_6,
configuration languageVersionSettings
) )
container.initJvmBuiltInsForTopDownAnalysis() container.initJvmBuiltInsForTopDownAnalysis()
moduleClassResolver.resolver = container.get<JavaDescriptorResolver>() moduleClassResolver.resolver = container.get<JavaDescriptorResolver>()
@@ -20,8 +20,8 @@ import com.intellij.openapi.editor.impl.DocumentImpl
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.container.ComponentProvider
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
@@ -64,7 +64,7 @@ abstract class AbstractDescriptorRendererTest : KotlinTestWithEnvironment() {
JvmPlatform, JvmPlatform,
JvmTarget.JVM_1_6, JvmTarget.JVM_1_6,
targetEnvironment, targetEnvironment,
CompilerConfiguration.EMPTY LanguageVersionSettingsImpl.DEFAULT
) )
val resolveSession = container.get<ResolveSession>() val resolveSession = container.get<ResolveSession>()
@@ -17,15 +17,14 @@
package org.jetbrains.kotlin.tests.di package org.jetbrains.kotlin.tests.di
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.getValue import org.jetbrains.kotlin.container.getValue
import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.frontend.di.configureCommon
import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.resolve.DescriptorResolver import org.jetbrains.kotlin.resolve.DescriptorResolver
@@ -40,7 +39,7 @@ fun createContainerForTests(project: Project, module: ModuleDescriptor): Contain
return ContainerForTests(createContainer("Tests", JvmPlatform) { return ContainerForTests(createContainer("Tests", JvmPlatform) {
configureModule(ModuleContext(module, project), JvmPlatform, JvmTarget.JVM_1_6) configureModule(ModuleContext(module, project), JvmPlatform, JvmTarget.JVM_1_6)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
configureCommon(CompilerConfiguration.EMPTY) useInstance(LanguageVersionSettingsImpl.DEFAULT)
useImpl<ExpressionTypingServices>() useImpl<ExpressionTypingServices>()
}) })
} }
@@ -19,9 +19,7 @@ package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.* import org.jetbrains.kotlin.analyzer.*
import org.jetbrains.kotlin.caches.resolve.LibraryModuleInfo import org.jetbrains.kotlin.caches.resolve.LibraryModuleInfo
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.TargetPlatformVersion import org.jetbrains.kotlin.config.TargetPlatformVersion
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.PackagePartProvider import org.jetbrains.kotlin.descriptors.PackagePartProvider
@@ -56,11 +54,7 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
project, moduleContext.storageManager, syntheticFiles, if (moduleInfo.isLibrary) GlobalSearchScope.EMPTY_SCOPE else moduleContentScope project, moduleContext.storageManager, syntheticFiles, if (moduleInfo.isLibrary) GlobalSearchScope.EMPTY_SCOPE else moduleContentScope
) )
// TODO: deduplicate this with JvmAnalyzerFacade val languageVersionSettings = LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project)
val configuration = CompilerConfiguration().apply {
languageVersionSettings = LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project)
isReadOnly = true
}
val container = createContainerForLazyResolve( val container = createContainerForLazyResolve(
moduleContext, moduleContext,
@@ -69,7 +63,7 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
JsPlatform, JsPlatform,
TargetPlatformVersion.NoVersion, TargetPlatformVersion.NoVersion,
targetEnvironment, targetEnvironment,
configuration languageVersionSettings
) )
var packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider var packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
@@ -32,8 +32,8 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.frontend.di.createContainerForLazyBodyResolve import org.jetbrains.kotlin.frontend.di.createContainerForLazyBodyResolve
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.project.createCompilerConfiguration
import org.jetbrains.kotlin.idea.project.jvmTarget import org.jetbrains.kotlin.idea.project.jvmTarget
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
import org.jetbrains.kotlin.resolve.* import org.jetbrains.kotlin.resolve.*
@@ -175,7 +175,7 @@ private object KotlinResolveDataProvider {
targetPlatform, targetPlatform,
componentProvider.get<BodyResolveCache>(), componentProvider.get<BodyResolveCache>(),
analyzableElement.jvmTarget, analyzableElement.jvmTarget,
analyzableElement.createCompilerConfiguration() analyzableElement.languageVersionSettings
).get<LazyTopDownAnalyzer>() ).get<LazyTopDownAnalyzer>()
lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement)) lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement))
@@ -148,12 +148,6 @@ private fun getExtraLanguageFeatures(
} }
} }
fun KtElement.createCompilerConfiguration(): CompilerConfiguration = CompilerConfiguration().apply {
languageVersionSettings = this@createCompilerConfiguration.languageVersionSettings
put(JVMConfigurationKeys.JVM_TARGET, jvmTarget)
isReadOnly = true
}
val KtElement.languageVersionSettings: LanguageVersionSettings val KtElement.languageVersionSettings: LanguageVersionSettings
get() { get() {
if (ServiceManager.getService(containingKtFile.project, ProjectFileIndex::class.java) == null) { if (ServiceManager.getService(containingKtFile.project, ProjectFileIndex::class.java) == null) {
@@ -589,7 +589,7 @@ class ResolveElementCache(
targetPlatform, targetPlatform,
statementFilter, statementFilter,
file.jvmTarget, file.jvmTarget,
file.createCompilerConfiguration() file.languageVersionSettings
).get<BodyResolver>() ).get<BodyResolver>()
} }
@@ -16,14 +16,13 @@
package org.jetbrains.kotlin.frontend.js.di package org.jetbrains.kotlin.frontend.js.di
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.TargetPlatformVersion import org.jetbrains.kotlin.config.TargetPlatformVersion
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.container.useImpl import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.frontend.di.configureCommon
import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureModule
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.js.resolve.JsPlatform
@@ -40,7 +39,7 @@ fun createTopDownAnalyzerForJs(
moduleContext: ModuleContext, moduleContext: ModuleContext,
bindingTrace: BindingTrace, bindingTrace: BindingTrace,
declarationProviderFactory: DeclarationProviderFactory, declarationProviderFactory: DeclarationProviderFactory,
compilerConfiguration: CompilerConfiguration languageVersionSettings: LanguageVersionSettings
): LazyTopDownAnalyzer { ): LazyTopDownAnalyzer {
val storageComponentContainer = createContainer("TopDownAnalyzerForJs", JsPlatform) { val storageComponentContainer = createContainer("TopDownAnalyzerForJs", JsPlatform) {
configureModule(moduleContext, JsPlatform, TargetPlatformVersion.NoVersion, bindingTrace) configureModule(moduleContext, JsPlatform, TargetPlatformVersion.NoVersion, bindingTrace)
@@ -51,7 +50,7 @@ fun createTopDownAnalyzerForJs(
CompilerEnvironment.configure(this) CompilerEnvironment.configure(this)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
configureCommon(compilerConfiguration) useInstance(languageVersionSettings)
useImpl<ResolveSession>() useImpl<ResolveSession>()
useImpl<LazyTopDownAnalyzer>() useImpl<LazyTopDownAnalyzer>()
}.apply { }.apply {
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.js.analyze package org.jetbrains.kotlin.js.analyze
import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.context.ContextForNewModule import org.jetbrains.kotlin.context.ContextForNewModule
import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.context.ProjectContext import org.jetbrains.kotlin.context.ProjectContext
@@ -55,7 +56,7 @@ object TopDownAnalyzerFacadeForJS {
val analyzerForJs = createTopDownAnalyzerForJs( val analyzerForJs = createTopDownAnalyzerForJs(
moduleContext, trace, moduleContext, trace,
FileBasedDeclarationProviderFactory(moduleContext.storageManager, files), FileBasedDeclarationProviderFactory(moduleContext.storageManager, files),
config.configuration config.configuration.languageVersionSettings
) )
analyzerForJs.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files) analyzerForJs.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files)
return JsAnalysisResult.success(trace, moduleContext.module) return JsAnalysisResult.success(trace, moduleContext.module)