Pass LanguageSettingsProvider to AnalyzerFacade explicitly

This way is more flexible for example for tests, where configuring the
service implementation may be tricky (it's usually done in
KotlinCoreEnvironment in production code)
This commit is contained in:
Alexander Udalov
2017-04-21 22:02:50 +03:00
parent ca06d38c5b
commit 4e77897bfd
10 changed files with 27 additions and 24 deletions
@@ -52,6 +52,7 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
platformParameters: JvmPlatformParameters, platformParameters: JvmPlatformParameters,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider packagePartProvider: PackagePartProvider
): ResolverForModule { ): ResolverForModule {
val (syntheticFiles, moduleContentScope) = moduleContent val (syntheticFiles, moduleContentScope) = moduleContent
@@ -80,7 +81,6 @@ 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 jvmTarget = languageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget ?: JvmTarget.JVM_1_6
val languageVersionSettings = languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project) val languageVersionSettings = languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
@@ -164,6 +164,7 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
analyzerFacade: (M) -> AnalyzerFacade<P>, analyzerFacade: (M) -> AnalyzerFacade<P>,
modulesContent: (M) -> ModuleContent, modulesContent: (M) -> ModuleContent,
platformParameters: P, platformParameters: P,
languageSettingsProvider: LanguageSettingsProvider = LanguageSettingsProvider.Default,
targetEnvironment: TargetEnvironment = CompilerEnvironment, targetEnvironment: TargetEnvironment = CompilerEnvironment,
builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance, builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance,
delegateResolver: ResolverForProject<M> = EmptyResolverForProject(), delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
@@ -220,7 +221,7 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
analyzerFacade(module).createResolverForModule( analyzerFacade(module).createResolverForModule(
module, descriptor, projectContext.withModule(descriptor), modulesContent(module), module, descriptor, projectContext.withModule(descriptor), modulesContent(module),
platformParameters, targetEnvironment, resolverForProject, platformParameters, targetEnvironment, resolverForProject, languageSettingsProvider,
packagePartProviderFactory(module, content) packagePartProviderFactory(module, content)
) )
} }
@@ -243,6 +244,7 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
platformParameters: P, platformParameters: P,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider packagePartProvider: PackagePartProvider
): ResolverForModule ): ResolverForModule
@@ -301,10 +303,6 @@ interface LanguageSettingsProvider {
override fun getTargetPlatform(moduleInfo: ModuleInfo): TargetPlatformVersion = TargetPlatformVersion.NoVersion override fun getTargetPlatform(moduleInfo: ModuleInfo): TargetPlatformVersion = TargetPlatformVersion.NoVersion
} }
companion object {
fun getInstance(project: Project) = ServiceManager.getService(project, LanguageSettingsProvider::class.java) ?: Default
}
} }
interface ResolverForModuleComputationTracker { interface ResolverForModuleComputationTracker {
@@ -314,4 +312,4 @@ interface ResolverForModuleComputationTracker {
companion object { companion object {
fun getInstance(project: Project): ResolverForModuleComputationTracker? = ServiceManager.getService(project, ResolverForModuleComputationTracker::class.java) ?: null fun getInstance(project: Project): ResolverForModuleComputationTracker? = ServiceManager.getService(project, ResolverForModuleComputationTracker::class.java) ?: null
} }
} }
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.analyzer.common package org.jetbrains.kotlin.analyzer.common
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
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.* import org.jetbrains.kotlin.config.*
@@ -69,11 +70,16 @@ object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
): AnalysisResult { ): AnalysisResult {
val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns) val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns)
val project = files.firstOrNull()?.project ?: throw AssertionError("No files to analyze") val project = files.firstOrNull()?.project ?: throw AssertionError("No files to analyze")
@Suppress("NAME_SHADOWING")
val resolver = setupResolverForProject( val resolver = setupResolverForProject(
"sources for metadata serializer", "sources for metadata serializer",
ProjectContext(project), listOf(moduleInfo), { DefaultAnalyzerFacade }, ProjectContext(project), listOf(moduleInfo), { DefaultAnalyzerFacade },
{ ModuleContent(files, GlobalSearchScope.allScope(project)) }, { ModuleContent(files, GlobalSearchScope.allScope(project)) },
object : PlatformAnalysisParameters {}, object : PlatformAnalysisParameters {},
object : LanguageSettingsProvider {
override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project) = languageVersionSettings
override fun getTargetPlatform(moduleInfo: ModuleInfo) = TargetPlatformVersion.NoVersion
},
packagePartProviderFactory = packagePartProviderFactory, packagePartProviderFactory = packagePartProviderFactory,
modulePlatforms = { MultiTargetPlatform.Common } modulePlatforms = { MultiTargetPlatform.Common }
) )
@@ -94,6 +100,7 @@ object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
platformParameters: PlatformAnalysisParameters, platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider packagePartProvider: PackagePartProvider
): ResolverForModule { ): ResolverForModule {
val (syntheticFiles, moduleContentScope) = moduleContent val (syntheticFiles, moduleContentScope) = moduleContent
@@ -46,6 +46,7 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
platformParameters: PlatformAnalysisParameters, platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment, targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>, resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider packagePartProvider: PackagePartProvider
): ResolverForModule { ): ResolverForModule {
val (syntheticFiles, moduleContentScope) = moduleContent val (syntheticFiles, moduleContentScope) = moduleContent
@@ -58,8 +59,6 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
moduleInfo moduleInfo
) )
val languageVersionSettings = LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project)
val container = createContainerForLazyResolve( val container = createContainerForLazyResolve(
moduleContext, moduleContext,
declarationProviderFactory, declarationProviderFactory,
@@ -67,7 +66,7 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
JsPlatform, JsPlatform,
TargetPlatformVersion.NoVersion, TargetPlatformVersion.NoVersion,
targetEnvironment, targetEnvironment,
languageVersionSettings languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
) )
var packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider var packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.idea.caches.resolve package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.openapi.components.service
import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.projectRoots.Sdk
@@ -30,7 +29,6 @@ import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.util.PsiModificationTracker
import com.intellij.util.containers.SLRUCache import com.intellij.util.containers.SLRUCache
import org.jetbrains.kotlin.analyzer.EmptyResolverForProject import org.jetbrains.kotlin.analyzer.EmptyResolverForProject
import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
@@ -39,6 +37,7 @@ import org.jetbrains.kotlin.container.tryGetService
import org.jetbrains.kotlin.context.GlobalContext import org.jetbrains.kotlin.context.GlobalContext
import org.jetbrains.kotlin.context.GlobalContextImpl import org.jetbrains.kotlin.context.GlobalContextImpl
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.project.outOfBlockModificationCount import org.jetbrains.kotlin.idea.project.outOfBlockModificationCount
@@ -171,7 +170,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
} }
private fun IdeaModuleInfo.supportsAdditionalBuiltInsMembers(): Boolean { private fun IdeaModuleInfo.supportsAdditionalBuiltInsMembers(): Boolean {
return project.service<LanguageSettingsProvider>() return IDELanguageSettingsProvider
.getLanguageVersionSettings(this, project) .getLanguageVersionSettings(this, project)
.supportsFeature(LanguageFeature.AdditionalBuiltInsMembers) .supportsFeature(LanguageFeature.AdditionalBuiltInsMembers)
} }
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.GlobalContextImpl import org.jetbrains.kotlin.context.GlobalContextImpl
import org.jetbrains.kotlin.context.withProject import org.jetbrains.kotlin.context.withProject
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider
import org.jetbrains.kotlin.idea.project.AnalyzerFacadeProvider import org.jetbrains.kotlin.idea.project.AnalyzerFacadeProvider
import org.jetbrains.kotlin.idea.project.IdeaEnvironment import org.jetbrains.kotlin.idea.project.IdeaEnvironment
import org.jetbrains.kotlin.js.resolve.JsPlatform import org.jetbrains.kotlin.js.resolve.JsPlatform
@@ -77,7 +78,9 @@ fun createModuleResolverProvider(
return AnalyzerFacade.setupResolverForProject( return AnalyzerFacade.setupResolverForProject(
debugName, globalContext.withProject(project), modulesToCreateResolversFor, debugName, globalContext.withProject(project), modulesToCreateResolversFor,
{ module -> AnalyzerFacadeProvider.getAnalyzerFacade(module.platform ?: analysisSettings.platform) }, { module -> AnalyzerFacadeProvider.getAnalyzerFacade(module.platform ?: analysisSettings.platform) },
modulesContent, jvmPlatformParameters, IdeaEnvironment, builtIns, modulesContent, jvmPlatformParameters,
IDELanguageSettingsProvider,
IdeaEnvironment, builtIns,
delegateResolver, { _, c -> IDEPackagePartProvider(c.moduleContentScope) }, delegateResolver, { _, c -> IDEPackagePartProvider(c.moduleContentScope) },
analysisSettings.sdk?.let { SdkInfo(project, it) }, analysisSettings.sdk?.let { SdkInfo(project, it) },
modulePlatforms = { module -> module.platform?.multiTargetPlatform }, modulePlatforms = { module -> module.platform?.multiTargetPlatform },
@@ -21,7 +21,6 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.search.EverythingGlobalScope import com.intellij.psi.search.EverythingGlobalScope
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.stubs.StubIndex import com.intellij.psi.stubs.StubIndex
import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider
import org.jetbrains.kotlin.asJava.builder.LightClassConstructionContext import org.jetbrains.kotlin.asJava.builder.LightClassConstructionContext
import org.jetbrains.kotlin.config.JvmTarget import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.container.get
@@ -38,6 +37,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.getModuleInfo
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.caches.resolve.lightClasses.IDELightClassConstructionContext.Mode.EXACT import org.jetbrains.kotlin.idea.caches.resolve.lightClasses.IDELightClassConstructionContext.Mode.EXACT
import org.jetbrains.kotlin.idea.caches.resolve.lightClasses.IDELightClassConstructionContext.Mode.LIGHT import org.jetbrains.kotlin.idea.caches.resolve.lightClasses.IDELightClassConstructionContext.Mode.LIGHT
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider
import org.jetbrains.kotlin.idea.project.IdeaEnvironment import org.jetbrains.kotlin.idea.project.IdeaEnvironment
import org.jetbrains.kotlin.idea.project.ResolveElementCache import org.jetbrains.kotlin.idea.project.ResolveElementCache
import org.jetbrains.kotlin.idea.stubindex.KotlinOverridableInternalMembersShortNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinOverridableInternalMembersShortNameIndex
@@ -254,7 +254,7 @@ object IDELightClassContexts {
val moduleInfo = files.first().getModuleInfo() val moduleInfo = files.first().getModuleInfo()
val container = createContainer("LightClassStub", JvmPlatform) { val container = createContainer("LightClassStub", JvmPlatform) {
val jvmTarget = LanguageSettingsProvider.getInstance(project).getTargetPlatform(moduleInfo) as? JvmTarget val jvmTarget = IDELanguageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget
configureModule( configureModule(
ModuleContext(moduleDescriptor, project), JvmPlatform, ModuleContext(moduleDescriptor, project), JvmPlatform,
jvmTarget ?: JvmTarget.DEFAULT, trace jvmTarget ?: JvmTarget.DEFAULT, trace
@@ -263,7 +263,7 @@ object IDELightClassContexts {
useInstance(GlobalSearchScope.EMPTY_SCOPE) useInstance(GlobalSearchScope.EMPTY_SCOPE)
useInstance(LookupTracker.DO_NOTHING) useInstance(LookupTracker.DO_NOTHING)
useImpl<FileScopeProviderImpl>() useImpl<FileScopeProviderImpl>()
useInstance(LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project)) useInstance(IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project))
useInstance(FileBasedDeclarationProviderFactory(sm, files)) useInstance(FileBasedDeclarationProviderFactory(sm, files))
useImpl<AdHocAnnotationResolver>() useImpl<AdHocAnnotationResolver>()
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2016 JetBrains s.r.o. * Copyright 2010-2017 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.idea.project.getLanguageVersionSettings
import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.idea.project.targetPlatform import org.jetbrains.kotlin.idea.project.targetPlatform
class LanguageVersionSettingsProviderImpl : LanguageSettingsProvider { object IDELanguageSettingsProvider : LanguageSettingsProvider {
override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings { override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings {
return (moduleInfo as? ModuleSourceInfo)?.module?.languageVersionSettings ?: project.getLanguageVersionSettings() return (moduleInfo as? ModuleSourceInfo)?.module?.languageVersionSettings ?: project.getLanguageVersionSettings()
} }
@@ -20,11 +20,11 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiModifier import com.intellij.psi.PsiModifier
import com.intellij.psi.search.PsiShortNamesCache import com.intellij.psi.search.PsiShortNamesCache
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider
import org.jetbrains.kotlin.asJava.ImpreciseResolveResult import org.jetbrains.kotlin.asJava.ImpreciseResolveResult
import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.* import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.*
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.idea.caches.resolve.getNullableModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.getNullableModuleInfo
import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider
import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.stubindex.KotlinTypeAliasShortNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinTypeAliasShortNameIndex
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
@@ -235,7 +235,7 @@ class PsiBasedClassResolver @TestOnly constructor(private val targetClassFqName:
private fun KtFile.getDefaultImports(): List<ImportPath> { private fun KtFile.getDefaultImports(): List<ImportPath> {
val moduleInfo = getNullableModuleInfo() ?: return emptyList() val moduleInfo = getNullableModuleInfo() ?: return emptyList()
val versionSettings = LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project) val versionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
return TargetPlatformDetector.getPlatform(this).getDefaultImports( return TargetPlatformDetector.getPlatform(this).getDefaultImports(
versionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons) versionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons)
) )
-3
View File
@@ -340,9 +340,6 @@
<projectService serviceInterface="org.jetbrains.kotlin.console.KotlinConsoleKeeper" <projectService serviceInterface="org.jetbrains.kotlin.console.KotlinConsoleKeeper"
serviceImplementation="org.jetbrains.kotlin.console.KotlinConsoleKeeper"/> serviceImplementation="org.jetbrains.kotlin.console.KotlinConsoleKeeper"/>
<projectService serviceInterface="org.jetbrains.kotlin.analyzer.LanguageSettingsProvider"
serviceImplementation="org.jetbrains.kotlin.idea.compiler.LanguageVersionSettingsProviderImpl"/>
<projectService serviceInterface="org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper" <projectService serviceInterface="org.jetbrains.kotlin.asJava.classes.LightClassInheritanceHelper"
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.lightClasses.IdeLightClassInheritanceHelper"/> serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.lightClasses.IdeLightClassInheritanceHelper"/>