From 6604627fa88eaf86eb4cb7d5dbd1c5dd3d3af98a Mon Sep 17 00:00:00 2001 From: Justin Paupore Date: Fri, 31 Mar 2023 01:07:30 -0700 Subject: [PATCH] Use registered FIR compiler extensions in Analysis API. This will allow IDE plugins to contribute compiler plugins to analysis, above and beyond those used for the actual compilation step. These plugins can be used to, for example, provide declarations for code that is generated during build by an external tool. ^KT-57763 fixed --- .../api/fir/project/structure/sessionFactoryHelpers.kt | 9 +++------ ...viderForTests.kt => NoOpKtCompilerPluginsProvider.kt} | 8 +++----- .../fir/test/base/AnalysisApiFirTestServiceRegistrar.kt | 4 ++-- .../project/structure/KtCompilerPluginsProvider.kt | 2 ++ 4 files changed, 10 insertions(+), 13 deletions(-) rename analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/{KtCompilerPluginsProviderForTests.kt => NoOpKtCompilerPluginsProvider.kt} (75%) 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 a8b1e573473..fab1ceb8524 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 @@ -54,13 +54,10 @@ internal inline fun createCompositeSymbolProvider( internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtSourceModule) { val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return FirSessionConfigurator(this).apply { - @Suppress("UNCHECKED_CAST") - val registrars = extensionProvider.getRegisteredExtensions( - module, - FirExtensionRegistrarAdapter, - ) as List + val registrars = FirExtensionRegistrarAdapter.getInstances(project) + + extensionProvider.getRegisteredExtensions(module, FirExtensionRegistrarAdapter) for (extensionRegistrar in registrars) { - registerExtensions(extensionRegistrar.configure()) + registerExtensions((extensionRegistrar as FirExtensionRegistrar).configure()) } }.configure() } 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/NoOpKtCompilerPluginsProvider.kt similarity index 75% rename from analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/KtCompilerPluginsProviderForTests.kt rename to analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/services/NoOpKtCompilerPluginsProvider.kt index 6f7de0d363c..802cc4934cf 100644 --- 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/NoOpKtCompilerPluginsProvider.kt @@ -5,13 +5,11 @@ 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) - } +internal object NoOpKtCompilerPluginsProvider : KtCompilerPluginsProvider() { + override fun getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor): List = + emptyList() } 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 9cb13988726..e3199f9b6e6 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 @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirGlobalResolveCompone 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.project.structure.LLFirBuiltinsSessionFactory -import org.jetbrains.kotlin.analysis.low.level.api.fir.services.KtCompilerPluginsProviderForTests +import org.jetbrains.kotlin.analysis.low.level.api.fir.services.NoOpKtCompilerPluginsProvider 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.sessions.LLFirSessionCache @@ -56,7 +56,7 @@ object AnalysisApiFirTestServiceRegistrar : AnalysisApiTestServiceRegistrar() { registerService(PackagePartProviderFactory::class.java, PackagePartProviderTestImpl(testServices)) registerService(KotlinAsJavaSupport::class.java, SymbolKotlinAsJavaSupport(project)) - registerService(KtCompilerPluginsProvider::class.java, KtCompilerPluginsProviderForTests(project)) + registerService(KtCompilerPluginsProvider::class.java, NoOpKtCompilerPluginsProvider) registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerFirImpl()) registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java) } 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 index a453e25a8b3..4ec1ce8e684 100644 --- 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 @@ -13,6 +13,8 @@ import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor public abstract class KtCompilerPluginsProvider { /** * Returns a list of extensions of a base [extensionType] which are registered for [module] + * + * These extensions are used in addition to those provided by the extension descriptor's [ProjectExtensionDescriptor.getInstances]. */ public abstract fun getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor): List }