From 0c6a9d3eac96b51d89daa91af068e3adfca7dd43 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 10 Jun 2022 14:32:43 +0300 Subject: [PATCH] [LL API] Provide proper way for automatic registration of compiler plugins --- .../project/structure/sessionFactoryHelpers.kt | 15 +++++++++++---- .../api/fir/sessions/LLFirSessionFactory.kt | 4 +--- .../KtCompilerPluginsProviderForTests.kt | 17 +++++++++++++++++ .../base/AnalysisApiFirTestServiceRegistrar.kt | 5 ++++- .../structure/KtCompilerPluginsProvider.kt | 18 ++++++++++++++++++ 5 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt create mode 100644 analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt index 3a6f0c8017e..b80c4adbb5d 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/project/structure/sessionFactoryHelpers.kt @@ -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 + for (extensionRegistrar in registrars) { registerExtensions(extensionRegistrar.configure()) } }.configure() @@ -83,4 +90,4 @@ internal fun createJavaSymbolProvider( firSession, FirJavaFacadeForSource(firSession, moduleData, project.createJavaClassFinder(contentScope)) ) -} \ No newline at end of file +} diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt index ddd034f8ef5..7717b0b82d2 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/sessions/LLFirSessionFactory.kt @@ -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) { // - val librariesSearchScope = diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt new file mode 100644 index 00000000000..6f7de0d363c --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt @@ -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 getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor): List { + return extensionType.getInstances(project) + } +} diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt index 87c0087e99a..80932bf900a 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/test/base/AnalysisApiFirTestServiceRegistrar.kt @@ -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) } } -} \ No newline at end of file +} diff --git a/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt new file mode 100644 index 00000000000..a453e25a8b3 --- /dev/null +++ b/analysis/project-structure/src/org/jetbrains/kotlin/analysis/project/structure/KtCompilerPluginsProvider.kt @@ -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 getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor): List +}