[FIR] Make FirExtensionRegistrar a proper extension point

After that commit it's allowed to register any FIR plugin using
  existing extension infrastructure (`-Xplugin` CLI argument,
  plugin.xml for IDE plugins, etc)
This commit is contained in:
Dmitriy Novozhilov
2021-11-29 14:07:27 +03:00
committed by TeamCityServer
parent 14ee13c72e
commit ce218b8a0b
14 changed files with 43 additions and 38 deletions
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.backend.jvm.FirJvmBackendExtension
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.pipeline.buildFirFromKtFiles
import org.jetbrains.kotlin.fir.pipeline.convertToIr
@@ -87,6 +88,7 @@ object FirKotlinToJvmBytecodeCompiler {
val isMultiModuleChunk = chunk.size > 1
// TODO: run lowerings for all modules in the chunk, then run codegen for all modules.
val project = (projectEnvironment as? PsiBasedProjectEnvironment)?.project
for (module in chunk) {
val moduleConfiguration = projectConfiguration.applyModuleProperties(module, buildFile)
val context = CompilationContext(
@@ -101,7 +103,8 @@ object FirKotlinToJvmBytecodeCompiler {
targetIds,
incrementalComponents,
extendedAnalysisMode,
(projectEnvironment as? PsiBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) } ?: emptyList()
firExtensionRegistrars = project?.let { FirExtensionRegistrar.getInstances(it) } ?: emptyList(),
irGenerationExtensions = project?.let { IrGenerationExtension.getInstances(it) } ?: emptyList()
)
val generationState = context.compileModule() ?: return false
outputs += generationState
@@ -112,7 +115,7 @@ object FirKotlinToJvmBytecodeCompiler {
}
return writeOutputs(
(projectEnvironment as? PsiBasedProjectEnvironment)?.project,
project,
projectConfiguration,
chunk,
outputs.map(Pair<FirResult, GenerationState>::second),
@@ -208,6 +211,7 @@ object FirKotlinToJvmBytecodeCompiler {
librariesScope,
lookupTracker = moduleConfiguration.get(CommonConfigurationKeys.LOOKUP_TRACKER),
providerAndScopeForIncrementalCompilation,
firExtensionRegistrars,
dependenciesConfigurator = {
dependencies(moduleConfiguration.jvmClasspathRoots.map { it.toPath() })
dependencies(moduleConfiguration.jvmModularRoots.map { it.toPath() })
@@ -350,6 +354,7 @@ object FirKotlinToJvmBytecodeCompiler {
val targetIds: List<TargetId>?,
val incrementalComponents: IncrementalCompilationComponents?,
val extendedAnalysisMode: Boolean,
val firExtensionRegistrars: List<FirExtensionRegistrar>,
val irGenerationExtensions: Collection<IrGenerationExtension>
)
@@ -82,6 +82,7 @@ import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.extensions.*
import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor
import org.jetbrains.kotlin.extensions.internal.TypeResolutionInterceptor
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.js.translate.extensions.JsSyntheticTranslateExtension
import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache
@@ -648,6 +649,7 @@ class KotlinCoreEnvironment private constructor(
TypeResolutionInterceptor.registerExtensionPoint(project)
CandidateInterceptor.registerExtensionPoint(project)
DescriptorSerializerPlugin.registerExtensionPoint(project)
FirExtensionRegistrar.registerExtensionPoint(project)
}
internal fun registerExtensionsFromPlugins(project: MockProject, configuration: CompilerConfiguration) {
@@ -5,14 +5,18 @@
package org.jetbrains.kotlin.fir.extensions
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.SessionConfiguration
import org.jetbrains.kotlin.fir.analysis.extensions.FirAdditionalCheckersExtension
import kotlin.reflect.KClass
abstract class FirExtensionRegistrar {
companion object {
val AVAILABLE_EXTENSIONS = listOf(
companion object : ProjectExtensionDescriptor<FirExtensionRegistrar>(
name = "org.jetbrains.kotlin.fir.extensions.firExtensionRegistrar",
extensionClass = FirExtensionRegistrar::class.java
) {
internal val AVAILABLE_EXTENSIONS = listOf(
FirStatusTransformerExtension::class,
FirDeclarationGenerationExtension::class,
FirAdditionalCheckersExtension::class,
@@ -84,6 +84,7 @@ object FirSessionFactory {
librariesScope: AbstractProjectFileSearchScope,
lookupTracker: LookupTracker?,
providerAndScopeForIncrementalCompilation: ProviderAndScopeForIncrementalCompilation?,
extensionRegistrars: List<FirExtensionRegistrar>,
dependenciesConfigurator: DependencyListForCliModule.Builder.() -> Unit = {},
noinline sessionConfigurator: FirSessionConfigurator.() -> Unit = {},
): FirSession {
@@ -113,6 +114,7 @@ object FirSessionFactory {
sourceScope,
projectEnvironment,
providerAndScopeForIncrementalCompilation,
extensionRegistrars,
languageVersionSettings = languageVersionSettings,
lookupTracker = lookupTracker,
init = sessionConfigurator
@@ -125,6 +127,7 @@ object FirSessionFactory {
scope: AbstractProjectFileSearchScope,
projectEnvironment: AbstractProjectEnvironment,
providerAndScopeForIncrementalCompilation: ProviderAndScopeForIncrementalCompilation?,
extensionRegistrars: List<FirExtensionRegistrar>,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
lookupTracker: LookupTracker? = null,
init: FirSessionConfigurator.() -> Unit = {}
@@ -160,6 +163,9 @@ object FirSessionFactory {
FirSessionConfigurator(this).apply {
registerCommonCheckers()
registerJvmCheckers()
for (extensionRegistrar in extensionRegistrars) {
registerExtensions(extensionRegistrar.configure())
}
init()
}.configure()
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.fir.analysis.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.session.FirSessionFactory
import org.jetbrains.kotlin.js.resolve.JsPlatformAnalyzerServices
@@ -91,6 +92,7 @@ class FirFrontendFacade(
PsiBasedProjectFileSearchScope(librariesScope),
lookupTracker = null,
providerAndScopeForIncrementalCompilation = null,
extensionRegistrars = FirExtensionRegistrar.getInstances(project),
dependenciesConfigurator = {
dependencies(configuration.jvmModularRoots.map { it.toPath() })
dependencies(configuration.jvmClasspathRoots.map { it.toPath() })
@@ -98,6 +98,7 @@ abstract class AbstractFirBaseDiagnosticsTest : BaseDiagnosticsTest() {
librariesScope = PsiBasedProjectFileSearchScope(allProjectScope),
lookupTracker = null,
providerAndScopeForIncrementalCompilation = null,
extensionRegistrars = emptyList()
) {
configureSession()
getFirExtensions()?.let {
@@ -40,6 +40,7 @@ fun createSessionForTests(
librariesScope,
lookupTracker = null,
providerAndScopeForIncrementalCompilation = null,
extensionRegistrars = emptyList(),
dependenciesConfigurator = {
friendDependencies(friendsPaths)
}
@@ -65,6 +66,7 @@ fun createSessionForTests(
PsiBasedProjectFileSearchScope(librariesScope),
lookupTracker = null,
providerAndScopeForIncrementalCompilation = null,
extensionRegistrars = emptyList(),
dependenciesConfigurator = {
friendDependencies(friendsPaths)
}