[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.fir.caches.FirThreadSafeCachesFactory
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirIdePredicateBasedProvider 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.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.LLFirSession
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession 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.KtSourceModule
import org.jetbrains.kotlin.analysis.project.structure.KtCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.project.structure.moduleScopeProvider import org.jetbrains.kotlin.analysis.project.structure.moduleScopeProvider
import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver import org.jetbrains.kotlin.analysis.providers.createAnnotationResolver
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider 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.caches.FirCachesFactory
import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider import org.jetbrains.kotlin.fir.declarations.SealedClassInheritorsProvider
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar 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.FirPredicateBasedProvider
import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations import org.jetbrains.kotlin.fir.extensions.FirRegisteredPluginAnnotations
import org.jetbrains.kotlin.fir.java.FirJavaFacadeForSource import org.jetbrains.kotlin.fir.java.FirJavaFacadeForSource
@@ -47,9 +48,15 @@ internal inline fun createCompositeSymbolProvider(
FirCompositeSymbolProvider(session, buildList(createSubProviders)) FirCompositeSymbolProvider(session, buildList(createSubProviders))
@SessionConfiguration @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 { 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()) registerExtensions(extensionRegistrar.configure())
} }
}.configure() }.configure()
@@ -97,7 +97,7 @@ internal object LLFirSessionFactory {
register(FirPhaseManager::class, LLFirPhaseManager(sessionInvalidator)) register(FirPhaseManager::class, LLFirPhaseManager(sessionInvalidator))
registerCompilerPluginServices(contentScope, project, module) registerCompilerPluginServices(contentScope, project, module)
registerCompilerPluginExtensions(project) registerCompilerPluginExtensions(project, module)
val switchableExtensionDeclarationsSymbolProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(session)?.also { val switchableExtensionDeclarationsSymbolProvider = FirSwitchableExtensionDeclarationsSymbolProvider.create(session)?.also {
register(FirSwitchableExtensionDeclarationsSymbolProvider::class, it) register(FirSwitchableExtensionDeclarationsSymbolProvider::class, it)
@@ -198,8 +198,6 @@ internal object LLFirSessionFactory {
register(FirRegisteredPluginAnnotations::class, LLFirIdeRegisteredPluginAnnotations(this@session, annotationsResolver)) register(FirRegisteredPluginAnnotations::class, LLFirIdeRegisteredPluginAnnotations(this@session, annotationsResolver))
register(FirPredicateBasedProvider::class, FirEmptyPredicateBasedProvider()) register(FirPredicateBasedProvider::class, FirEmptyPredicateBasedProvider())
registerCompilerPluginExtensions(project)
val dependencyProvider = LLFirDependentModuleProviders(this) { val dependencyProvider = LLFirDependentModuleProviders(this) {
// <all libraries scope> - <current library scope> // <all libraries scope> - <current library scope>
val librariesSearchScope = 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.LLFirResolveSessionService
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory 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.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.LLFirSealedClassInheritorsProcessorFactoryForTests
import org.jetbrains.kotlin.analysis.low.level.api.fir.services.PackagePartProviderTestImpl 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.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar
import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport import org.jetbrains.kotlin.asJava.KotlinAsJavaSupport
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
@@ -46,6 +48,7 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() {
registerService(SymbolLightClassFacadeCache::class.java) registerService(SymbolLightClassFacadeCache::class.java)
registerService(KotlinAsJavaSupport::class.java, KotlinAsJavaFirSupport(project)) registerService(KotlinAsJavaSupport::class.java, KotlinAsJavaFirSupport(project))
registerService(KtCompilerPluginsProvider::class.java, KtCompilerPluginsProviderForTests(project))
} }
with(PsiElementFinder.EP.getPoint(project)) { with(PsiElementFinder.EP.getPoint(project)) {
@@ -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>
}