Inject JvmTarget into some JVM-specific call checkers

This makes it possible to drop CompilerConfiguration from
CallCheckerContext, which in turn helps to avoid passing the entire
CompilerConfiguration instance through front-end
This commit is contained in:
Alexander Udalov
2017-03-01 19:11:02 +03:00
parent 573c6ab5d4
commit f5d4dd33da
17 changed files with 71 additions and 53 deletions
@@ -20,6 +20,7 @@ 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.CompilerConfiguration
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
import org.jetbrains.kotlin.container.* import org.jetbrains.kotlin.container.*
@@ -87,11 +88,12 @@ fun createContainerForLazyResolveWithJava(
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
jvmTarget: JvmTarget,
compilerConfiguration: CompilerConfiguration, compilerConfiguration: CompilerConfiguration,
useBuiltInsProvider: Boolean, useBuiltInsProvider: Boolean,
useLazyResolve: Boolean useLazyResolve: Boolean
): StorageComponentContainer = createContainer("LazyResolveWithJava", JvmPlatform) { ): StorageComponentContainer = createContainer("LazyResolveWithJava", JvmPlatform) {
configureModule(moduleContext, JvmPlatform, bindingTrace) configureModule(moduleContext, JvmPlatform, jvmTarget, bindingTrace)
configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, lookupTracker) configureJavaTopDownAnalysis(moduleContentScope, moduleContext.project, lookupTracker)
useInstance(packagePartProvider) useInstance(packagePartProvider)
@@ -123,10 +125,11 @@ fun createContainerForTopDownAnalyzerForJvm(
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
packagePartProvider: PackagePartProvider, packagePartProvider: PackagePartProvider,
moduleClassResolver: ModuleClassResolver, moduleClassResolver: ModuleClassResolver,
jvmTarget: JvmTarget,
compilerConfiguration: CompilerConfiguration compilerConfiguration: CompilerConfiguration
): ComponentProvider = createContainerForLazyResolveWithJava( ): ComponentProvider = createContainerForLazyResolveWithJava(
moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, moduleClassResolver, moduleContext, bindingTrace, declarationProviderFactory, moduleContentScope, moduleClassResolver,
CompilerEnvironment, lookupTracker, packagePartProvider, compilerConfiguration, CompilerEnvironment, lookupTracker, packagePartProvider, jvmTarget, compilerConfiguration,
useBuiltInsProvider = true, useLazyResolve = false useBuiltInsProvider = true, useLazyResolve = false
) )
@@ -82,15 +82,12 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
resolverForModule.componentProvider.get<JavaDescriptorResolver>() resolverForModule.componentProvider.get<JavaDescriptorResolver>()
} }
val languageSettingsProvider = LanguageSettingsProvider.getInstance(project)
val jvmTarget = languageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget ?: JvmTarget.JVM_1_6
val configuration = CompilerConfiguration().apply { val configuration = CompilerConfiguration().apply {
val languageSettingsProvider = LanguageSettingsProvider.getInstance(project)
languageVersionSettings = languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project) languageVersionSettings = languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
put(JVMConfigurationKeys.JVM_TARGET, jvmTarget)
val platform = languageSettingsProvider.getTargetPlatform(moduleInfo)
if (platform is JvmTarget) {
put(JVMConfigurationKeys.JVM_TARGET, platform)
}
isReadOnly = true isReadOnly = true
} }
@@ -105,6 +102,7 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
targetEnvironment, targetEnvironment,
LookupTracker.DO_NOTHING, LookupTracker.DO_NOTHING,
packagePartProvider, packagePartProvider,
jvmTarget,
configuration, configuration,
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
@@ -23,10 +23,7 @@ import com.intellij.psi.search.DelegatingGlobalSearchScope
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.builtins.JvmBuiltInsPackageFragmentProvider import org.jetbrains.kotlin.builtins.JvmBuiltInsPackageFragmentProvider
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.languageVersionSettings
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.context.ContextForNewModule import org.jetbrains.kotlin.context.ContextForNewModule
@@ -135,6 +132,8 @@ object TopDownAnalyzerFacadeForJVM {
val sourceScope = if (separateModules) sourceModuleSearchScope else GlobalSearchScope.allScope(project) val sourceScope = if (separateModules) sourceModuleSearchScope else GlobalSearchScope.allScope(project)
val moduleClassResolver = SourceOrBinaryModuleClassResolver(sourceScope) val moduleClassResolver = SourceOrBinaryModuleClassResolver(sourceScope)
val jvmTarget = configuration.get(JVMConfigurationKeys.JVM_TARGET) ?: JvmTarget.JVM_1_6
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)
@@ -154,7 +153,7 @@ object TopDownAnalyzerFacadeForJVM {
val dependenciesContainer = createContainerForTopDownAnalyzerForJvm( val dependenciesContainer = createContainerForTopDownAnalyzerForJvm(
dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, lookupTracker, dependenciesContext, trace, DeclarationProviderFactory.EMPTY, dependencyScope, lookupTracker,
packagePartProvider(dependencyScope), moduleClassResolver, configuration packagePartProvider(dependencyScope), moduleClassResolver, jvmTarget, configuration
) )
StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(dependenciesContainer, null) } StorageComponentContainerContributor.getInstances(project).forEach { it.onContainerComposed(dependenciesContainer, null) }
@@ -181,7 +180,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, configuration partProvider, moduleClassResolver, jvmTarget, configuration
).apply { ).apply {
initJvmBuiltInsForTopDownAnalysis() initJvmBuiltInsForTopDownAnalysis()
(partProvider as? IncrementalPackagePartProvider)?.deserializationConfiguration = get<DeserializationConfiguration>() (partProvider as? IncrementalPackagePartProvider)?.deserializationConfiguration = get<DeserializationConfiguration>()
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.resolve.jvm.checkers package org.jetbrains.kotlin.resolve.jvm.checkers
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.ClassOrPackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.ClassOrPackageFragmentDescriptor
@@ -34,8 +33,7 @@ import org.jetbrains.kotlin.resolve.inline.InlineUtil
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
class InlinePlatformCompatibilityChecker: CallChecker { class InlinePlatformCompatibilityChecker(val jvmTarget: JvmTarget) : CallChecker {
private val doCheck = doCheck() private val doCheck = doCheck()
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
@@ -61,15 +59,17 @@ class InlinePlatformCompatibilityChecker: CallChecker {
val propertyOrFun = DescriptorUtils.getDirectMember(resultingDescriptor) val propertyOrFun = DescriptorUtils.getDirectMember(resultingDescriptor)
val inliningBytecodeVersion = getBytecodeVersionIfDeserializedDescriptor(propertyOrFun) ?: return val inliningBytecodeVersion = getBytecodeVersionIfDeserializedDescriptor(propertyOrFun) ?: return
val compilingTarget = context.compilerConfiguration[JVMConfigurationKeys.JVM_TARGET] ?: JvmTarget.DEFAULT val compilingBytecodeVersion = jvmTarget.bytecodeVersion
val compilingBytecodeVersion = compilingTarget.bytecodeVersion
if (compilingBytecodeVersion < inliningBytecodeVersion) { if (compilingBytecodeVersion < inliningBytecodeVersion) {
context.trace.report(ErrorsJvm.INLINE_FROM_HIGHER_PLATFORM.on(reportOn, JvmTarget.getDescription(inliningBytecodeVersion), JvmTarget.getDescription(compilingBytecodeVersion))) context.trace.report(ErrorsJvm.INLINE_FROM_HIGHER_PLATFORM.on(
reportOn,
JvmTarget.getDescription(inliningBytecodeVersion),
JvmTarget.getDescription(compilingBytecodeVersion)
))
} }
} }
companion object { companion object {
fun doCheck() = "true" != System.getProperty("kotlin.skip.bytecode.version.check") fun doCheck() = "true" != System.getProperty("kotlin.skip.bytecode.version.check")
fun getBytecodeVersionIfDeserializedDescriptor(funOrProperty: DeclarationDescriptor): Int? { fun getBytecodeVersionIfDeserializedDescriptor(funOrProperty: DeclarationDescriptor): Int? {
@@ -89,4 +89,3 @@ class InlinePlatformCompatibilityChecker: CallChecker {
} }
} }
} }
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.resolve.jvm.checkers package org.jetbrains.kotlin.resolve.jvm.checkers
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
@@ -31,10 +30,10 @@ import org.jetbrains.kotlin.resolve.calls.checkers.CallCheckerContext
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm
class InterfaceDefaultMethodCallChecker : CallChecker { class InterfaceDefaultMethodCallChecker(val jvmTarget: JvmTarget) : CallChecker {
override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) {
val supportDefaults = context.compilerConfiguration.get(JVMConfigurationKeys.JVM_TARGET) == JvmTarget.JVM_1_8 val supportDefaults = jvmTarget == JvmTarget.JVM_1_8
val descriptor = resolvedCall.resultingDescriptor as? FunctionDescriptor ?: return val descriptor = resolvedCall.resultingDescriptor as? FunctionDescriptor ?: return
@@ -21,10 +21,8 @@ import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.resolve.PlatformConfigurator import org.jetbrains.kotlin.resolve.PlatformConfigurator
import org.jetbrains.kotlin.resolve.calls.checkers.InlineCheckerWrapper
import org.jetbrains.kotlin.resolve.calls.checkers.ReifiedTypeParameterSubstitutionChecker import org.jetbrains.kotlin.resolve.calls.checkers.ReifiedTypeParameterSubstitutionChecker
import org.jetbrains.kotlin.resolve.checkers.HeaderImplDeclarationChecker import org.jetbrains.kotlin.resolve.checkers.HeaderImplDeclarationChecker
import org.jetbrains.kotlin.resolve.checkers.MissingDependencyClassChecker
import org.jetbrains.kotlin.resolve.jvm.* import org.jetbrains.kotlin.resolve.jvm.*
import org.jetbrains.kotlin.resolve.jvm.checkers.* import org.jetbrains.kotlin.resolve.jvm.checkers.*
import org.jetbrains.kotlin.synthetic.JavaSyntheticConstructorsProvider import org.jetbrains.kotlin.synthetic.JavaSyntheticConstructorsProvider
@@ -50,14 +48,12 @@ object JvmPlatformConfigurator : PlatformConfigurator(
additionalCallCheckers = listOf( additionalCallCheckers = listOf(
JavaAnnotationCallChecker(), JavaAnnotationCallChecker(),
InterfaceDefaultMethodCallChecker(),
JavaClassOnCompanionChecker(), JavaClassOnCompanionChecker(),
ProtectedInSuperClassCompanionCallChecker(), ProtectedInSuperClassCompanionCallChecker(),
UnsupportedSyntheticCallableReferenceChecker(), UnsupportedSyntheticCallableReferenceChecker(),
SuperCallWithDefaultArgumentsChecker(), SuperCallWithDefaultArgumentsChecker(),
ProtectedSyntheticExtensionCallChecker, ProtectedSyntheticExtensionCallChecker,
ReifiedTypeParameterSubstitutionChecker(), ReifiedTypeParameterSubstitutionChecker()
InlinePlatformCompatibilityChecker()
), ),
additionalTypeCheckers = listOf( additionalTypeCheckers = listOf(
@@ -88,6 +84,8 @@ object JvmPlatformConfigurator : PlatformConfigurator(
override fun configureModuleComponents(container: StorageComponentContainer) { override fun configureModuleComponents(container: StorageComponentContainer) {
container.useImpl<JvmReflectionAPICallChecker>() container.useImpl<JvmReflectionAPICallChecker>()
container.useImpl<JavaSyntheticScopes>() container.useImpl<JavaSyntheticScopes>()
container.useImpl<InterfaceDefaultMethodCallChecker>()
container.useImpl<InlinePlatformCompatibilityChecker>()
container.useInstance(JavaSyntheticConstructorsProvider) container.useInstance(JavaSyntheticConstructorsProvider)
container.useInstance(JvmTypeSpecificityComparator) container.useInstance(JvmTypeSpecificityComparator)
} }
@@ -51,7 +51,7 @@ import org.jetbrains.kotlin.serialization.deserialization.MetadataPackageFragmen
object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() { object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
private val compilerConfiguration = CompilerConfiguration().apply { private val compilerConfiguration = CompilerConfiguration().apply {
languageVersionSettings = LanguageVersionSettingsImpl( languageVersionSettings = LanguageVersionSettingsImpl(
LanguageVersion.LATEST, ApiVersion.LATEST, setOf(LanguageFeature.MultiPlatformProjects) LanguageVersion.LATEST, ApiVersion.LATEST, additionalFeatures = setOf(LanguageFeature.MultiPlatformProjects)
) )
} }
@@ -128,7 +128,7 @@ object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
packagePartProvider: PackagePartProvider packagePartProvider: PackagePartProvider
): StorageComponentContainer = createContainer("ResolveCommonCode", targetPlatform) { ): StorageComponentContainer = createContainer("ResolveCommonCode", targetPlatform) {
configureModule(moduleContext, targetPlatform, bindingTrace) configureModule(moduleContext, targetPlatform, TargetPlatformVersion.NoVersion, bindingTrace)
useInstance(moduleContentScope) useInstance(moduleContentScope)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.frontend.di package org.jetbrains.kotlin.frontend.di
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.TargetPlatformVersion
import org.jetbrains.kotlin.config.languageVersionSettings 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
@@ -36,7 +37,9 @@ import org.jetbrains.kotlin.types.expressions.LocalClassDescriptorHolder
import org.jetbrains.kotlin.types.expressions.LocalLazyDeclarationResolver import org.jetbrains.kotlin.types.expressions.LocalLazyDeclarationResolver
fun StorageComponentContainer.configureModule( fun StorageComponentContainer.configureModule(
moduleContext: ModuleContext, platform: TargetPlatform moduleContext: ModuleContext,
platform: TargetPlatform,
platformVersion: TargetPlatformVersion
) { ) {
useInstance(moduleContext) useInstance(moduleContext)
useInstance(moduleContext.module) useInstance(moduleContext.module)
@@ -45,6 +48,7 @@ fun StorageComponentContainer.configureModule(
useInstance(moduleContext.module.builtIns) useInstance(moduleContext.module.builtIns)
useInstance(platform) useInstance(platform)
useInstance(platformVersion)
platform.platformConfigurator.configureModuleComponents(this) platform.platformConfigurator.configureModuleComponents(this)
@@ -60,9 +64,12 @@ private fun StorageComponentContainer.configurePlatformIndependentComponents() {
} }
fun StorageComponentContainer.configureModule( fun StorageComponentContainer.configureModule(
moduleContext: ModuleContext, platform: TargetPlatform, trace: BindingTrace moduleContext: ModuleContext,
platform: TargetPlatform,
platformVersion: TargetPlatformVersion,
trace: BindingTrace
) { ) {
configureModule(moduleContext, platform) configureModule(moduleContext, platform, platformVersion)
useInstance(trace) useInstance(trace)
} }
@@ -76,9 +83,10 @@ fun createContainerForBodyResolve(
bindingTrace: BindingTrace, bindingTrace: BindingTrace,
platform: TargetPlatform, platform: TargetPlatform,
statementFilter: StatementFilter, statementFilter: StatementFilter,
targetPlatformVersion: TargetPlatformVersion,
compilerConfiguration: CompilerConfiguration compilerConfiguration: CompilerConfiguration
): StorageComponentContainer = createContainer("BodyResolve", platform) { ): StorageComponentContainer = createContainer("BodyResolve", platform) {
configureModule(moduleContext, platform, bindingTrace) configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
useInstance(statementFilter) useInstance(statementFilter)
@@ -95,9 +103,10 @@ fun createContainerForLazyBodyResolve(
bindingTrace: BindingTrace, bindingTrace: BindingTrace,
platform: TargetPlatform, platform: TargetPlatform,
bodyResolveCache: BodyResolveCache, bodyResolveCache: BodyResolveCache,
targetPlatformVersion: TargetPlatformVersion,
compilerConfiguration: CompilerConfiguration compilerConfiguration: CompilerConfiguration
): StorageComponentContainer = createContainer("LazyBodyResolve", platform) { ): StorageComponentContainer = createContainer("LazyBodyResolve", platform) {
configureModule(moduleContext, platform, bindingTrace) configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
useInstance(kotlinCodeAnalyzer) useInstance(kotlinCodeAnalyzer)
@@ -113,11 +122,12 @@ fun createContainerForLazyLocalClassifierAnalyzer(
bindingTrace: BindingTrace, bindingTrace: BindingTrace,
platform: TargetPlatform, platform: TargetPlatform,
lookupTracker: LookupTracker, lookupTracker: LookupTracker,
targetPlatformVersion: TargetPlatformVersion,
compilerConfiguration: CompilerConfiguration, compilerConfiguration: CompilerConfiguration,
statementFilter: StatementFilter, statementFilter: StatementFilter,
localClassDescriptorHolder: LocalClassDescriptorHolder localClassDescriptorHolder: LocalClassDescriptorHolder
): StorageComponentContainer = createContainer("LocalClassifierAnalyzer", platform) { ): StorageComponentContainer = createContainer("LocalClassifierAnalyzer", platform) {
configureModule(moduleContext, platform, bindingTrace) configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
useInstance(localClassDescriptorHolder) useInstance(localClassDescriptorHolder)
useInstance(lookupTracker) useInstance(lookupTracker)
@@ -142,10 +152,11 @@ fun createContainerForLazyResolve(
declarationProviderFactory: DeclarationProviderFactory, declarationProviderFactory: DeclarationProviderFactory,
bindingTrace: BindingTrace, bindingTrace: BindingTrace,
platform: TargetPlatform, platform: TargetPlatform,
targetPlatformVersion: TargetPlatformVersion,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
compilerConfiguration: CompilerConfiguration compilerConfiguration: CompilerConfiguration
): StorageComponentContainer = createContainer("LazyResolve", platform) { ): StorageComponentContainer = createContainer("LazyResolve", platform) {
configureModule(moduleContext, platform, bindingTrace) configureModule(moduleContext, platform, targetPlatformVersion, bindingTrace)
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
@@ -166,6 +177,7 @@ fun createLazyResolveSession(moduleContext: ModuleContext, files: Collection<KtF
FileBasedDeclarationProviderFactory(moduleContext.storageManager, files), FileBasedDeclarationProviderFactory(moduleContext.storageManager, files),
BindingTraceContext(), BindingTraceContext(),
TargetPlatform.Default, TargetPlatform.Default,
TargetPlatformVersion.NoVersion,
CompilerEnvironment, CompilerEnvironment,
CompilerConfiguration.EMPTY CompilerConfiguration.EMPTY
).get<ResolveSession>() ).get<ResolveSession>()
@@ -20,6 +20,7 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.TargetPlatformVersion
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.GlobalContext import org.jetbrains.kotlin.context.GlobalContext
@@ -62,6 +63,7 @@ class LocalClassifierAnalyzer(
private val platform: TargetPlatform, private val platform: TargetPlatform,
private val lookupTracker: LookupTracker, private val lookupTracker: LookupTracker,
private val supertypeLoopChecker: SupertypeLoopChecker, private val supertypeLoopChecker: SupertypeLoopChecker,
private val targetPlatformVersion: TargetPlatformVersion,
private val compilerConfiguration: CompilerConfiguration, private val compilerConfiguration: CompilerConfiguration,
private val delegationFilter: DelegationFilter private val delegationFilter: DelegationFilter
) { ) {
@@ -79,6 +81,7 @@ class LocalClassifierAnalyzer(
context.trace, context.trace,
platform, platform,
lookupTracker, lookupTracker,
targetPlatformVersion,
compilerConfiguration, compilerConfiguration,
context.statementFilter, context.statementFilter,
LocalClassDescriptorHolder( LocalClassDescriptorHolder(
@@ -160,10 +163,9 @@ class LocalClassDescriptorHolder(
override val languageVersionSettings = this@LocalClassDescriptorHolder.languageVersionSettings override val languageVersionSettings = this@LocalClassDescriptorHolder.languageVersionSettings
override val syntheticResolveExtension = this@LocalClassDescriptorHolder.syntheticResolveExtension override val syntheticResolveExtension = this@LocalClassDescriptorHolder.syntheticResolveExtension
override val delegationFilter: DelegationFilter = this@LocalClassDescriptorHolder.delegationFilter override val delegationFilter: DelegationFilter = this@LocalClassDescriptorHolder.delegationFilter
} },
,
containingDeclaration, containingDeclaration,
classOrObject.getNameAsSafeName(), classOrObject.nameAsSafeName,
KtClassInfoUtil.createClassLikeInfo(classOrObject), KtClassInfoUtil.createClassLikeInfo(classOrObject),
classOrObject.hasModifier(KtTokens.EXTERNAL_KEYWORD) classOrObject.hasModifier(KtTokens.EXTERNAL_KEYWORD)
) )
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.analyzer.common.DefaultAnalyzerFacade import org.jetbrains.kotlin.analyzer.common.DefaultAnalyzerFacade
import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport import org.jetbrains.kotlin.cli.jvm.compiler.CliLightClassGenerationSupport
import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider import org.jetbrains.kotlin.cli.jvm.compiler.JvmPackagePartProvider
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
@@ -316,6 +317,7 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
LookupTracker.DO_NOTHING, LookupTracker.DO_NOTHING,
JvmPackagePartProvider(environment, moduleContentScope), JvmPackagePartProvider(environment, moduleContentScope),
moduleClassResolver, moduleClassResolver,
JvmTarget.JVM_1_6,
configuration configuration
) )
container.initJvmBuiltInsForTopDownAnalysis() container.initJvmBuiltInsForTopDownAnalysis()
@@ -21,6 +21,7 @@ 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.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmTarget
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
@@ -61,6 +62,7 @@ abstract class AbstractDescriptorRendererTest : KotlinTestWithEnvironment() {
FileBasedDeclarationProviderFactory(context.storageManager, listOf(psiFile)), FileBasedDeclarationProviderFactory(context.storageManager, listOf(psiFile)),
CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(), CliLightClassGenerationSupport.NoScopeRecordCliBindingTrace(),
JvmPlatform, JvmPlatform,
JvmTarget.JVM_1_6,
targetEnvironment, targetEnvironment,
CompilerConfiguration.EMPTY CompilerConfiguration.EMPTY
) )
@@ -18,6 +18,7 @@ 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.CompilerConfiguration
import org.jetbrains.kotlin.config.JvmTarget
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
@@ -37,7 +38,7 @@ import org.jetbrains.kotlin.types.expressions.FakeCallResolver
fun createContainerForTests(project: Project, module: ModuleDescriptor): ContainerForTests { fun createContainerForTests(project: Project, module: ModuleDescriptor): ContainerForTests {
return ContainerForTests(createContainer("Tests", JvmPlatform) { return ContainerForTests(createContainer("Tests", JvmPlatform) {
configureModule(ModuleContext(module, project), JvmPlatform) configureModule(ModuleContext(module, project), JvmPlatform, JvmTarget.JVM_1_6)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
configureCommon(CompilerConfiguration.EMPTY) configureCommon(CompilerConfiguration.EMPTY)
useImpl<ExpressionTypingServices>() useImpl<ExpressionTypingServices>()
@@ -20,6 +20,7 @@ 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.CompilerConfiguration
import org.jetbrains.kotlin.config.TargetPlatformVersion
import org.jetbrains.kotlin.config.languageVersionSettings 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
@@ -66,6 +67,7 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
declarationProviderFactory, declarationProviderFactory,
BindingTraceContext(), BindingTraceContext(),
JsPlatform, JsPlatform,
TargetPlatformVersion.NoVersion,
targetEnvironment, targetEnvironment,
configuration configuration
) )
@@ -33,6 +33,7 @@ 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.createCompilerConfiguration
import org.jetbrains.kotlin.idea.project.jvmTarget
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.*
@@ -173,6 +174,7 @@ private object KotlinResolveDataProvider {
trace, trace,
targetPlatform, targetPlatform,
componentProvider.get<BodyResolveCache>(), componentProvider.get<BodyResolveCache>(),
analyzableElement.jvmTarget,
analyzableElement.createCompilerConfiguration() analyzableElement.createCompilerConfiguration()
).get<LazyTopDownAnalyzer>() ).get<LazyTopDownAnalyzer>()
@@ -144,13 +144,7 @@ private fun getExtraLanguageFeatures(
fun KtElement.createCompilerConfiguration(): CompilerConfiguration = CompilerConfiguration().apply { fun KtElement.createCompilerConfiguration(): CompilerConfiguration = CompilerConfiguration().apply {
languageVersionSettings = this@createCompilerConfiguration.languageVersionSettings languageVersionSettings = this@createCompilerConfiguration.languageVersionSettings
put(JVMConfigurationKeys.JVM_TARGET, jvmTarget)
val module = ModuleUtilCore.findModuleForPsiElement(this@createCompilerConfiguration)
val platform = module?.targetPlatform?.version
if (platform is JvmTarget) {
put(JVMConfigurationKeys.JVM_TARGET, platform)
}
isReadOnly = true isReadOnly = true
} }
@@ -161,3 +155,6 @@ val KtElement.languageVersionSettings: LanguageVersionSettings
} }
return ModuleUtilCore.findModuleForPsiElement(this)?.languageVersionSettings ?: LanguageVersionSettingsImpl.DEFAULT return ModuleUtilCore.findModuleForPsiElement(this)?.languageVersionSettings ?: LanguageVersionSettingsImpl.DEFAULT
} }
val KtElement.jvmTarget: JvmTarget
get() = ModuleUtilCore.findModuleForPsiElement(this)?.targetPlatform?.version as? JvmTarget ?: JvmTarget.DEFAULT
@@ -588,6 +588,7 @@ class ResolveElementCache(
trace, trace,
targetPlatform, targetPlatform,
statementFilter, statementFilter,
file.jvmTarget,
file.createCompilerConfiguration() file.createCompilerConfiguration()
).get<BodyResolver>() ).get<BodyResolver>()
} }
@@ -17,6 +17,7 @@
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.CompilerConfiguration
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
@@ -42,7 +43,7 @@ fun createTopDownAnalyzerForJs(
compilerConfiguration: CompilerConfiguration compilerConfiguration: CompilerConfiguration
): LazyTopDownAnalyzer { ): LazyTopDownAnalyzer {
val storageComponentContainer = createContainer("TopDownAnalyzerForJs", JsPlatform) { val storageComponentContainer = createContainer("TopDownAnalyzerForJs", JsPlatform) {
configureModule(moduleContext, JsPlatform, bindingTrace) configureModule(moduleContext, JsPlatform, TargetPlatformVersion.NoVersion, bindingTrace)
useInstance(declarationProviderFactory) useInstance(declarationProviderFactory)
useImpl<FileScopeProviderImpl>() useImpl<FileScopeProviderImpl>()