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
This commit is contained in:
Justin Paupore
2023-03-31 01:07:30 -07:00
committed by Space Cloud
parent acca7de42d
commit 6604627fa8
4 changed files with 10 additions and 13 deletions
@@ -54,13 +54,10 @@ internal inline fun createCompositeSymbolProvider(
internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtSourceModule) { internal fun FirSession.registerCompilerPluginExtensions(project: Project, module: KtSourceModule) {
val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return
FirSessionConfigurator(this).apply { FirSessionConfigurator(this).apply {
@Suppress("UNCHECKED_CAST") val registrars = FirExtensionRegistrarAdapter.getInstances(project) +
val registrars = extensionProvider.getRegisteredExtensions( extensionProvider.getRegisteredExtensions(module, FirExtensionRegistrarAdapter)
module,
FirExtensionRegistrarAdapter,
) as List<FirExtensionRegistrar>
for (extensionRegistrar in registrars) { for (extensionRegistrar in registrars) {
registerExtensions(extensionRegistrar.configure()) registerExtensions((extensionRegistrar as FirExtensionRegistrar).configure())
} }
}.configure() }.configure()
} }
@@ -5,13 +5,11 @@
package org.jetbrains.kotlin.analysis.low.level.api.fir.services 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.KtCompilerPluginsProvider
import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
internal class KtCompilerPluginsProviderForTests(val project: Project) : KtCompilerPluginsProvider() { internal object NoOpKtCompilerPluginsProvider : KtCompilerPluginsProvider() {
override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> { override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> =
return extensionType.getInstances(project) emptyList()
}
} }
@@ -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.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.project.structure.LLFirBuiltinsSessionFactory 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.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.low.level.api.fir.sessions.LLFirSessionCache 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(PackagePartProviderFactory::class.java, PackagePartProviderTestImpl(testServices))
registerService(KotlinAsJavaSupport::class.java, SymbolKotlinAsJavaSupport(project)) registerService(KotlinAsJavaSupport::class.java, SymbolKotlinAsJavaSupport(project))
registerService(KtCompilerPluginsProvider::class.java, KtCompilerPluginsProviderForTests(project)) registerService(KtCompilerPluginsProvider::class.java, NoOpKtCompilerPluginsProvider)
registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerFirImpl()) registerService(ReadWriteAccessChecker::class.java, ReadWriteAccessCheckerFirImpl())
registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java) registerService(KotlinReferenceProviderContributor::class.java, KotlinFirReferenceContributor::class.java)
} }
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
public abstract class KtCompilerPluginsProvider { public abstract class KtCompilerPluginsProvider {
/** /**
* Returns a list of extensions of a base [extensionType] which are registered for [module] * 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 <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> public abstract fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T>
} }