From 7a27a9d51f2c62c69e7029ffcc0c48e083cce8d0 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Tue, 17 Jan 2017 10:52:41 +0100 Subject: [PATCH] Propagate 'CompilerConfiguration' to frontend checkers --- .../kotlin/frontend/java/di/injection.kt | 10 +++++++--- .../kotlin/resolve/jvm/JvmAnalyzerFacade.kt | 16 ++++++++++++++-- .../resolve/jvm/TopDownAnalyzerFacadeForJVM.kt | 4 ++-- .../jetbrains/kotlin/analyzer/AnalyzerFacade.kt | 11 ++++++++--- .../jetbrains/kotlin/frontend/di/injection.kt | 3 +++ .../kotlin/resolve/calls/CallCompleter.kt | 6 ++++-- .../kotlin/resolve/calls/checkers/CallChecker.kt | 6 ++++-- .../BasicExpressionTypingVisitor.java | 9 ++++++--- .../expressions/ExpressionTypingComponents.java | 7 +++++++ .../kotlin/checkers/AbstractDiagnosticsTest.kt | 3 ++- .../jetbrains/kotlin/utils/DescriptionAware.kt | 4 ++++ .../idea/caches/resolve/JsAnalyzerFacade.kt | 2 +- .../jetbrains/kotlin/idea/project/Platform.kt | 2 +- .../kotlin/config/KotlinFacetSettings.kt | 8 ++------ idea/src/META-INF/plugin.xml | 2 +- .../LanguageVersionSettingsProviderImpl.kt | 10 ++++++++-- 16 files changed, 74 insertions(+), 29 deletions(-) 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 fa0a131ee84..f094382263d 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 @@ -19,6 +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.container.* @@ -89,11 +90,13 @@ fun createContainerForLazyResolveWithJava( packagePartProvider: PackagePartProvider, languageVersionSettings: LanguageVersionSettings, useBuiltInsProvider: Boolean, - useLazyResolve: Boolean + useLazyResolve: Boolean, + compilerConfiguration: CompilerConfiguration ): StorageComponentContainer = createContainer("LazyResolveWithJava", JvmPlatform) { configureModule(moduleContext, JvmPlatform, bindingTrace) configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, lookupTracker, languageVersionSettings) + useInstance(compilerConfiguration) useInstance(packagePartProvider) useInstance(moduleClassResolver) useInstance(declarationProviderFactory) @@ -121,11 +124,12 @@ fun createContainerForTopDownAnalyzerForJvm( lookupTracker: LookupTracker, packagePartProvider: PackagePartProvider, languageVersionSettings: LanguageVersionSettings, - moduleClassResolver: ModuleClassResolver + moduleClassResolver: ModuleClassResolver, + compilerConfiguration: CompilerConfiguration ): ComponentProvider = createContainerForLazyResolveWithJava( moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, moduleClassResolver, CompilerEnvironment, lookupTracker, packagePartProvider, languageVersionSettings, - useBuiltInsProvider = true, useLazyResolve = false + useBuiltInsProvider = true, useLazyResolve = false, compilerConfiguration = compilerConfiguration ) 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 a5006897e6f..998a4c4467a 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 @@ -19,6 +19,9 @@ 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.CompilerConfiguration +import org.jetbrains.kotlin.config.JVMConfigurationKeys +import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.context.ModuleContext import org.jetbrains.kotlin.descriptors.PackagePartProvider @@ -78,7 +81,15 @@ object JvmAnalyzerFacade : AnalyzerFacade() { resolverForModule.componentProvider.get() } + 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) + } + compilerConfiguration.isReadOnly = true val container = createContainerForLazyResolveWithJava( moduleContext, trace, @@ -88,9 +99,10 @@ object JvmAnalyzerFacade : AnalyzerFacade() { targetEnvironment, LookupTracker.DO_NOTHING, packagePartProvider, - LanguageVersionSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo), + languageSettingsProvider.getLanguageVersionSettings(moduleInfo), useBuiltInsProvider = false, // TODO: load built-ins from module dependencies in IDE - useLazyResolve = true + useLazyResolve = true, + compilerConfiguration = compilerConfiguration ) StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(container, moduleInfo) } 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 81eef5da2e2..92a34108627 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 @@ -157,7 +157,7 @@ object TopDownAnalyzerFacadeForJVM { val dependenciesContainer = createContainerForTopDownAnalyzerForJvm( dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, lookupTracker, - packagePartProvider(dependencyScope), languageVersionSettings, moduleClassResolver + packagePartProvider(dependencyScope), languageVersionSettings, moduleClassResolver, configuration ) StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(dependenciesContainer, null) } @@ -182,7 +182,7 @@ object TopDownAnalyzerFacadeForJVM { IncrementalPackagePartProvider.create( packagePartProvider(sourceScope), targetIds, incrementalComponents, storageManager ), - languageVersionSettings, moduleClassResolver + languageVersionSettings, moduleClassResolver, configuration ).apply { initJvmBuiltInsForTopDownAnalysis(module, languageVersionSettings) StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(this, null) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index c97d096d9bd..33b98f99957 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.resolve.CompilerEnvironment import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.TargetPlatform +import org.jetbrains.kotlin.utils.DescriptionAware import org.jetbrains.kotlin.utils.singletonOrEmptyList import java.util.* @@ -257,14 +258,18 @@ private class DelegatingPackageFragmentProvider( } } -interface LanguageVersionSettingsProvider { +interface LanguageSettingsProvider { fun getLanguageVersionSettings(moduleInfo: ModuleInfo): LanguageVersionSettings - object Default : LanguageVersionSettingsProvider { + fun getTargetPlatform(moduleInfo: ModuleInfo): DescriptionAware + + object Default : LanguageSettingsProvider { override fun getLanguageVersionSettings(moduleInfo: ModuleInfo) = LanguageVersionSettingsImpl.DEFAULT + + override fun getTargetPlatform(moduleInfo: ModuleInfo): DescriptionAware = DescriptionAware.NoVersion } companion object { - fun getInstance(project: Project) = ServiceManager.getService(project, LanguageVersionSettingsProvider::class.java) ?: Default + fun getInstance(project: Project) = ServiceManager.getService(project, LanguageSettingsProvider::class.java) ?: Default } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt index 1085d49403a..eccd405a83c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.frontend.di +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.container.StorageComponentContainer import org.jetbrains.kotlin.container.get @@ -142,6 +143,8 @@ fun createContainerForLazyResolve( useInstance(declarationProviderFactory) useInstance(LookupTracker.DO_NOTHING) useInstance(languageVersionSettings) + //TODO: need to propagate full CompilerConfiguration to frontend + useInstance(CompilerConfiguration.EMPTY) useImpl() useImpl() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt index 85b409d1b87..b5caa1f3fd6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallCompleter.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.calls import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.getReturnTypeFromFunctionType import org.jetbrains.kotlin.builtins.isFunctionType +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.psi.* @@ -61,7 +62,8 @@ class CallCompleter( private val callCheckers: Iterable, private val builtIns: KotlinBuiltIns, private val fakeCallResolver: FakeCallResolver, - private val languageVersionSettings: LanguageVersionSettings + private val languageVersionSettings: LanguageVersionSettings, + private val compilerConfiguration: CompilerConfiguration ) { fun completeCall( context: BasicCallResolutionContext, @@ -93,7 +95,7 @@ class CallCompleter( else resolvedCall.call.callElement if (context.trace.wantsDiagnostics()) { - val callCheckerContext = CallCheckerContext(context, languageVersionSettings) + val callCheckerContext = CallCheckerContext(context, languageVersionSettings, compilerConfiguration) for (callChecker in callCheckers) { callChecker.check(resolvedCall, reportOn, callCheckerContext) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt index f36865c5145..31005143031 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/checkers/CallChecker.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.calls.checkers import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext @@ -37,7 +38,8 @@ interface CallChecker { class CallCheckerContext( val resolutionContext: ResolutionContext<*>, val trace: BindingTrace, - val languageVersionSettings: LanguageVersionSettings + val languageVersionSettings: LanguageVersionSettings, + val compilerConfiguration: CompilerConfiguration ) { val scope: LexicalScope get() = resolutionContext.scope @@ -48,7 +50,7 @@ class CallCheckerContext( val isAnnotationContext: Boolean get() = resolutionContext.isAnnotationContext - constructor(c: ResolutionContext<*>, languageVersionSettings: LanguageVersionSettings) : this(c, c.trace, languageVersionSettings) + constructor(c: ResolutionContext<*>, languageVersionSettings: LanguageVersionSettings, configuration: CompilerConfiguration) : this(c, c.trace, languageVersionSettings, configuration) } // Use this utility to avoid premature computation of deferred return type of a resolved callable descriptor. diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java index 67b295fa6d2..dd59a0c43a8 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/BasicExpressionTypingVisitor.java @@ -672,7 +672,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { trace.record(CALL, expression, call); if (context.trace.wantsDiagnostics()) { - CallCheckerContext callCheckerContext = new CallCheckerContext(context, components.languageVersionSettings); + CallCheckerContext callCheckerContext = + new CallCheckerContext(context, components.languageVersionSettings, components.compilerConfiguration); for (CallChecker checker : components.callCheckers) { checker.check(resolvedCall, expression, callCheckerContext); } @@ -977,7 +978,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { if (resolvedCall != null && trace.wantsDiagnostics()) { // 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 - CallCheckerContext callCheckerContext = new CallCheckerContext(context, trace, components.languageVersionSettings); + CallCheckerContext callCheckerContext = + new CallCheckerContext(context, trace, components.languageVersionSettings, components.compilerConfiguration); for (CallChecker checker : components.callCheckers) { checker.check(resolvedCall, expression, callCheckerContext); } @@ -1044,7 +1046,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { resolvedCall.markCallAsCompleted(); if (context.trace.wantsDiagnostics()) { - CallCheckerContext callCheckerContext = new CallCheckerContext(context, components.languageVersionSettings); + CallCheckerContext callCheckerContext = + new CallCheckerContext(context, components.languageVersionSettings, components.compilerConfiguration); for (CallChecker checker : components.callCheckers) { checker.check(resolvedCall, expression, callCheckerContext); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java index 5e64c3f5289..d253611c231 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingComponents.java @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.types.expressions; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; +import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.LanguageVersionSettings; import org.jetbrains.kotlin.context.GlobalContext; import org.jetbrains.kotlin.incremental.components.LookupTracker; @@ -60,6 +61,7 @@ public class ExpressionTypingComponents { /*package*/ OverloadChecker overloadChecker; /*package*/ LanguageVersionSettings languageVersionSettings; /*package*/ Iterable rttiExpressionCheckers; + /*package*/ CompilerConfiguration compilerConfiguration; @Inject public void setGlobalContext(@NotNull GlobalContext globalContext) { @@ -200,4 +202,9 @@ public class ExpressionTypingComponents { public void setRttiExpressionCheckers(@NotNull Iterable rttiExpressionCheckers) { this.rttiExpressionCheckers = rttiExpressionCheckers; } + + @Inject + public void setCompilerConfiguration(CompilerConfiguration compilerConfiguration) { + this.compilerConfiguration = compilerConfiguration; + } } diff --git a/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt b/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt index 328bc16bc7d..90a983c9429 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/checkers/AbstractDiagnosticsTest.kt @@ -319,7 +319,8 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() { LookupTracker.DO_NOTHING, JvmPackagePartProvider(environment, moduleContentScope), languageVersionSettings, - moduleClassResolver + moduleClassResolver, + configuration ) container.initJvmBuiltInsForTopDownAnalysis(moduleDescriptor, languageVersionSettings) moduleClassResolver.resolver = container.get() diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/DescriptionAware.kt b/compiler/util/src/org/jetbrains/kotlin/utils/DescriptionAware.kt index b444c9cba54..d5338b60207 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/DescriptionAware.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/DescriptionAware.kt @@ -18,4 +18,8 @@ package org.jetbrains.kotlin.utils; interface DescriptionAware { val description: String + + object NoVersion : DescriptionAware { + override val description = "" + } } \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt index 800371ea652..b26fc63243e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/JsAnalyzerFacade.kt @@ -61,7 +61,7 @@ object JsAnalyzerFacade : AnalyzerFacade() { BindingTraceContext(), JsPlatform, targetEnvironment, - LanguageVersionSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo) + LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo) ) var packageFragmentProvider = container.get().packageFragmentProvider diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt index cba20f055d8..b1e228c56d1 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/Platform.kt @@ -79,7 +79,7 @@ val Module.languageVersionSettings: LanguageVersionSettings return LanguageVersionSettingsImpl(languageVersion, ApiVersion.createByLanguageVersion(apiVersion), extraLanguageFeatures) } -private val Module.targetPlatform: TargetPlatformKind<*>? +val Module.targetPlatform: TargetPlatformKind<*>? get() = KotlinFacetSettingsProvider.getInstance(project).getSettings(this).versionInfo.targetPlatformKind private val Module.implementsCommonModule: Boolean diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt index d7e9152c3da..60e7ad01be2 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/KotlinFacetSettings.kt @@ -39,9 +39,9 @@ sealed class TargetPlatformKind( } } - object JavaScript : TargetPlatformKind(NoVersion, "JavaScript") + object JavaScript : TargetPlatformKind(DescriptionAware.NoVersion, "JavaScript") - object Common : TargetPlatformKind(NoVersion, "Common (experimental)") + object Common : TargetPlatformKind(DescriptionAware.NoVersion, "Common (experimental)") companion object { @@ -49,10 +49,6 @@ sealed class TargetPlatformKind( } } -object NoVersion : DescriptionAware { - override val description = "" -} - data class KotlinVersionInfo( var languageLevel: LanguageVersion? = null, var apiLevel: LanguageVersion? = null, diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index b968e4483ba..6a1ffc2377c 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -305,7 +305,7 @@ -