[FIR2IR] Run IrGenerationExtensions after fir2ir stage

This commit is contained in:
Dmitriy Novozhilov
2021-10-04 13:59:41 +03:00
committed by TeamCityServer
parent b3768a201f
commit fc1f2e9c72
6 changed files with 110 additions and 13 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.analysis
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.fir.FirSession
@@ -45,6 +46,7 @@ class FirAnalyzerFacade(
val languageVersionSettings: LanguageVersionSettings,
val ktFiles: Collection<KtFile> = emptyList(), // may be empty if light tree mode enabled
val originalFiles: Collection<File> = emptyList(), // may be empty if light tree mode disabled
val irGeneratorExtensions: Collection<IrGenerationExtension>,
val useLightTree: Boolean = false,
val enablePluginPhases: Boolean = false,
) : AbstractFirAnalyzerFacade() {
@@ -113,7 +115,8 @@ class FirAnalyzerFacade(
languageVersionSettings, signaturer,
extensions, FirJvmKotlinMangler(session), IrFactoryImpl,
FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider()
Fir2IrJvmSpecialAnnotationSymbolProvider(),
irGeneratorExtensions
)
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.pipeline
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.serialization.JvmIdSignatureDescriptor
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.Fir2IrConverter
@@ -22,7 +23,12 @@ import org.jetbrains.kotlin.ir.backend.jvm.serialization.JvmDescriptorMangler
import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
fun FirSession.convertToIr(scopeSession: ScopeSession, firFiles: List<FirFile>, extensions: GeneratorExtensions): Fir2IrResult {
fun FirSession.convertToIr(
scopeSession: ScopeSession,
firFiles: List<FirFile>,
extensions: GeneratorExtensions,
irGeneratorExtensions: Collection<IrGenerationExtension>
): Fir2IrResult {
val signaturer = JvmIdSignatureDescriptor(JvmDescriptorMangler(null))
val commonFirFiles = moduleData.dependsOnDependencies
@@ -35,6 +41,7 @@ fun FirSession.convertToIr(scopeSession: ScopeSession, firFiles: List<FirFile>,
languageVersionSettings, signaturer,
extensions, FirJvmKotlinMangler(this), IrFactoryImpl,
FirJvmVisibilityConverter,
Fir2IrJvmSpecialAnnotationSymbolProvider()
Fir2IrJvmSpecialAnnotationSymbolProvider(),
irGeneratorExtensions
)
}
@@ -5,11 +5,17 @@
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContextImpl
import org.jetbrains.kotlin.backend.common.ir.BuiltinSymbolsBase
import org.jetbrains.kotlin.config.AnalysisFlags
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.backend.evaluate.evaluateConstants
import org.jetbrains.kotlin.fir.backend.generators.*
import org.jetbrains.kotlin.fir.backend.generators.DataClassMembersGenerator
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
import org.jetbrains.kotlin.fir.declarations.utils.isSynthetic
@@ -19,6 +25,7 @@ import org.jetbrains.kotlin.fir.extensions.declarationGenerators
import org.jetbrains.kotlin.fir.extensions.extensionService
import org.jetbrains.kotlin.fir.extensions.generatedMembers
import org.jetbrains.kotlin.fir.extensions.generatedNestedClassifiers
import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.packageFqName
import org.jetbrains.kotlin.fir.psi
import org.jetbrains.kotlin.fir.resolve.ScopeSession
@@ -28,15 +35,17 @@ import org.jetbrains.kotlin.ir.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
import org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator
import org.jetbrains.kotlin.ir.util.IdSignatureComposer
import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions
import org.jetbrains.kotlin.psi2ir.generators.generateTypicalIrProviderList
import org.jetbrains.kotlin.resolve.BindingContext
class Fir2IrConverter(
private val moduleDescriptor: FirModuleDescriptor,
@@ -308,7 +317,8 @@ class Fir2IrConverter(
mangler: FirMangler,
irFactory: IrFactory,
visibilityConverter: Fir2IrVisibilityConverter,
specialSymbolProvider: Fir2IrSpecialSymbolProvider?
specialSymbolProvider: Fir2IrSpecialSymbolProvider?,
irGenerationExtensions: Collection<IrGenerationExtension>
): Fir2IrResult {
val moduleDescriptor = FirModuleDescriptor(session)
val symbolTable = SymbolTable(signaturer, irFactory)
@@ -375,7 +385,73 @@ class Fir2IrConverter(
evaluateConstants(irModuleFragment)
if (irGenerationExtensions.isNotEmpty()) {
val pluginContext = Fir2IrPluginContext(
languageVersionSettings,
BuiltinSymbolsBase(irBuiltIns, symbolTable),
session.moduleData.platform,
irBuiltIns,
symbolTable
)
for (extension in irGenerationExtensions) {
extension.generate(irModuleFragment, pluginContext)
}
}
return Fir2IrResult(irModuleFragment, symbolTable, components)
}
}
private class Fir2IrPluginContext(
override val languageVersionSettings: LanguageVersionSettings,
override val symbols: BuiltinSymbolsBase,
override val platform: TargetPlatform?,
override val irBuiltIns: IrBuiltIns,
@property:ObsoleteDescriptorBasedAPI
override val symbolTable: SymbolTable
) : IrPluginContext {
@ObsoleteDescriptorBasedAPI
override val moduleDescriptor: ModuleDescriptor
get() = error("Should not be called")
@ObsoleteDescriptorBasedAPI
override val bindingContext: BindingContext
get() = error("Should not be called")
@ObsoleteDescriptorBasedAPI
override val typeTranslator: TypeTranslator
get() = error("Should not be called")
override fun createDiagnosticReporter(pluginId: String): IrMessageLogger {
error("Should not be called")
}
override fun referenceClass(fqName: FqName): IrClassSymbol? {
error("Should not be called")
}
override fun referenceTypeAlias(fqName: FqName): IrTypeAliasSymbol? {
error("Should not be called")
}
override fun referenceConstructors(classFqn: FqName): Collection<IrConstructorSymbol> {
error("Should not be called")
}
override fun referenceFunctions(fqName: FqName): Collection<IrSimpleFunctionSymbol> {
error("Should not be called")
}
override fun referenceProperties(fqName: FqName): Collection<IrPropertySymbol> {
error("Should not be called")
}
override fun referenceTopLevel(
signature: IdSignature,
kind: IrDeserializer.TopLevelSymbolKind,
moduleDescriptor: ModuleDescriptor
): IrSymbol? {
error("Should not be called")
}
}
}