From daab07ea385534ce31c33bec04262297aff18e38 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Tue, 23 Jun 2020 15:18:30 +0300 Subject: [PATCH] JVM_IR: use MetadataSource for local delegated properties --- .../jvm/codegen/DescriptorBasedClassCodegen.kt | 4 +++- .../ir/declarations/IrLocalDelegatedProperty.kt | 2 ++ .../kotlin/ir/declarations/MetadataSource.kt | 8 ++++---- .../impl/IrLocalDelegatedPropertyImpl.kt | 10 ++++++++++ .../impl/carriers/LocalDelegatedPropertyCarrier.kt | 12 ++++++------ .../src/org/jetbrains/kotlin/ir/util/SymbolTable.kt | 4 +++- 6 files changed, 28 insertions(+), 12 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorBasedClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorBasedClassCodegen.kt index a9ec5787a9d..a414871ddd2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorBasedClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/DescriptorBasedClassCodegen.kt @@ -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 } ) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt index e007b6ec653..fe616ab1ea6 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrLocalDelegatedProperty.kt @@ -35,4 +35,6 @@ interface IrLocalDelegatedProperty : var delegate: IrVariable var getter: IrFunction var setter: IrFunction? + + override val metadata: MetadataSource.LocalDelegatedProperty? } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/MetadataSource.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/MetadataSource.kt index ddb277d438d..93f6ed6df7d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/MetadataSource.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/MetadataSource.kt @@ -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(descriptor) open class Property(descriptor: PropertyDescriptor) : DescriptorBased(descriptor) + + open class LocalDelegatedProperty(descriptor: VariableDescriptorWithAccessors) : + DescriptorBased(descriptor) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt index b8e0054c710..8a97182c510 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrLocalDelegatedPropertyImpl.kt @@ -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 accept(visitor: IrElementVisitor, data: D): R = visitor.visitLocalDelegatedProperty(this, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/carriers/LocalDelegatedPropertyCarrier.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/carriers/LocalDelegatedPropertyCarrier.kt index 6f20315582d..403c74fe9d2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/carriers/LocalDelegatedPropertyCarrier.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/carriers/LocalDelegatedPropertyCarrier.kt @@ -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 { 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, override var delegateField: IrVariable?, override var getterField: IrFunction?, - override var setterField: IrFunction? + override var setterField: IrFunction?, + override var metadataField: MetadataSource.LocalDelegatedProperty? ) : LocalDelegatedPropertyCarrier \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 16674a78e2b..d7fffc6e25e 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -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) =