[AA] Make KotlinReferenceProvidersService and KotlinReferenceProviderContributor a project services

There is no need to have those services on application level
This commit is contained in:
Dmitriy Novozhilov
2022-07-28 11:13:50 +03:00
parent 0909cad886
commit 7ef81c27df
8 changed files with 38 additions and 39 deletions
@@ -37,14 +37,11 @@ object AnalysisApiFe10TestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(enabled = true)) registerService(ModuleVisibilityManager::class.java, CliModuleVisibilityManagerImpl(enabled = true))
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerDescriptorsImpl()) registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerDescriptorsImpl())
registerService(KotlinReferenceProviderContributor::class.java, KtFe10KotlinReferenceProviderContributor::class.java)
} }
AnalysisHandlerExtension.registerExtension(project, KtFe10AnalysisHandlerExtension()) AnalysisHandlerExtension.registerExtension(project, KtFe10AnalysisHandlerExtension())
KotlinCoreEnvironment.registerKotlinLightClassSupport(project) KotlinCoreEnvironment.registerKotlinLightClassSupport(project)
} }
override fun registerApplicationServices(application: MockApplication, testServices: TestServices) { override fun registerApplicationServices(application: MockApplication, testServices: TestServices) {}
application.apply {
registerService(KotlinReferenceProviderContributor::class.java, KtFe10KotlinReferenceProviderContributor::class.java)
}
}
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.analysis.api.impl.base.references package org.jetbrains.kotlin.analysis.api.impl.base.references
import com.intellij.openapi.project.Project
import com.intellij.psi.ContributedReferenceHost import com.intellij.psi.ContributedReferenceHost
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference import com.intellij.psi.PsiReference
@@ -21,13 +22,13 @@ import org.jetbrains.kotlin.idea.references.KotlinReferenceProviderContributor
import org.jetbrains.kotlin.psi.KotlinReferenceProvidersService import org.jetbrains.kotlin.psi.KotlinReferenceProvidersService
import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.kotlin.utils.SmartList
class HLApiReferenceProviderService : KotlinReferenceProvidersService() { class HLApiReferenceProviderService(val project: Project) : KotlinReferenceProvidersService() {
private val originalProvidersBinding: MultiMap<Class<out PsiElement>, KotlinPsiReferenceProvider> private val originalProvidersBinding: MultiMap<Class<out PsiElement>, KotlinPsiReferenceProvider>
private val providersBindingCache: Map<Class<out PsiElement>, List<KotlinPsiReferenceProvider>> private val providersBindingCache: Map<Class<out PsiElement>, List<KotlinPsiReferenceProvider>>
init { init {
val registrar = KotlinPsiReferenceRegistrar() val registrar = KotlinPsiReferenceRegistrar()
KotlinReferenceProviderContributor.getInstance().registerReferenceProviders(registrar) KotlinReferenceProviderContributor.getInstance(project).registerReferenceProviders(registrar)
originalProvidersBinding = registrar.providers originalProvidersBinding = registrar.providers
providersBindingCache = ConcurrentFactoryMap.createMap<Class<out PsiElement>, List<KotlinPsiReferenceProvider>> { klass -> providersBindingCache = ConcurrentFactoryMap.createMap<Class<out PsiElement>, List<KotlinPsiReferenceProvider>> { klass ->
@@ -28,8 +28,7 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.TestServices
object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() { object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() {
override fun registerProjectExtensionPoints(project: MockProject, testServices: TestServices) { override fun registerProjectExtensionPoints(project: MockProject, testServices: TestServices) {}
}
@OptIn(KtAnalysisApiInternals::class) @OptIn(KtAnalysisApiInternals::class)
override fun registerProjectServices(project: MockProject, testServices: TestServices) { override fun registerProjectServices(project: MockProject, testServices: TestServices) {
@@ -43,13 +42,9 @@ object AnalysisApiBaseTestServiceRegistrar: AnalysisApiTestServiceRegistrar() {
registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(allKtFiles)) registerService(KotlinAnnotationsResolverFactory::class.java, KotlinStaticAnnotationsResolverFactory(allKtFiles))
registerService(KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory(allKtFiles)) registerService(KotlinDeclarationProviderFactory::class.java, KotlinStaticDeclarationProviderFactory(allKtFiles))
registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(allKtFiles)) registerService(KotlinPackageProviderFactory::class.java, KotlinStaticPackageProviderFactory(allKtFiles))
}
}
override fun registerApplicationServices(application: MockApplication, testServices: TestServices) {
application.apply {
registerService(KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java) registerService(KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java)
} }
} }
override fun registerApplicationServices(application: MockApplication, testServices: TestServices) {}
} }
@@ -94,13 +94,6 @@ public class StandaloneAnalysisAPISessionBuilder(
) )
} }
private fun registerApplicationServices() {
kotlinCoreProjectEnvironment.environment.application.apply {
registerService(KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java)
registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java)
}
}
public fun <T : Any> registerApplicationService(serviceInterface: Class<T>, serviceImplementation: T) { public fun <T : Any> registerApplicationService(serviceInterface: Class<T>, serviceImplementation: T) {
kotlinCoreProjectEnvironment.environment.application.apply { kotlinCoreProjectEnvironment.environment.application.apply {
registerService(serviceInterface, serviceImplementation) registerService(serviceInterface, serviceImplementation)
@@ -140,6 +133,10 @@ public class StandaloneAnalysisAPISessionBuilder(
registerService(LLFirBuiltinsSessionFactory::class.java, LLFirBuiltinsSessionFactory(this)) registerService(LLFirBuiltinsSessionFactory::class.java, LLFirBuiltinsSessionFactory(this))
RegisterComponentService.registerLLFirLibrarySessionFactory(this) RegisterComponentService.registerLLFirLibrarySessionFactory(this)
RegisterComponentService.registerLLFirNonUnderContentRootSessionFactory(this) RegisterComponentService.registerLLFirNonUnderContentRootSessionFactory(this)
registerService(KotlinReferenceProvidersService::class.java, HLApiReferenceProviderService::class.java)
registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java)
RegisterComponentService.registerLLFirResolveSessionService(this) RegisterComponentService.registerLLFirResolveSessionService(this)
registerService( registerService(
PackagePartProviderFactory::class.java, PackagePartProviderFactory::class.java,
@@ -203,8 +200,6 @@ public class StandaloneAnalysisAPISessionBuilder(
allSourceFiles, allSourceFiles,
) )
registerApplicationServices()
val project = kotlinCoreProjectEnvironment.project val project = kotlinCoreProjectEnvironment.project
val ktFiles = allSourceFiles.filterIsInstance<KtFile>() val ktFiles = allSourceFiles.filterIsInstance<KtFile>()
val libraryRoots = StandaloneProjectFactory.getAllBinaryRoots(modules, kotlinCoreProjectEnvironment) val libraryRoots = StandaloneProjectFactory.getAllBinaryRoots(modules, kotlinCoreProjectEnvironment)
@@ -79,6 +79,8 @@ public fun configureApplicationEnvironment(app: MockApplication) {
* * [KotlinDeclarationProviderFactory] * * [KotlinDeclarationProviderFactory]
* * [KotlinPackageProviderFactory] * * [KotlinPackageProviderFactory]
* * [PackagePartProviderFactory] * * [PackagePartProviderFactory]
* * [KotlinReferenceProvidersService]
* * [KotlinReferenceProviderContributor]
* *
* Note that [ProjectStructureProvider] is built by using * Note that [ProjectStructureProvider] is built by using
* * given [ktFiles] as Kotlin sources * * given [ktFiles] as Kotlin sources
@@ -122,6 +124,16 @@ internal fun configureProjectEnvironment(
KotlinStaticAnnotationsResolverFactory(ktFiles) KotlinStaticAnnotationsResolverFactory(ktFiles)
) )
project.registerService(
KotlinReferenceProvidersService::class.java,
HLApiReferenceProviderService::class.java
)
project.registerService(
KotlinReferenceProviderContributor::class.java,
KotlinFirReferenceContributor::class.java
)
RegisterComponentService.registerLLFirResolveSessionService(project) RegisterComponentService.registerLLFirResolveSessionService(project)
project.picoContainer.registerComponentInstance( project.picoContainer.registerComponentInstance(
FirSealedClassInheritorsProcessorFactory::class.qualifiedName, FirSealedClassInheritorsProcessorFactory::class.qualifiedName,
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.idea.references package org.jetbrains.kotlin.idea.references
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference import com.intellij.psi.PsiReference
import com.intellij.util.containers.MultiMap import com.intellij.util.containers.MultiMap
@@ -19,8 +20,8 @@ interface KotlinReferenceProviderContributor {
fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar) fun registerReferenceProviders(registrar: KotlinPsiReferenceRegistrar)
companion object { companion object {
fun getInstance(): KotlinReferenceProviderContributor = fun getInstance(project: Project): KotlinReferenceProviderContributor =
ServiceManager.getService(KotlinReferenceProviderContributor::class.java) ServiceManager.getService(project, KotlinReferenceProviderContributor::class.java)
} }
} }
@@ -54,6 +54,7 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
registerService(KotlinAsJavaSupport::class.java, SymbolKotlinAsJavaSupport(project)) registerService(KotlinAsJavaSupport::class.java, SymbolKotlinAsJavaSupport(project))
registerService(KtCompilerPluginsProvider::class.java, KtCompilerPluginsProviderForTests(project)) registerService(KtCompilerPluginsProvider::class.java, KtCompilerPluginsProviderForTests(project))
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerFirImpl()) registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerFirImpl())
registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java)
} }
with(PsiElementFinder.EP.getPoint(project)) { with(PsiElementFinder.EP.getPoint(project)) {
@@ -62,9 +63,5 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
} }
} }
override fun registerApplicationServices(application: MockApplication, testServices: TestServices) { override fun registerApplicationServices(application: MockApplication, testServices: TestServices) {}
application.apply {
registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java)
}
}
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.psi package org.jetbrains.kotlin.psi
import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference import com.intellij.psi.PsiReference
@@ -16,13 +17,13 @@ open class KotlinReferenceProvidersService {
private val NO_REFERENCES_SERVICE = KotlinReferenceProvidersService() private val NO_REFERENCES_SERVICE = KotlinReferenceProvidersService()
@JvmStatic @JvmStatic
fun getInstance(): KotlinReferenceProvidersService { fun getInstance(project: Project): KotlinReferenceProvidersService {
return ServiceManager.getService(KotlinReferenceProvidersService::class.java) ?: NO_REFERENCES_SERVICE return project.getService(KotlinReferenceProvidersService::class.java) ?: NO_REFERENCES_SERVICE
} }
@JvmStatic @JvmStatic
fun getReferencesFromProviders(psiElement: PsiElement): Array<PsiReference> { fun getReferencesFromProviders(psiElement: PsiElement): Array<PsiReference> {
return getInstance().getReferences(psiElement) return getInstance(psiElement.project).getReferences(psiElement)
} }
} }
} }