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,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider
): ResolverForModule {
val (syntheticFiles, moduleContentScope) = moduleContent
@@ -80,7 +81,6 @@ object JvmAnalyzerFacade : AnalyzerFacade<JvmPlatformParameters>() {
resolverForModule.componentProvider.get<JavaDescriptorResolver>()
}
val languageSettingsProvider = LanguageSettingsProvider.getInstance(project)
val jvmTarget = languageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget ?: JvmTarget.JVM_1_6
val languageVersionSettings = languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
@@ -164,6 +164,7 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
analyzerFacade: (M) -> AnalyzerFacade<P>,
modulesContent: (M) -> ModuleContent,
platformParameters: P,
languageSettingsProvider: LanguageSettingsProvider = LanguageSettingsProvider.Default,
targetEnvironment: TargetEnvironment = CompilerEnvironment,
builtIns: KotlinBuiltIns = DefaultBuiltIns.Instance,
delegateResolver: ResolverForProject<M> = EmptyResolverForProject(),
@@ -220,7 +221,7 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
analyzerFacade(module).createResolverForModule(
module, descriptor, projectContext.withModule(descriptor), modulesContent(module),
platformParameters, targetEnvironment, resolverForProject,
platformParameters, targetEnvironment, resolverForProject, languageSettingsProvider,
packagePartProviderFactory(module, content)
)
}
@@ -243,6 +244,7 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
platformParameters: P,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider
): ResolverForModule
@@ -301,10 +303,6 @@ interface LanguageSettingsProvider {
override fun getTargetPlatform(moduleInfo: ModuleInfo): TargetPlatformVersion = TargetPlatformVersion.NoVersion
}
companion object {
fun getInstance(project: Project) = ServiceManager.getService(project, LanguageSettingsProvider::class.java) ?: Default
}
}
interface ResolverForModuleComputationTracker {
@@ -314,4 +312,4 @@ interface ResolverForModuleComputationTracker {
companion object {
fun getInstance(project: Project): ResolverForModuleComputationTracker? = ServiceManager.getService(project, ResolverForModuleComputationTracker::class.java) ?: null
}
}
}
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.analyzer.common
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.*
import org.jetbrains.kotlin.config.*
@@ -69,11 +70,16 @@ object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
): AnalysisResult {
val moduleInfo = SourceModuleInfo(moduleName, capabilities, dependOnBuiltIns)
val project = files.firstOrNull()?.project ?: throw AssertionError("No files to analyze")
@Suppress("NAME_SHADOWING")
val resolver = setupResolverForProject(
"sources for metadata serializer",
ProjectContext(project), listOf(moduleInfo), { DefaultAnalyzerFacade },
{ ModuleContent(files, GlobalSearchScope.allScope(project)) },
object : PlatformAnalysisParameters {},
object : LanguageSettingsProvider {
override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project) = languageVersionSettings
override fun getTargetPlatform(moduleInfo: ModuleInfo) = TargetPlatformVersion.NoVersion
},
packagePartProviderFactory = packagePartProviderFactory,
modulePlatforms = { MultiTargetPlatform.Common }
)
@@ -94,6 +100,7 @@ object DefaultAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider
): ResolverForModule {
val (syntheticFiles, moduleContentScope) = moduleContent
@@ -46,6 +46,7 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
platformParameters: PlatformAnalysisParameters,
targetEnvironment: TargetEnvironment,
resolverForProject: ResolverForProject<M>,
languageSettingsProvider: LanguageSettingsProvider,
packagePartProvider: PackagePartProvider
): ResolverForModule {
val (syntheticFiles, moduleContentScope) = moduleContent
@@ -58,8 +59,6 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
moduleInfo
)
val languageVersionSettings = LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project)
val container = createContainerForLazyResolve(
moduleContext,
declarationProviderFactory,
@@ -67,7 +66,7 @@ object JsAnalyzerFacade : AnalyzerFacade<PlatformAnalysisParameters>() {
JsPlatform,
TargetPlatformVersion.NoVersion,
targetEnvironment,
languageVersionSettings
languageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
)
var packageFragmentProvider = container.get<ResolveSession>().packageFragmentProvider
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.idea.caches.resolve
import com.intellij.openapi.components.service
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
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.util.containers.SLRUCache
import org.jetbrains.kotlin.analyzer.EmptyResolverForProject
import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
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.GlobalContextImpl
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.project.TargetPlatformDetector
import org.jetbrains.kotlin.idea.project.outOfBlockModificationCount
@@ -171,7 +170,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
}
private fun IdeaModuleInfo.supportsAdditionalBuiltInsMembers(): Boolean {
return project.service<LanguageSettingsProvider>()
return IDELanguageSettingsProvider
.getLanguageVersionSettings(this, project)
.supportsFeature(LanguageFeature.AdditionalBuiltInsMembers)
}
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.builtins.DefaultBuiltIns
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.context.GlobalContextImpl
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.IdeaEnvironment
import org.jetbrains.kotlin.js.resolve.JsPlatform
@@ -77,7 +78,9 @@ fun createModuleResolverProvider(
return AnalyzerFacade.setupResolverForProject(
debugName, globalContext.withProject(project), modulesToCreateResolversFor,
{ module -> AnalyzerFacadeProvider.getAnalyzerFacade(module.platform ?: analysisSettings.platform) },
modulesContent, jvmPlatformParameters, IdeaEnvironment, builtIns,
modulesContent, jvmPlatformParameters,
IDELanguageSettingsProvider,
IdeaEnvironment, builtIns,
delegateResolver, { _, c -> IDEPackagePartProvider(c.moduleContentScope) },
analysisSettings.sdk?.let { SdkInfo(project, it) },
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.GlobalSearchScope
import com.intellij.psi.stubs.StubIndex
import org.jetbrains.kotlin.analyzer.LanguageSettingsProvider
import org.jetbrains.kotlin.asJava.builder.LightClassConstructionContext
import org.jetbrains.kotlin.config.JvmTarget
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.lightClasses.IDELightClassConstructionContext.Mode.EXACT
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.ResolveElementCache
import org.jetbrains.kotlin.idea.stubindex.KotlinOverridableInternalMembersShortNameIndex
@@ -254,7 +254,7 @@ object IDELightClassContexts {
val moduleInfo = files.first().getModuleInfo()
val container = createContainer("LightClassStub", JvmPlatform) {
val jvmTarget = LanguageSettingsProvider.getInstance(project).getTargetPlatform(moduleInfo) as? JvmTarget
val jvmTarget = IDELanguageSettingsProvider.getTargetPlatform(moduleInfo) as? JvmTarget
configureModule(
ModuleContext(moduleDescriptor, project), JvmPlatform,
jvmTarget ?: JvmTarget.DEFAULT, trace
@@ -263,7 +263,7 @@ object IDELightClassContexts {
useInstance(GlobalSearchScope.EMPTY_SCOPE)
useInstance(LookupTracker.DO_NOTHING)
useImpl<FileScopeProviderImpl>()
useInstance(LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project))
useInstance(IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project))
useInstance(FileBasedDeclarationProviderFactory(sm, files))
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");
* 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.targetPlatform
class LanguageVersionSettingsProviderImpl : LanguageSettingsProvider {
object IDELanguageSettingsProvider : LanguageSettingsProvider {
override fun getLanguageVersionSettings(moduleInfo: ModuleInfo, project: Project): LanguageVersionSettings {
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.search.PsiShortNamesCache
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.config.LanguageFeature
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.stubindex.KotlinTypeAliasShortNameIndex
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> {
val moduleInfo = getNullableModuleInfo() ?: return emptyList()
val versionSettings = LanguageSettingsProvider.getInstance(project).getLanguageVersionSettings(moduleInfo, project)
val versionSettings = IDELanguageSettingsProvider.getLanguageVersionSettings(moduleInfo, project)
return TargetPlatformDetector.getPlatform(this).getDefaultImports(
versionSettings.supportsFeature(LanguageFeature.DefaultImportOfPackageKotlinComparisons)
)
-3
View File
@@ -340,9 +340,6 @@
<projectService serviceInterface="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"
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.lightClasses.IdeLightClassInheritanceHelper"/>