IR: make DescriptorMetadataSource a subtype of MetadataSource

FirMetadataSource is a metadata source too.
This commit is contained in:
pyos
2020-09-15 13:43:21 +02:00
committed by Alexander Udalov
parent 86cc5840ed
commit a06181771f
18 changed files with 83 additions and 106 deletions
@@ -11,10 +11,10 @@ import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.java.JvmAnnotationNames
@@ -32,11 +32,11 @@ class DescriptorBasedClassCodegen internal constructor(
private val serializerExtension = JvmSerializerExtension(visitor.serializationBindings, state, typeMapper)
private val serializer: DescriptorSerializer? =
when (val metadata = irClass.metadata) {
is MetadataSource.Class -> DescriptorSerializer.create(
is DescriptorMetadataSource.Class -> DescriptorSerializer.create(
metadata.descriptor, serializerExtension, (parentClassCodegen as? DescriptorBasedClassCodegen)?.serializer
)
is MetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension)
is MetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension)
is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension)
is DescriptorMetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension)
else -> null
}
@@ -47,7 +47,7 @@ class DescriptorBasedClassCodegen internal constructor(
state.bindingTrace.record(
CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA,
type,
localDelegatedProperties.mapNotNull { (it.owner.metadata as? MetadataSource.LocalDelegatedProperty)?.descriptor }
localDelegatedProperties.mapNotNull { (it.owner.metadata as? DescriptorMetadataSource.LocalDelegatedProperty)?.descriptor }
)
}
@@ -58,7 +58,7 @@ class DescriptorBasedClassCodegen internal constructor(
}
when (val metadata = irClass.metadata) {
is MetadataSource.Class -> {
is DescriptorMetadataSource.Class -> {
val classProto = serializer!!.classProto(metadata.descriptor).build()
writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) {
AsmUtil.writeAnnotationData(it, serializer, classProto)
@@ -68,7 +68,7 @@ class DescriptorBasedClassCodegen internal constructor(
"JvmPackageName is not supported for classes: ${irClass.render()}"
}
}
is MetadataSource.File -> {
is DescriptorMetadataSource.File -> {
val packageFqName = irClass.getPackageFragment()!!.fqName
val packageProto = serializer!!.packagePartProto(packageFqName, metadata.descriptors)
@@ -88,7 +88,7 @@ class DescriptorBasedClassCodegen internal constructor(
}
}
}
is MetadataSource.Function -> {
is DescriptorMetadataSource.Function -> {
val fakeDescriptor = createFreeFakeLambdaDescriptor(metadata.descriptor, state.typeApproximator)
val functionProto = serializer!!.functionProto(fakeDescriptor)?.build()
writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, extraFlags) {
@@ -116,7 +116,7 @@ class DescriptorBasedClassCodegen internal constructor(
override fun bindMethodMetadata(method: IrFunction, signature: Method) {
when (val metadata = method.metadata) {
is MetadataSource.Property -> {
is DescriptorMetadataSource.Property -> {
// We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods
// moved to DefaultImpls, origin is changed to DEFAULT_IMPLS
// TODO: fix origin somehow, because otherwise $annotations methods in interfaces also don't have ACC_SYNTHETIC
@@ -126,7 +126,7 @@ class DescriptorBasedClassCodegen internal constructor(
JvmSerializationBindings.SYNTHETIC_METHOD_FOR_PROPERTY, metadata.descriptor, signature
)
}
is MetadataSource.Function -> {
is DescriptorMetadataSource.Function -> {
visitor.serializationBindings.put(JvmSerializationBindings.METHOD_FOR_FUNCTION, metadata.descriptor, signature)
}
null -> {
@@ -136,7 +136,7 @@ class DescriptorBasedClassCodegen internal constructor(
}
override fun bindFieldMetadata(field: IrField, fieldType: Type, fieldName: String) {
val descriptor = (field.metadata as? MetadataSource.Property)?.descriptor
val descriptor = (field.metadata as? DescriptorMetadataSource.Property)?.descriptor
if (descriptor != null) {
state.globalSerializationBindings.put(JvmSerializationBindings.FIELD_FOR_PROPERTY, descriptor, fieldType to fieldName)
}
@@ -39,7 +39,6 @@ import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities
import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
import java.util.*
internal val fileClassPhase = makeIrModulePhase(
@@ -67,7 +66,8 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
fileClassMembers.add(it)
}
if (fileClassMembers.isEmpty() && (irFile.metadata as? MetadataSource.File)?.descriptors.isNullOrEmpty()) return
// TODO FirMetadataSource.File
if (fileClassMembers.isEmpty() && (irFile.metadata as? DescriptorMetadataSource.File)?.descriptors.isNullOrEmpty()) return
val irFileClass = createFileClass(irFile, fileClassMembers)
classes.add(irFileClass)
@@ -9,9 +9,9 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.codegen.isOptionalAnnotationClass
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.MetadataSource
internal val processOptionalAnnotationsPhase = makeIrModulePhase(
::ProcessOptionalAnnotations,
@@ -23,7 +23,8 @@ class ProcessOptionalAnnotations(private val context: JvmBackendContext) : FileL
override fun lower(irFile: IrFile) {
for (declaration in irFile.declarations) {
if (declaration !is IrClass || !declaration.isOptionalAnnotationClass()) continue
val metadataSource = (declaration.metadata as? MetadataSource.Class)?.descriptor ?: continue
// TODO FirMetadataSource.Class
val metadataSource = (declaration.metadata as? DescriptorMetadataSource.Class)?.descriptor ?: continue
context.state.factory.packagePartRegistry.optionalAnnotations += metadataSource
}
}
@@ -91,7 +91,7 @@ class ClassGenerator(
startOffset, endOffset, IrDeclarationOrigin.DEFINED, it, classDescriptor,
context.symbolTable.nameProvider.nameForDeclaration(classDescriptor), visibility, modality
).apply {
metadata = MetadataSource.Class(it.descriptor)
metadata = DescriptorMetadataSource.Class(it.descriptor)
}
}.buildWithScope { irClass ->
declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters)
@@ -136,7 +136,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
startOffset, endOffset, origin, it, delegateDescriptor.name, type, delegateDescriptor.visibility,
!delegateDescriptor.isVar, false, delegateDescriptor.dispatchReceiverParameter == null
).apply {
metadata = MetadataSource.Property(propertyDescriptor)
metadata = DescriptorMetadataSource.Property(propertyDescriptor)
}
}.also { irDelegate ->
irDelegate.initializer = generateInitializerBodyForPropertyDelegate(
@@ -260,7 +260,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
visibility, IrUninitializedType, isInline, isEffectivelyExternal(), isPrimary, isExpect
)
}.apply {
metadata = MetadataSource.Function(it.descriptor)
metadata = DescriptorMetadataSource.Function(it.descriptor)
}
}.buildWithScope { irConstructor ->
generateValueParameterDeclarations(irConstructor, ktParametersElement, null)
@@ -17,9 +17,9 @@
package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.backend.common.CodegenUtil
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
import org.jetbrains.kotlin.ir.linkage.IrDeserializer
@@ -91,7 +91,7 @@ class ModuleGenerator(override val context: GeneratorContext) : Generator {
val fileEntry = context.sourceManager.getOrCreateFileEntry(ktFile)
val packageFragmentDescriptor = context.moduleDescriptor.findPackageFragmentForFile(ktFile)!!
val irFile = IrFileImpl(fileEntry, packageFragmentDescriptor).apply {
metadata = MetadataSource.File(CodegenUtil.getMemberDescriptorsToGenerate(ktFile, context.bindingContext))
metadata = DescriptorMetadataSource.File(CodegenUtil.getMemberDescriptorsToGenerate(ktFile, context.bindingContext))
}
context.sourceManager.putFileEntry(irFile, fileEntry)
return irFile
@@ -22,10 +22,10 @@ import org.jetbrains.kotlin.builtins.isKFunctionType
import org.jetbrains.kotlin.builtins.isKSuspendFunctionType
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.*
@@ -350,7 +350,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
adapterFunctionDescriptor.bind(irAdapterFun)
context.symbolTable.withScope(adapterFunctionDescriptor) {
irAdapterFun.metadata = MetadataSource.Function(adapteeDescriptor)
irAdapterFun.metadata = DescriptorMetadataSource.Function(adapteeDescriptor)
irAdapterFun.dispatchReceiverParameter = null
@@ -80,7 +80,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
val irClass = irFactory.createIrClassFromDescriptor(startOffset, endOffset, origin, symbol, descriptor)
symbolTable.withScope(irClass) {
irClass.metadata = MetadataSource.Class(descriptor)
irClass.metadata = DescriptorMetadataSource.Class(descriptor)
generateGlobalTypeParametersDeclarations(irClass, descriptor.declaredTypeParameters)
irClass.superTypes = descriptor.typeConstructor.supertypes.map {
@@ -166,7 +166,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
isEffectivelyExternal(), isPrimary, isExpect
)
}
irConstructor.metadata = MetadataSource.Function(descriptor)
irConstructor.metadata = DescriptorMetadataSource.Function(descriptor)
symbolTable.withScope(irConstructor) {
val ctorTypeParameters = descriptor.typeParameters.filter { it.containingDeclaration === descriptor }
@@ -192,7 +192,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect
)
}
irFunction.metadata = MetadataSource.Function(descriptor)
irFunction.metadata = DescriptorMetadataSource.Function(descriptor)
symbolTable.withScope(descriptor) {
generateOverridenSymbols(irFunction, descriptor.overriddenDescriptors)
@@ -220,7 +220,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
isExpect = descriptor.isExpect
)
irProperty.metadata = MetadataSource.Property(descriptor)
irProperty.metadata = DescriptorMetadataSource.Property(descriptor)
return irProperty
}
@@ -11,21 +11,27 @@ import org.jetbrains.kotlin.name.Name
interface MetadataSource {
val name: Name?
abstract class DescriptorBased<D : DeclarationDescriptor> internal constructor(val descriptor: D) : MetadataSource {
override val name: Name
get() = descriptor.name
}
class Class(descriptor: ClassDescriptor) : DescriptorBased<ClassDescriptor>(descriptor)
open class File(val descriptors: List<DeclarationDescriptor>) : MetadataSource {
override val name: Name?
get() = null
}
class Function(descriptor: FunctionDescriptor) : DescriptorBased<FunctionDescriptor>(descriptor)
class Property(descriptor: PropertyDescriptor) : DescriptorBased<PropertyDescriptor>(descriptor)
class LocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) : DescriptorBased<VariableDescriptorWithAccessors>(descriptor)
interface File : MetadataSource
interface Class : MetadataSource
interface Function : MetadataSource
interface Property : MetadataSource
}
sealed class DescriptorMetadataSource : MetadataSource {
open val descriptor: Named?
get() = null
override val name: Name?
get() = descriptor?.name
class File(val descriptors: List<DeclarationDescriptor>) : DescriptorMetadataSource(), MetadataSource.File
class Class(override val descriptor: ClassDescriptor) : DescriptorMetadataSource(), MetadataSource.Class
class Function(override val descriptor: FunctionDescriptor) : DescriptorMetadataSource(), MetadataSource.Function
class Property(override val descriptor: PropertyDescriptor) : DescriptorMetadataSource(), MetadataSource.Property
class LocalDelegatedProperty(override val descriptor: VariableDescriptorWithAccessors) : DescriptorMetadataSource(),
MetadataSource.Property
}
@@ -589,7 +589,7 @@ class SymbolTable(
visibility ?: it.descriptor.visibility, !it.descriptor.isVar, it.descriptor.isEffectivelyExternal(),
it.descriptor.dispatchReceiverParameter == null
).apply {
metadata = MetadataSource.Property(it.descriptor)
metadata = DescriptorMetadataSource.Property(it.descriptor)
}
}
): IrField =
@@ -662,7 +662,7 @@ class SymbolTable(
isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect
).apply {
metadata = MetadataSource.Property(symbol.descriptor)
metadata = DescriptorMetadataSource.Property(symbol.descriptor)
}
}
): IrProperty =
@@ -978,7 +978,7 @@ class SymbolTable(
{ IrLocalDelegatedPropertySymbolImpl(descriptor) },
factory
).apply {
metadata = MetadataSource.LocalDelegatedProperty(descriptor)
metadata = DescriptorMetadataSource.LocalDelegatedProperty(descriptor)
}
fun referenceLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) =
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
@ObsoleteDescriptorBasedAPI
@@ -25,7 +25,7 @@ fun SymbolTable.declareSimpleFunctionWithOverrides(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(this),
visibility, modality, IrUninitializedType, isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect
).also { declaration ->
declaration.metadata = MetadataSource.Function(this)
declaration.metadata = DescriptorMetadataSource.Function(this)
}
}
}.also { declaration ->