[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:
committed by
TeamCityServer
parent
14ee13c72e
commit
ce218b8a0b
+7
-2
@@ -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) {
|
||||
|
||||
+6
-2
@@ -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()
|
||||
|
||||
|
||||
+2
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user