JVM_IR: use MetadataSource for local delegated properties

This commit is contained in:
Georgy Bronnikov
2020-06-23 15:18:30 +03:00
parent 593684ecb6
commit daab07ea38
6 changed files with 28 additions and 12 deletions
@@ -45,7 +45,9 @@ class DescriptorBasedClassCodegen internal constructor(
val localDelegatedProperties = (irClass.attributeOwnerId as? IrClass)?.let(context.localDelegatedProperties::get) val localDelegatedProperties = (irClass.attributeOwnerId as? IrClass)?.let(context.localDelegatedProperties::get)
if (localDelegatedProperties != null && localDelegatedProperties.isNotEmpty()) { if (localDelegatedProperties != null && localDelegatedProperties.isNotEmpty()) {
state.bindingTrace.record( state.bindingTrace.record(
CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA, type, localDelegatedProperties.map { it.descriptor } CodegenBinding.DELEGATED_PROPERTIES_WITH_METADATA,
type,
localDelegatedProperties.mapNotNull { it.owner.metadata?.descriptor }
) )
} }
@@ -35,4 +35,6 @@ interface IrLocalDelegatedProperty :
var delegate: IrVariable var delegate: IrVariable
var getter: IrFunction var getter: IrFunction
var setter: IrFunction? var setter: IrFunction?
override val metadata: MetadataSource.LocalDelegatedProperty?
} }
@@ -5,10 +5,7 @@
package org.jetbrains.kotlin.ir.declarations package org.jetbrains.kotlin.ir.declarations
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface MetadataSource { interface MetadataSource {
@@ -29,4 +26,7 @@ interface MetadataSource {
open class Function(descriptor: FunctionDescriptor) : DescriptorBased<FunctionDescriptor>(descriptor) open class Function(descriptor: FunctionDescriptor) : DescriptorBased<FunctionDescriptor>(descriptor)
open class Property(descriptor: PropertyDescriptor) : DescriptorBased<PropertyDescriptor>(descriptor) open class Property(descriptor: PropertyDescriptor) : DescriptorBased<PropertyDescriptor>(descriptor)
open class LocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) :
DescriptorBased<VariableDescriptorWithAccessors>(descriptor)
} }
@@ -78,6 +78,16 @@ class IrLocalDelegatedPropertyImpl(
} }
} }
override var metadataField: MetadataSource.LocalDelegatedProperty? = null
override var metadata: MetadataSource.LocalDelegatedProperty?
get() = getCarrier().metadataField
set(v) {
if (metadata !== v) {
setCarrier().metadataField = v
}
}
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitLocalDelegatedProperty(this, data) visitor.visitLocalDelegatedProperty(this, data)
@@ -5,16 +5,14 @@
package org.jetbrains.kotlin.ir.declarations.impl.carriers package org.jetbrains.kotlin.ir.declarations.impl.carriers
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
interface LocalDelegatedPropertyCarrier : DeclarationCarrier<LocalDelegatedPropertyCarrier> { interface LocalDelegatedPropertyCarrier : DeclarationCarrier<LocalDelegatedPropertyCarrier> {
var delegateField: IrVariable? var delegateField: IrVariable?
var getterField: IrFunction? var getterField: IrFunction?
var setterField: IrFunction? var setterField: IrFunction?
var metadataField: MetadataSource.LocalDelegatedProperty?
override fun clone(): LocalDelegatedPropertyCarrier { override fun clone(): LocalDelegatedPropertyCarrier {
return LocalDelegatedPropertyCarrierImpl( return LocalDelegatedPropertyCarrierImpl(
@@ -24,7 +22,8 @@ interface LocalDelegatedPropertyCarrier : DeclarationCarrier<LocalDelegatedPrope
annotationsField, annotationsField,
delegateField, delegateField,
getterField, getterField,
setterField setterField,
metadataField
) )
} }
} }
@@ -36,5 +35,6 @@ class LocalDelegatedPropertyCarrierImpl(
override var annotationsField: List<IrConstructorCall>, override var annotationsField: List<IrConstructorCall>,
override var delegateField: IrVariable?, override var delegateField: IrVariable?,
override var getterField: IrFunction?, override var getterField: IrFunction?,
override var setterField: IrFunction? override var setterField: IrFunction?,
override var metadataField: MetadataSource.LocalDelegatedProperty?
) : LocalDelegatedPropertyCarrier ) : LocalDelegatedPropertyCarrier
@@ -958,7 +958,9 @@ open class SymbolTable(
) { ) {
IrLocalDelegatedPropertyImpl( IrLocalDelegatedPropertyImpl(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(descriptor), type, descriptor.isVar startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(descriptor), type, descriptor.isVar
) ).apply {
metadata = MetadataSource.LocalDelegatedProperty(descriptor)
}
} }
fun referenceLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) = fun referenceLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) =