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)
if (localDelegatedProperties != null && localDelegatedProperties.isNotEmpty()) {
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 getter: IrFunction
var setter: IrFunction?
override val metadata: MetadataSource.LocalDelegatedProperty?
}
@@ -5,10 +5,7 @@
package org.jetbrains.kotlin.ir.declarations
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.name.Name
interface MetadataSource {
@@ -29,4 +26,7 @@ interface MetadataSource {
open class Function(descriptor: FunctionDescriptor) : DescriptorBased<FunctionDescriptor>(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 =
visitor.visitLocalDelegatedProperty(this, data)
@@ -5,16 +5,14 @@
package org.jetbrains.kotlin.ir.declarations.impl.carriers
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
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.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
interface LocalDelegatedPropertyCarrier : DeclarationCarrier<LocalDelegatedPropertyCarrier> {
var delegateField: IrVariable?
var getterField: IrFunction?
var setterField: IrFunction?
var metadataField: MetadataSource.LocalDelegatedProperty?
override fun clone(): LocalDelegatedPropertyCarrier {
return LocalDelegatedPropertyCarrierImpl(
@@ -24,7 +22,8 @@ interface LocalDelegatedPropertyCarrier : DeclarationCarrier<LocalDelegatedPrope
annotationsField,
delegateField,
getterField,
setterField
setterField,
metadataField
)
}
}
@@ -36,5 +35,6 @@ class LocalDelegatedPropertyCarrierImpl(
override var annotationsField: List<IrConstructorCall>,
override var delegateField: IrVariable?,
override var getterField: IrFunction?,
override var setterField: IrFunction?
override var setterField: IrFunction?,
override var metadataField: MetadataSource.LocalDelegatedProperty?
) : LocalDelegatedPropertyCarrier
@@ -958,7 +958,9 @@ open class SymbolTable(
) {
IrLocalDelegatedPropertyImpl(
startOffset, endOffset, origin, it, nameProvider.nameForDeclaration(descriptor), type, descriptor.isVar
)
).apply {
metadata = MetadataSource.LocalDelegatedProperty(descriptor)
}
}
fun referenceLocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) =