[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
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.cli.jvm.compiler
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
import org.jetbrains.kotlin.asJava.FilteredJvmDiagnostics
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
@@ -100,7 +101,8 @@ object FirKotlinToJvmBytecodeCompiler {
performanceManager,
targetIds,
incrementalComponents,
extendedAnalysisMode
extendedAnalysisMode,
(projectEnvironment as? PsiBasedProjectEnvironment)?.project?.let { IrGenerationExtension.getInstances(it) } ?: emptyList()
)
val generationState = context.compileModule() ?: return false
outputs[module] = generationState
@@ -134,7 +136,7 @@ object FirKotlinToJvmBytecodeCompiler {
performanceManager?.notifyIRTranslationStarted()
val extensions = JvmGeneratorExtensionsImpl(moduleConfiguration)
val fir2IrResult = firResult.session.convertToIr(firResult.scopeSession, firResult.fir, extensions)
val fir2IrResult = firResult.session.convertToIr(firResult.scopeSession, firResult.fir, extensions, irGenerationExtensions)
performanceManager?.notifyIRTranslationFinished()
@@ -341,7 +343,8 @@ object FirKotlinToJvmBytecodeCompiler {
val performanceManager: CommonCompilerPerformanceManager?,
val targetIds: List<TargetId>?,
val incrementalComponents: IncrementalCompilationComponents?,
val extendedAnalysisMode: Boolean
val extendedAnalysisMode: Boolean,
val irGenerationExtensions: Collection<IrGenerationExtension>
)
private fun findMainClass(firResult: FirResult): FqName? {
@@ -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")
}
}
}
@@ -11,13 +11,13 @@ import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.ProjectScope
import org.jetbrains.kotlin.analyzer.common.CommonPlatformAnalyzerServices
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.cli.jvm.compiler.PsiBasedProjectEnvironment
import org.jetbrains.kotlin.cli.jvm.compiler.PsiBasedProjectFileSearchScope
import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM
import org.jetbrains.kotlin.cli.jvm.config.jvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.jvmModularRoots
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.FirAnalyzerFacade
import org.jetbrains.kotlin.fir.checkers.registerExtendedCommonCheckers
import org.jetbrains.kotlin.fir.moduleData
@@ -116,6 +116,7 @@ class FirFrontendFacade(
languageVersionSettings,
ktFiles,
originalFiles,
IrGenerationExtension.getInstances(project),
lightTreeEnabled,
enablePluginPhases
)
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ObsoleteTestInfrastructure
import org.jetbrains.kotlin.TestsCompiletimeError
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.asJava.finder.JavaElementFinder
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensionsImpl
import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory
import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
@@ -105,7 +106,13 @@ object GenerationUtils {
val session = createSessionForTests(project, scope, librariesScope, "main", getPackagePartProvider = packagePartProvider)
// TODO: add running checkers and check that it's safe to compile
val firAnalyzerFacade = FirAnalyzerFacade(session, configuration.languageVersionSettings, files)
val firAnalyzerFacade = FirAnalyzerFacade(
session,
configuration.languageVersionSettings,
files,
emptyList(),
IrGenerationExtension.getInstances(project)
)
val extensions = JvmGeneratorExtensionsImpl(configuration)
val (moduleFragment, symbolTable, components) = firAnalyzerFacade.convertToIr(extensions)
val dummyBindingContext = NoScopeRecordCliBindingTrace().bindingContext