[LL API] Provide proper way for automatic registration of compiler plugins

This commit is contained in:
Dmitriy Novozhilov
2022-06-10 14:32:43 +03:00
committed by teamcity
parent c979e1edcf
commit 0c6a9d3eac
5 changed files with 51 additions and 8 deletions
@@ -12,10 +12,10 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.createSealed
import org.jetbrains.kotlin.analysis.low.level.api.fir.fir.caches.FirThreadSafeCachesFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirIdePredicateBasedProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirIdeRegisteredPluginAnnotations
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirLibraryOrLibrarySourceResolvableModuleSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.project.structure.moduleScopeProvider
import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.SessionConfiguration
import org.jetbrains.kotlin.fir.caches.FirCachesFactory
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
import org.jetbrains.kotlin.fir.extensions.FirPredicateBasedProvider
import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations
import org.jetbrains.kotlin.fir.java.FirJavaFacadeForSource
@@ -47,9 +48,15 @@ internal inline fun createCompositeSymbolProvider(
FirCompositeSymbolProvider(session, buildList(createSubProviders))
@SessionConfiguration
internal fun FirSession.registerCompilerPluginExtensions(project: Project) {
internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtSourceModule) {
val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return
FirSessionFactory.FirSessionConfigurator(this).apply {
for (extensionRegistrar in FirExtensionRegistrar.getInstances(project)) {
@Suppress("UNCHECKED_CAST")
val registrars = extensionProvider.getRegisteredExtensions(
module,
FirExtensionRegistrarAdapter,
) as List<FirExtensionRegistrar>
for (extensionRegistrar in registrars) {
registerExtensions(extensionRegistrar.configure())
}
}.configure()
@@ -83,4 +90,4 @@ internal fun createJavaSymbolProvider(
firSession,
FirJavaFacadeForSource(firSession, moduleData, project.createJavaClassFinder(contentScope))
)
}
}
@@ -97,7 +97,7 @@ internal object LLFirSessionFactory {
register(FirPhaseManager::class, LLFirPhaseManager(sessionInvalidator))
registerCompilerPluginServices(contentScope, project, module)
registerCompilerPluginExtensions(project)
registerCompilerPluginExtensions(project, module)
val switchableExtensionDeclarationsSymbolProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(session)?.also {
register(FirSwitchableExtensionDeclarationsSymbolProvider::class, it)
@@ -198,8 +198,6 @@ internal object LLFirSessionFactory {
register(FirRegisteredPluginAnnotations::class, LLFirIdeRegisteredPluginAnnotations(this@session, annotationsResolver))
register(FirPredicateBasedProvider::class, FirEmptyPredicateBasedProvider())
registerCompilerPluginExtensions(project)
val dependencyProvider = LLFirDependentModuleProviders(this) {
// <all libraries scope> - <current library scope>
val librariesSearchScope =
@@ -0,0 +1,17 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.low.level.api.fir.services
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
internal class KtCompilerPluginsProviderForTests(val project: Project) : KtCompilerPluginsProvider() {
override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> {
return extensionType.getInstances(project)
}
}
@@ -15,8 +15,10 @@ import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSessionProvider
import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirResolveSessionService
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.PackagePartProviderFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.services.KtCompilerPluginsProviderForTests
import org.jetbrains.kotlin.analysis.low.level.api.fir.services.LLFirSealedClassInheritorsProcessorFactoryForTests
import org.jetbrains.kotlin.analysis.low.level.api.fir.services.PackagePartProviderTestImpl
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
@@ -46,6 +48,7 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
registerService(SymbolLightClassFacadeCache::class.java)
registerService(KotlinAsJavaSupport::class.java, KotlinAsJavaFirSupport(project))
registerService(KtCompilerPluginsProvider::class.java, KtCompilerPluginsProviderForTests(project))
}
with(PsiElementFinder.EP.getPoint(project)) {
@@ -59,4 +62,4 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java)
}
}
}
}
@@ -0,0 +1,18 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.analysis.project.structure
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
/**
* A service which can return extensions which are registered for some module
*/
public abstract class KtCompilerPluginsProvider {
/**
* Returns a list of extensions of a base [extensionType] which are registered for [module]
*/
public abstract fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T>
}