PSI2IR: have GeneratorExtensions implement StubGeneratorExtensions

This commit is contained in:
pyos
2019-12-02 10:44:22 +01:00
committed by Alexander Udalov
parent a950df3c80
commit 65cc0fa463
6 changed files with 21 additions and 46 deletions
@@ -30,9 +30,9 @@ object JvmBackendFacade {
errorHandler: CompilationErrorHandler, errorHandler: CompilationErrorHandler,
phaseConfig: PhaseConfig phaseConfig: PhaseConfig
) { ) {
val extensions = JvmGeneratorExtensions()
val psi2ir = Psi2IrTranslator(state.languageVersionSettings, mangler = JvmMangler) val psi2ir = Psi2IrTranslator(state.languageVersionSettings, mangler = JvmMangler)
val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, extensions = JvmGeneratorExtensions) val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, extensions = extensions)
val extensions = JvmStubGeneratorExtensions()
for (extension in IrGenerationExtension.getInstances(state.project)) { for (extension in IrGenerationExtension.getInstances(state.project)) {
psi2ir.addPostprocessingStep { module -> psi2ir.addPostprocessingStep { module ->
@@ -67,7 +67,7 @@ object JvmBackendFacade {
symbolTable: SymbolTable, symbolTable: SymbolTable,
sourceManager: PsiSourceManager, sourceManager: PsiSourceManager,
phaseConfig: PhaseConfig, phaseConfig: PhaseConfig,
extensions: JvmStubGeneratorExtensions = JvmStubGeneratorExtensions() extensions: JvmGeneratorExtensions
) { ) {
val context = JvmBackendContext( val context = JvmBackendContext(
state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride state, sourceManager, irModuleFragment.irBuiltins, irModuleFragment, symbolTable, phaseConfig, extensions.classNameOverride
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.builders.declarations.buildClass import org.jetbrains.kotlin.ir.builders.declarations.buildClass
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.util.StubGeneratorExtensions
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
@@ -29,7 +28,9 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
object JvmGeneratorExtensions : GeneratorExtensions() { class JvmGeneratorExtensions(private val generateFacades: Boolean = true) : GeneratorExtensions() {
val classNameOverride = mutableMapOf<IrClass, JvmClassName>()
override val samConversion: SamConversion override val samConversion: SamConversion
get() = JvmSamConversion get() = JvmSamConversion
@@ -66,13 +67,6 @@ object JvmGeneratorExtensions : GeneratorExtensions() {
else else
null null
override fun isPropertyWithPlatformField(descriptor: PropertyDescriptor): Boolean =
descriptor.hasJvmFieldAnnotation()
}
class JvmStubGeneratorExtensions : StubGeneratorExtensions() {
val classNameOverride = mutableMapOf<IrClass, JvmClassName>()
override fun computeExternalDeclarationOrigin(descriptor: DeclarationDescriptor): IrDeclarationOrigin? = override fun computeExternalDeclarationOrigin(descriptor: DeclarationDescriptor): IrDeclarationOrigin? =
if (descriptor is JavaCallableMemberDescriptor) if (descriptor is JavaCallableMemberDescriptor)
IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
@@ -80,6 +74,7 @@ class JvmStubGeneratorExtensions : StubGeneratorExtensions() {
IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB
override fun generateFacadeClass(source: DeserializedContainerSource): IrClass? { override fun generateFacadeClass(source: DeserializedContainerSource): IrClass? {
if (!generateFacades) return null
val jvmPackagePartSource = source as? JvmPackagePartSource ?: return null val jvmPackagePartSource = source as? JvmPackagePartSource ?: return null
val facadeName = jvmPackagePartSource.facadeClassName ?: jvmPackagePartSource.className val facadeName = jvmPackagePartSource.facadeClassName ?: jvmPackagePartSource.className
return buildClass { return buildClass {
@@ -41,14 +41,12 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
symbolTable: SymbolTable, symbolTable: SymbolTable,
sourceManager: PsiSourceManager sourceManager: PsiSourceManager
) { ) {
val stubGeneratorExtensions = JvmStubGeneratorExtensions() val extensions = JvmGeneratorExtensions()
val irProviders = generateTypicalIrProviderList( val irProviders = generateTypicalIrProviderList(
irModuleFragment.descriptor, irModuleFragment.irBuiltins, symbolTable, extensions = stubGeneratorExtensions irModuleFragment.descriptor, irModuleFragment.irBuiltins, symbolTable, extensions = extensions
) )
ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies() ExternalDependenciesGenerator(symbolTable, irProviders).generateUnboundSymbolsAsDependencies()
JvmBackendFacade.doGenerateFilesInternal( JvmBackendFacade.doGenerateFilesInternal(state, errorHandler, irModuleFragment, symbolTable, sourceManager, phaseConfig, extensions)
state, errorHandler, irModuleFragment, symbolTable, sourceManager, phaseConfig, stubGeneratorExtensions
)
} }
override fun createPackageCodegen(state: GenerationState, files: Collection<KtFile>, fqName: FqName): PackageCodegen { override fun createPackageCodegen(state: GenerationState, files: Collection<KtFile>, fqName: FqName): PackageCodegen {
@@ -48,17 +48,13 @@ class Psi2IrTranslator(
moduleDescriptor: ModuleDescriptor, moduleDescriptor: ModuleDescriptor,
ktFiles: Collection<KtFile>, ktFiles: Collection<KtFile>,
bindingContext: BindingContext, bindingContext: BindingContext,
generatorExtensions: GeneratorExtensions, generatorExtensions: GeneratorExtensions
stubGeneratorExtensions: StubGeneratorExtensions
): IrModuleFragment { ): IrModuleFragment {
val context = createGeneratorContext(moduleDescriptor, bindingContext, extensions = generatorExtensions) val context = createGeneratorContext(moduleDescriptor, bindingContext, extensions = generatorExtensions)
return generateModuleFragment( val irProviders = generateTypicalIrProviderList(
context, ktFiles, moduleDescriptor, context.irBuiltIns, context.symbolTable, extensions = generatorExtensions
irProviders = generateTypicalIrProviderList(
moduleDescriptor, context.irBuiltIns, context.symbolTable,
extensions = stubGeneratorExtensions
)
) )
return generateModuleFragment(context, ktFiles, irProviders)
} }
fun createGeneratorContext( fun createGeneratorContext(
@@ -8,9 +8,10 @@ package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.util.StubGeneratorExtensions
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
open class GeneratorExtensions { open class GeneratorExtensions : StubGeneratorExtensions() {
open val samConversion: SamConversion open val samConversion: SamConversion
get() = SamConversion get() = SamConversion
@@ -29,6 +30,4 @@ open class GeneratorExtensions {
} }
open fun computeFieldVisibility(descriptor: PropertyDescriptor): Visibility? = null open fun computeFieldVisibility(descriptor: PropertyDescriptor): Visibility? = null
open fun isPropertyWithPlatformField(descriptor: PropertyDescriptor): Boolean = false
} }
@@ -18,17 +18,13 @@ package org.jetbrains.kotlin.ir
import org.jetbrains.kotlin.analyzer.AnalysisResult import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensions import org.jetbrains.kotlin.backend.jvm.JvmGeneratorExtensions
import org.jetbrains.kotlin.backend.jvm.JvmStubGeneratorExtensions
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.codegen.CodegenTestCase import org.jetbrains.kotlin.codegen.CodegenTestCase
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.ir.backend.js.JsGeneratorExtensions import org.jetbrains.kotlin.ir.backend.js.JsGeneratorExtensions
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.StubGeneratorExtensions
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration import org.jetbrains.kotlin.psi2ir.Psi2IrConfiguration
@@ -115,39 +111,30 @@ abstract class AbstractIrGeneratorTestCase : CodegenTestCase() {
moduleDescriptors = emptyList(), moduleDescriptors = emptyList(),
friendModuleDescriptors = emptyList() friendModuleDescriptors = emptyList()
), ),
psi2ir, ktFilesToAnalyze, JsGeneratorExtensions(), StubGeneratorExtensions.EMPTY psi2ir, ktFilesToAnalyze, JsGeneratorExtensions()
) )
fun generateIrModuleWithJvmResolve( fun generateIrModuleWithJvmResolve(
ktFilesToAnalyze: List<KtFile>, environment: KotlinCoreEnvironment, psi2ir: Psi2IrTranslator ktFilesToAnalyze: List<KtFile>, environment: KotlinCoreEnvironment, psi2ir: Psi2IrTranslator
): IrModuleFragment = ): IrModuleFragment =
generateIrModule( generateIrModule(
JvmResolveUtil.analyze(ktFilesToAnalyze, environment), psi2ir, ktFilesToAnalyze, JvmGeneratorExtensions, JvmResolveUtil.analyze(ktFilesToAnalyze, environment), psi2ir, ktFilesToAnalyze,
IrTestStubGeneratorExtensions JvmGeneratorExtensions(generateFacades = false)
) )
private fun generateIrModule( private fun generateIrModule(
analysisResult: AnalysisResult, analysisResult: AnalysisResult,
psi2ir: Psi2IrTranslator, psi2ir: Psi2IrTranslator,
ktFilesToAnalyze: List<KtFile>, ktFilesToAnalyze: List<KtFile>,
generatorExtensions: GeneratorExtensions, generatorExtensions: GeneratorExtensions
stubGeneratorExtensions: StubGeneratorExtensions
): IrModuleFragment { ): IrModuleFragment {
if (!psi2ir.configuration.ignoreErrors) { if (!psi2ir.configuration.ignoreErrors) {
analysisResult.throwIfError() analysisResult.throwIfError()
AnalyzingUtils.throwExceptionOnErrors(analysisResult.bindingContext) AnalyzingUtils.throwExceptionOnErrors(analysisResult.bindingContext)
} }
return psi2ir.generateModule( return psi2ir.generateModule(
analysisResult.moduleDescriptor, ktFilesToAnalyze, analysisResult.bindingContext, generatorExtensions, analysisResult.moduleDescriptor, ktFilesToAnalyze, analysisResult.bindingContext, generatorExtensions
stubGeneratorExtensions
) )
} }
} }
private object IrTestStubGeneratorExtensions : StubGeneratorExtensions() {
private val jvm = JvmStubGeneratorExtensions()
override fun computeExternalDeclarationOrigin(descriptor: DeclarationDescriptor): IrDeclarationOrigin? =
jvm.computeExternalDeclarationOrigin(descriptor)
}
} }