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) {
val extensionProvider = project.getService(KtCompilerPluginsProvider::class.java) ?: return
FirSessionConfigurator(this).apply {
@Suppress("UNCHECKED_CAST")
val registrars = extensionProvider.getRegisteredExtensions(
module,
FirExtensionRegistrarAdapter,
) as List<FirExtensionRegistrar>
val registrars = FirExtensionRegistrarAdapter.getInstances(project) +
extensionProvider.getRegisteredExtensions(module, FirExtensionRegistrarAdapter)
for (extensionRegistrar in registrars) {
registerExtensions(extensionRegistrar.configure())
registerExtensions((extensionRegistrar as FirExtensionRegistrar).configure())
}
}.configure()
}
@@ -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 <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> {
return extensionType.getInstances(project)
}
internal object NoOpKtCompilerPluginsProvider : KtCompilerPluginsProvider() {
override fun <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T> =
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.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)
}
@@ -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 <T : Any> getRegisteredExtensions(module: KtSourceModule, extensionType: ProjectExtensionDescriptor<T>): List<T>
}