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
@@ -51,7 +51,7 @@ class FirJvmClassCodegen(
private val serializer: FirElementSerializer? = private val serializer: FirElementSerializer? =
when (val metadata = irClass.metadata) { when (val metadata = irClass.metadata) {
is FirMetadataSource.Class -> FirElementSerializer.create( is FirMetadataSource.Class -> FirElementSerializer.create(
metadata.klass, serializerExtension, (parentClassCodegen as? FirJvmClassCodegen)?.serializer metadata.fir, serializerExtension, (parentClassCodegen as? FirJvmClassCodegen)?.serializer
) )
is FirMetadataSource.File -> FirElementSerializer.createTopLevel(session, serializerExtension) is FirMetadataSource.File -> FirElementSerializer.createTopLevel(session, serializerExtension)
is FirMetadataSource.Function -> FirElementSerializer.createForLambda(session, serializerExtension) is FirMetadataSource.Function -> FirElementSerializer.createForLambda(session, serializerExtension)
@@ -107,7 +107,7 @@ class FirJvmClassCodegen(
when (val metadata = irClass.metadata) { when (val metadata = irClass.metadata) {
is FirMetadataSource.Class -> { is FirMetadataSource.Class -> {
val classProto = serializer!!.classProto(metadata.klass).build() val classProto = serializer!!.classProto(metadata.fir).build()
writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) { writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) {
AsmUtil.writeAnnotationData(it, classProto, serializer.stringTable as JvmStringTable) AsmUtil.writeAnnotationData(it, classProto, serializer.stringTable as JvmStringTable)
} }
@@ -118,7 +118,7 @@ class FirJvmClassCodegen(
} }
is FirMetadataSource.File -> { is FirMetadataSource.File -> {
val packageFqName = irClass.getPackageFragment()!!.fqName val packageFqName = irClass.getPackageFragment()!!.fqName
val packageProto = serializer!!.packagePartProto(packageFqName, metadata.file) val packageProto = serializer!!.packagePartProto(packageFqName, metadata.fir)
serializerExtension.serializeJvmPackage(packageProto, type) serializerExtension.serializeJvmPackage(packageProto, type)
@@ -137,7 +137,7 @@ class FirJvmClassCodegen(
} }
} }
is FirMetadataSource.Function -> { is FirMetadataSource.Function -> {
val fakeAnonymousFunction = metadata.function.copyToFreeAnonymousFunction() val fakeAnonymousFunction = metadata.fir.copyToFreeAnonymousFunction()
val functionProto = serializer!!.functionProto(fakeAnonymousFunction)?.build() val functionProto = serializer!!.functionProto(fakeAnonymousFunction)?.build()
writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, extraFlags) { writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, extraFlags) {
if (functionProto != null) { if (functionProto != null) {
@@ -164,18 +164,18 @@ class FirJvmClassCodegen(
override fun bindMethodMetadata(method: IrFunction, signature: Method) { override fun bindMethodMetadata(method: IrFunction, signature: Method) {
when (val metadata = method.metadata) { when (val metadata = method.metadata) {
is FirMetadataSource.Variable -> { is FirMetadataSource.Property -> {
// We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods // We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods
// moved to DefaultImpls, origin is changed to DEFAULT_IMPLS // 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 // TODO: fix origin somehow, because otherwise $annotations methods in interfaces also don't have ACC_SYNTHETIC
assert(method.name.asString().endsWith(JvmAbi.ANNOTATED_PROPERTY_METHOD_NAME_SUFFIX)) { method.dump() } assert(method.name.asString().endsWith(JvmAbi.ANNOTATED_PROPERTY_METHOD_NAME_SUFFIX)) { method.dump() }
state.globalSerializationBindings.put( state.globalSerializationBindings.put(
FirJvmSerializerExtension.SYNTHETIC_METHOD_FOR_FIR_VARIABLE, metadata.variable, signature FirJvmSerializerExtension.SYNTHETIC_METHOD_FOR_FIR_VARIABLE, metadata.fir, signature
) )
} }
is FirMetadataSource.Function -> { is FirMetadataSource.Function -> {
visitor.serializationBindings.put(FirJvmSerializerExtension.METHOD_FOR_FIR_FUNCTION, metadata.function, signature) visitor.serializationBindings.put(FirJvmSerializerExtension.METHOD_FOR_FIR_FUNCTION, metadata.fir, signature)
} }
null -> { null -> {
} }
@@ -188,7 +188,7 @@ class FirJvmClassCodegen(
override fun bindFieldMetadata(field: IrField, fieldType: Type, fieldName: String) { override fun bindFieldMetadata(field: IrField, fieldType: Type, fieldName: String) {
val metadata = field.metadata val metadata = field.metadata
if (metadata is FirMetadataSource.Property) { if (metadata is FirMetadataSource.Property) {
state.globalSerializationBindings.put(FirJvmSerializerExtension.FIELD_FOR_PROPERTY, metadata.property, fieldType to fieldName) state.globalSerializationBindings.put(FirJvmSerializerExtension.FIELD_FOR_PROPERTY, metadata.fir, fieldType to fieldName)
} }
} }
} }
@@ -82,7 +82,7 @@ class FirJvmSerializerExtension @JvmOverloads constructor(
versionRequirementTable: MutableVersionRequirementTable, versionRequirementTable: MutableVersionRequirementTable,
childSerializer: FirElementSerializer childSerializer: FirElementSerializer
) { ) {
assert((irClass.metadata as FirMetadataSource.Class).klass == klass) assert((irClass.metadata as FirMetadataSource.Class).fir == klass)
if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) { if (moduleName != JvmProtoBufUtil.DEFAULT_MODULE_NAME) {
proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName)) proto.setExtension(JvmProtoBuf.classModuleName, stringTable.getStringIndex(moduleName))
} }
@@ -672,7 +672,7 @@ class Fir2IrDeclarationStorage(
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE, isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource = property.containerSource, containerSource = property.containerSource,
).apply { ).apply {
metadata = FirMetadataSource.Variable(property) metadata = FirMetadataSource.Property(property)
convertAnnotationsFromLibrary(property) convertAnnotationsFromLibrary(property)
enterScope(this) enterScope(this)
if (irParent != null) { if (irParent != null) {
@@ -791,7 +791,6 @@ class Fir2IrDeclarationStorage(
isExternal = false, isExternal = false,
isStatic = field.isStatic isStatic = field.isStatic
).apply { ).apply {
metadata = FirMetadataSource.Variable(field)
descriptor.bind(this) descriptor.bind(this)
fieldCache[field] = this fieldCache[field] = this
} }
@@ -98,7 +98,7 @@ class Fir2IrVisitor(
it.accept(this@Fir2IrVisitor, data) as? IrConstructorCall it.accept(this@Fir2IrVisitor, data) as? IrConstructorCall
} }
metadata = FirMetadataSource.File(file, components.session) metadata = FirMetadataSource.File(file)
} }
} }
@@ -10,55 +10,26 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.ir.declarations.MetadataSource import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface FirMetadataSource : MetadataSource { sealed class FirMetadataSource : MetadataSource {
abstract val fir: FirDeclaration
val session: FirSession val session: FirSession
get() = fir.session
class File( override val name: Name?
val file: FirFile, override val session: FirSession get() = when (val fir = fir) {
) : MetadataSource.File(emptyList()), FirMetadataSource is FirConstructor -> Name.special("<init>")
is FirSimpleFunction -> fir.name
is FirRegularClass -> fir.name
is FirProperty -> fir.name
else -> null
}
class Class( class File(override val fir: FirFile) : FirMetadataSource(), MetadataSource.File
val klass: FirClass<*>
) : FirMetadataSource {
override val session: FirSession
get() = klass.session
override val name: Name? class Class(override val fir: FirClass<*>) : FirMetadataSource(), MetadataSource.Class
get() = (klass as? FirRegularClass)?.name
}
class Function( class Function(override val fir: FirFunction<*>) : FirMetadataSource(), MetadataSource.Function
val function: FirFunction<*>
) : FirMetadataSource {
override val session: FirSession
get() = function.session
override val name: Name? class Property(override val fir: FirProperty) : FirMetadataSource(), MetadataSource.Property
get() = when (function) {
is FirSimpleFunction -> function.name
is FirConstructor -> Name.special("<init>")
else -> null
}
}
class Property(
val property: FirProperty
) : FirMetadataSource {
override val session: FirSession
get() = property.session
override val name: Name
get() = property.name
}
class Variable(
val variable: FirVariable<*>
) : FirMetadataSource {
override val session: FirSession
get() = variable.session
override val name: Name
get() = variable.name
}
} }
@@ -11,10 +11,10 @@ import org.jetbrains.kotlin.codegen.*
import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.codegen.binding.CodegenBinding
import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings import org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings
import org.jetbrains.kotlin.codegen.serialization.JvmSerializerExtension 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.IrClass
import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.java.JvmAnnotationNames 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 serializerExtension = JvmSerializerExtension(visitor.serializationBindings, state, typeMapper)
private val serializer: DescriptorSerializer? = private val serializer: DescriptorSerializer? =
when (val metadata = irClass.metadata) { when (val metadata = irClass.metadata) {
is MetadataSource.Class -> DescriptorSerializer.create( is DescriptorMetadataSource.Class -> DescriptorSerializer.create(
metadata.descriptor, serializerExtension, (parentClassCodegen as? DescriptorBasedClassCodegen)?.serializer metadata.descriptor, serializerExtension, (parentClassCodegen as? DescriptorBasedClassCodegen)?.serializer
) )
is MetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension) is DescriptorMetadataSource.File -> DescriptorSerializer.createTopLevel(serializerExtension)
is MetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension) is DescriptorMetadataSource.Function -> DescriptorSerializer.createForLambda(serializerExtension)
else -> null else -> null
} }
@@ -47,7 +47,7 @@ class DescriptorBasedClassCodegen internal constructor(
state.bindingTrace.record( state.bindingTrace.record(
CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA, CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA,
type, 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) { when (val metadata = irClass.metadata) {
is MetadataSource.Class -> { is DescriptorMetadataSource.Class -> {
val classProto = serializer!!.classProto(metadata.descriptor).build() val classProto = serializer!!.classProto(metadata.descriptor).build()
writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) { writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.CLASS, extraFlags) {
AsmUtil.writeAnnotationData(it, serializer, classProto) AsmUtil.writeAnnotationData(it, serializer, classProto)
@@ -68,7 +68,7 @@ class DescriptorBasedClassCodegen internal constructor(
"JvmPackageName is not supported for classes: ${irClass.render()}" "JvmPackageName is not supported for classes: ${irClass.render()}"
} }
} }
is MetadataSource.File -> { is DescriptorMetadataSource.File -> {
val packageFqName = irClass.getPackageFragment()!!.fqName val packageFqName = irClass.getPackageFragment()!!.fqName
val packageProto = serializer!!.packagePartProto(packageFqName, metadata.descriptors) 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 fakeDescriptor = createFreeFakeLambdaDescriptor(metadata.descriptor, state.typeApproximator)
val functionProto = serializer!!.functionProto(fakeDescriptor)?.build() val functionProto = serializer!!.functionProto(fakeDescriptor)?.build()
writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, extraFlags) { writeKotlinMetadata(visitor, state, KotlinClassHeader.Kind.SYNTHETIC_CLASS, extraFlags) {
@@ -116,7 +116,7 @@ class DescriptorBasedClassCodegen internal constructor(
override fun bindMethodMetadata(method: IrFunction, signature: Method) { override fun bindMethodMetadata(method: IrFunction, signature: Method) {
when (val metadata = method.metadata) { 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 // We can't check for JvmLoweredDeclarationOrigin.SYNTHETIC_METHOD_FOR_PROPERTY_ANNOTATIONS because for interface methods
// moved to DefaultImpls, origin is changed to DEFAULT_IMPLS // 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 // 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 JvmSerializationBindings.SYNTHETIC_METHOD_FOR_PROPERTY, metadata.descriptor, signature
) )
} }
is MetadataSource.Function -> { is DescriptorMetadataSource.Function -> {
visitor.serializationBindings.put(JvmSerializationBindings.METHOD_FOR_FUNCTION, metadata.descriptor, signature) visitor.serializationBindings.put(JvmSerializationBindings.METHOD_FOR_FUNCTION, metadata.descriptor, signature)
} }
null -> { null -> {
@@ -136,7 +136,7 @@ class DescriptorBasedClassCodegen internal constructor(
} }
override fun bindFieldMetadata(field: IrField, fieldType: Type, fieldName: String) { 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) { if (descriptor != null) {
state.globalSerializationBindings.put(JvmSerializationBindings.FIELD_FOR_PROPERTY, descriptor, fieldType to fieldName) 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.load.kotlin.PackagePartClassUtils
import org.jetbrains.kotlin.psi2ir.PsiSourceManager import org.jetbrains.kotlin.psi2ir.PsiSourceManager
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
import java.util.* import java.util.*
internal val fileClassPhase = makeIrModulePhase( internal val fileClassPhase = makeIrModulePhase(
@@ -67,7 +66,8 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa
fileClassMembers.add(it) 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) val irFileClass = createFileClass(irFile, fileClassMembers)
classes.add(irFileClass) 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.common.phaser.makeIrModulePhase
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.backend.jvm.codegen.isOptionalAnnotationClass 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.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.MetadataSource
internal val processOptionalAnnotationsPhase = makeIrModulePhase( internal val processOptionalAnnotationsPhase = makeIrModulePhase(
::ProcessOptionalAnnotations, ::ProcessOptionalAnnotations,
@@ -23,7 +23,8 @@ class ProcessOptionalAnnotations(private val context: JvmBackendContext) : FileL
override fun lower(irFile: IrFile) { override fun lower(irFile: IrFile) {
for (declaration in irFile.declarations) { for (declaration in irFile.declarations) {
if (declaration !is IrClass || !declaration.isOptionalAnnotationClass()) continue 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 context.state.factory.packagePartRegistry.optionalAnnotations += metadataSource
} }
} }
@@ -91,7 +91,7 @@ class ClassGenerator(
startOffset, endOffset, IrDeclarationOrigin.DEFINED, it, classDescriptor, startOffset, endOffset, IrDeclarationOrigin.DEFINED, it, classDescriptor,
context.symbolTable.nameProvider.nameForDeclaration(classDescriptor), visibility, modality context.symbolTable.nameProvider.nameForDeclaration(classDescriptor), visibility, modality
).apply { ).apply {
metadata = MetadataSource.Class(it.descriptor) metadata = DescriptorMetadataSource.Class(it.descriptor)
} }
}.buildWithScope { irClass -> }.buildWithScope { irClass ->
declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters) declarationGenerator.generateGlobalTypeParametersDeclarations(irClass, classDescriptor.declaredTypeParameters)
@@ -136,7 +136,7 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D
startOffset, endOffset, origin, it, delegateDescriptor.name, type, delegateDescriptor.visibility, startOffset, endOffset, origin, it, delegateDescriptor.name, type, delegateDescriptor.visibility,
!delegateDescriptor.isVar, false, delegateDescriptor.dispatchReceiverParameter == null !delegateDescriptor.isVar, false, delegateDescriptor.dispatchReceiverParameter == null
).apply { ).apply {
metadata = MetadataSource.Property(propertyDescriptor) metadata = DescriptorMetadataSource.Property(propertyDescriptor)
} }
}.also { irDelegate -> }.also { irDelegate ->
irDelegate.initializer = generateInitializerBodyForPropertyDelegate( irDelegate.initializer = generateInitializerBodyForPropertyDelegate(
@@ -260,7 +260,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
visibility, IrUninitializedType, isInline, isEffectivelyExternal(), isPrimary, isExpect visibility, IrUninitializedType, isInline, isEffectivelyExternal(), isPrimary, isExpect
) )
}.apply { }.apply {
metadata = MetadataSource.Function(it.descriptor) metadata = DescriptorMetadataSource.Function(it.descriptor)
} }
}.buildWithScope { irConstructor -> }.buildWithScope { irConstructor ->
generateValueParameterDeclarations(irConstructor, ktParametersElement, null) generateValueParameterDeclarations(irConstructor, ktParametersElement, null)
@@ -17,9 +17,9 @@
package org.jetbrains.kotlin.psi2ir.generators package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.backend.common.CodegenUtil 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.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment 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.IrFileImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl
import org.jetbrains.kotlin.ir.linkage.IrDeserializer 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 fileEntry = context.sourceManager.getOrCreateFileEntry(ktFile)
val packageFragmentDescriptor = context.moduleDescriptor.findPackageFragmentForFile(ktFile)!! val packageFragmentDescriptor = context.moduleDescriptor.findPackageFragmentForFile(ktFile)!!
val irFile = IrFileImpl(fileEntry, packageFragmentDescriptor).apply { 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) context.sourceManager.putFileEntry(irFile, fileEntry)
return irFile return irFile
@@ -22,10 +22,10 @@ import org.jetbrains.kotlin.builtins.isKFunctionType
import org.jetbrains.kotlin.builtins.isKSuspendFunctionType import org.jetbrains.kotlin.builtins.isKSuspendFunctionType
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrStatement 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.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrValueParameter 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.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.*
@@ -350,7 +350,7 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
adapterFunctionDescriptor.bind(irAdapterFun) adapterFunctionDescriptor.bind(irAdapterFun)
context.symbolTable.withScope(adapterFunctionDescriptor) { context.symbolTable.withScope(adapterFunctionDescriptor) {
irAdapterFun.metadata = MetadataSource.Function(adapteeDescriptor) irAdapterFun.metadata = DescriptorMetadataSource.Function(adapteeDescriptor)
irAdapterFun.dispatchReceiverParameter = null irAdapterFun.dispatchReceiverParameter = null
@@ -80,7 +80,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
val irClass = irFactory.createIrClassFromDescriptor(startOffset, endOffset, origin, symbol, descriptor) val irClass = irFactory.createIrClassFromDescriptor(startOffset, endOffset, origin, symbol, descriptor)
symbolTable.withScope(irClass) { symbolTable.withScope(irClass) {
irClass.metadata = MetadataSource.Class(descriptor) irClass.metadata = DescriptorMetadataSource.Class(descriptor)
generateGlobalTypeParametersDeclarations(irClass, descriptor.declaredTypeParameters) generateGlobalTypeParametersDeclarations(irClass, descriptor.declaredTypeParameters)
irClass.superTypes = descriptor.typeConstructor.supertypes.map { irClass.superTypes = descriptor.typeConstructor.supertypes.map {
@@ -166,7 +166,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
isEffectivelyExternal(), isPrimary, isExpect isEffectivelyExternal(), isPrimary, isExpect
) )
} }
irConstructor.metadata = MetadataSource.Function(descriptor) irConstructor.metadata = DescriptorMetadataSource.Function(descriptor)
symbolTable.withScope(irConstructor) { symbolTable.withScope(irConstructor) {
val ctorTypeParameters = descriptor.typeParameters.filter { it.containingDeclaration === descriptor } 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 isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect
) )
} }
irFunction.metadata = MetadataSource.Function(descriptor) irFunction.metadata = DescriptorMetadataSource.Function(descriptor)
symbolTable.withScope(descriptor) { symbolTable.withScope(descriptor) {
generateOverridenSymbols(irFunction, descriptor.overriddenDescriptors) generateOverridenSymbols(irFunction, descriptor.overriddenDescriptors)
@@ -220,7 +220,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
isExpect = descriptor.isExpect isExpect = descriptor.isExpect
) )
irProperty.metadata = MetadataSource.Property(descriptor) irProperty.metadata = DescriptorMetadataSource.Property(descriptor)
return irProperty return irProperty
} }
@@ -11,21 +11,27 @@ import org.jetbrains.kotlin.name.Name
interface MetadataSource { interface MetadataSource {
val name: Name? val name: Name?
abstract class DescriptorBased<D : DeclarationDescriptor> internal constructor(val descriptor: D) : MetadataSource { interface File : MetadataSource
override val name: Name interface Class : MetadataSource
get() = descriptor.name interface Function : MetadataSource
} interface Property : MetadataSource
}
class Class(descriptor: ClassDescriptor) : DescriptorBased<ClassDescriptor>(descriptor)
sealed class DescriptorMetadataSource : MetadataSource {
open class File(val descriptors: List<DeclarationDescriptor>) : MetadataSource { open val descriptor: Named?
override val name: Name? get() = null
get() = null
} override val name: Name?
get() = descriptor?.name
class Function(descriptor: FunctionDescriptor) : DescriptorBased<FunctionDescriptor>(descriptor)
class File(val descriptors: List<DeclarationDescriptor>) : DescriptorMetadataSource(), MetadataSource.File
class Property(descriptor: PropertyDescriptor) : DescriptorBased<PropertyDescriptor>(descriptor)
class Class(override val descriptor: ClassDescriptor) : DescriptorMetadataSource(), MetadataSource.Class
class LocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) : DescriptorBased<VariableDescriptorWithAccessors>(descriptor)
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(), visibility ?: it.descriptor.visibility, !it.descriptor.isVar, it.descriptor.isEffectivelyExternal(),
it.descriptor.dispatchReceiverParameter == null it.descriptor.dispatchReceiverParameter == null
).apply { ).apply {
metadata = MetadataSource.Property(it.descriptor) metadata = DescriptorMetadataSource.Property(it.descriptor)
} }
} }
): IrField = ): IrField =
@@ -662,7 +662,7 @@ class SymbolTable(
isExternal = descriptor.isEffectivelyExternal(), isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect isExpect = descriptor.isExpect
).apply { ).apply {
metadata = MetadataSource.Property(symbol.descriptor) metadata = DescriptorMetadataSource.Property(symbol.descriptor)
} }
} }
): IrProperty = ): IrProperty =
@@ -978,7 +978,7 @@ class SymbolTable(
{ IrLocalDelegatedPropertySymbolImpl(descriptor) }, { IrLocalDelegatedPropertySymbolImpl(descriptor) },
factory factory
).apply { ).apply {
metadata = MetadataSource.LocalDelegatedProperty(descriptor) metadata = DescriptorMetadataSource.LocalDelegatedProperty(descriptor)
} }
fun referenceLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) = fun referenceLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) =
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI 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.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.MetadataSource
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
@@ -25,7 +25,7 @@ fun SymbolTable.declareSimpleFunctionWithOverrides(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(this), startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(this),
visibility, modality, IrUninitializedType, isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect visibility, modality, IrUninitializedType, isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect
).also { declaration -> ).also { declaration ->
declaration.metadata = MetadataSource.Function(this) declaration.metadata = DescriptorMetadataSource.Function(this)
} }
} }
}.also { declaration -> }.also { declaration ->
@@ -123,7 +123,7 @@ class ParcelableIrTransformer(private val context: IrPluginContext, private val
irExprBody(irInt(flags)) irExprBody(irInt(flags))
} }
metadata = MetadataSource.Function( metadata = DescriptorMetadataSource.Function(
declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.DESCRIBE_CONTENTS)!! declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.DESCRIBE_CONTENTS)!!
) )
} }
@@ -178,7 +178,7 @@ class ParcelableIrTransformer(private val context: IrPluginContext, private val
} }
} }
metadata = MetadataSource.Function( metadata = DescriptorMetadataSource.Function(
declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.WRITE_TO_PARCEL)!! declaration.descriptor.findFunction(ParcelableSyntheticComponent.ComponentKind.WRITE_TO_PARCEL)!!
) )
} }