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:
committed by
Space Cloud
parent
acca7de42d
commit
6604627fa8
+3
-6
@@ -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()
|
||||
}
|
||||
|
||||
+3
-5
@@ -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()
|
||||
}
|
||||
+2
-2
@@ -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)
|
||||
}
|
||||
|
||||
+2
@@ -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>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user