Property accessors are now children of IrProperty.

This commit is contained in:
Dmitry Petrov
2016-08-31 12:52:36 +03:00
committed by Dmitry Petrov
parent ed68b3ecd0
commit 917e7bffbd
39 changed files with 222 additions and 221 deletions
@@ -33,4 +33,6 @@ const val LOOP_CONDITION_SLOT = -2
const val SETTER_ARGUMENT_INDEX = 0
const val TRY_RESULT_SLOT = -1
const val FINALLY_EXPRESSION_SLOT = -2
const val NESTED_INITIALIZERS_SLOT = -1
const val NESTED_INITIALIZERS_SLOT = -1
const val PROPERTY_GETTER_SLOT = -1
const val PROPERTY_SETTER_SLOT = -2
@@ -28,8 +28,6 @@ interface IrProperty : IrDeclaration {
override val declarationKind: IrDeclarationKind
get() = IrDeclarationKind.PROPERTY
fun <D> acceptAccessors(visitor: IrElementVisitor<Unit, D>, data: D)
}
interface IrSimpleProperty : IrProperty {
@@ -49,21 +47,33 @@ abstract class IrPropertyBase(
) : IrDeclarationBase(startOffset, endOffset, origin), IrProperty {
override var getter: IrPropertyGetter? = null
set(newGetter) {
newGetter?.run { assert(property == null) { "$newGetter: should not have a property" } }
newGetter?.property = this
newGetter?.assertDetached()
field?.detach()
field = newGetter
newGetter?.setTreeLocation(this, PROPERTY_GETTER_SLOT)
}
override var setter: IrPropertySetter? = null
set(newSetter) {
newSetter?.run { assert(property == null) { "$newSetter: should not have a property" } }
newSetter?.property = this
newSetter?.assertDetached()
field?.detach()
field = newSetter
newSetter?.setTreeLocation(this, PROPERTY_SETTER_SLOT)
}
override fun <D> acceptAccessors(visitor: IrElementVisitor<Unit, D>, data: D) {
getter?.accept(visitor, data)
setter?.accept(visitor, data)
override fun getChild(slot: Int): IrElement? =
when (slot) {
PROPERTY_GETTER_SLOT -> getter
PROPERTY_SETTER_SLOT -> setter
else -> null
}
override fun replaceChild(slot: Int, newChild: IrElement) {
when (slot) {
PROPERTY_GETTER_SLOT -> getter = newChild.assertCast()
PROPERTY_SETTER_SLOT -> setter = newChild.assertCast()
else -> throwNoSuchSlot(slot)
}
}
}
@@ -85,13 +95,13 @@ class IrSimplePropertyImpl(
override fun getChild(slot: Int): IrElement? =
when (slot) {
INITIALIZER_SLOT -> valueInitializer
else -> null
else -> super.getChild(slot)
}
override fun replaceChild(slot: Int, newChild: IrElement) {
when (slot) {
INITIALIZER_SLOT -> valueInitializer = newChild.assertCast()
else -> throwNoSuchSlot(slot)
else -> super.replaceChild(slot, newChild)
}
}
@@ -100,6 +110,8 @@ class IrSimplePropertyImpl(
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
valueInitializer?.accept(visitor, data)
getter?.accept(visitor, data)
setter?.accept(visitor, data)
}
}
@@ -121,13 +133,13 @@ class IrDelegatedPropertyImpl(
override fun getChild(slot: Int): IrElement? =
when (slot) {
INITIALIZER_SLOT -> delegateInitializer
else -> null
else -> super.getChild(slot)
}
override fun replaceChild(slot: Int, newChild: IrElement) {
when (slot) {
INITIALIZER_SLOT -> delegateInitializer = newChild.assertCast()
else -> throwNoSuchSlot(slot)
else -> super.replaceChild(slot, newChild)
}
}
@@ -136,5 +148,7 @@ class IrDelegatedPropertyImpl(
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
delegateInitializer.accept(visitor, data)
getter?.accept(visitor, data)
setter?.accept(visitor, data)
}
}
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
interface IrPropertyAccessor : IrFunction {
override val descriptor: PropertyAccessorDescriptor
var property: IrProperty?
}
interface IrPropertyGetter : IrPropertyAccessor {
@@ -46,9 +45,7 @@ abstract class IrPropertyAccessorBase(
endOffset: Int,
origin: IrDeclarationOrigin,
body: IrBody
) : IrFunctionBase(startOffset, endOffset, origin, body), IrPropertyAccessor {
override var property: IrProperty? = null
}
) : IrFunctionBase(startOffset, endOffset, origin, body), IrPropertyAccessor
class IrPropertyGetterImpl(
startOffset: Int,
@@ -43,13 +43,13 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
"FUN ${declaration.descriptor.render()}"
override fun visitProperty(declaration: IrProperty, data: Nothing?): String =
"PROPERTY ${declaration.descriptor.render()} getter=${declaration.getter?.name()} setter=${declaration.setter?.name()}"
"PROPERTY ${declaration.descriptor.render()}"
override fun visitPropertyGetter(declaration: IrPropertyGetter, data: Nothing?): String =
"PROPERTY_GETTER ${declaration.descriptor.render()} property=${declaration.property?.name()}"
"PROPERTY_GETTER ${declaration.descriptor.render()}"
override fun visitPropertySetter(declaration: IrPropertySetter, data: Nothing?): String =
"PROPERTY_SETTER ${declaration.descriptor.render()} property=${declaration.property?.name()}"
"PROPERTY_SETTER ${declaration.descriptor.render()}"
override fun visitClass(declaration: IrClass, data: Nothing?): String =
"CLASS ${declaration.descriptor.kind} ${declaration.descriptor.name}"