IR tree gen: restore IrWhileLoop children visit order
This commit is contained in:
committed by
Alexander Udalov
parent
bf5ab49342
commit
f003f19e1d
@@ -20,12 +20,12 @@ abstract class IrWhileLoop : IrLoop() {
|
|||||||
visitor.visitWhileLoop(this, data)
|
visitor.visitWhileLoop(this, data)
|
||||||
|
|
||||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||||
body?.accept(visitor, data)
|
|
||||||
condition.accept(visitor, data)
|
condition.accept(visitor, data)
|
||||||
|
body?.accept(visitor, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
|
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
|
||||||
body = body?.transform(transformer, data)
|
|
||||||
condition = condition.transform(transformer, data)
|
condition = condition.transform(transformer, data)
|
||||||
|
body = body?.transform(transformer, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -911,6 +911,7 @@ object IrTree : AbstractTreeBuilder() {
|
|||||||
val whileLoop: ElementConfig by element(Expression) {
|
val whileLoop: ElementConfig by element(Expression) {
|
||||||
visitorParent = loop
|
visitorParent = loop
|
||||||
visitorParam = "loop"
|
visitorParam = "loop"
|
||||||
|
childrenOrderOverride = listOf("condition", "body")
|
||||||
|
|
||||||
parent(loop)
|
parent(loop)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -32,6 +32,7 @@ class ElementConfig(
|
|||||||
var transform = false
|
var transform = false
|
||||||
var transformByChildren = false
|
var transformByChildren = false
|
||||||
var transformerReturnType: ElementConfig? = null
|
var transformerReturnType: ElementConfig? = null
|
||||||
|
var childrenOrderOverride: List<String>? = null
|
||||||
|
|
||||||
var ownsChildren = true // If false, acceptChildren/transformChildren will NOT be generated.
|
var ownsChildren = true // If false, acceptChildren/transformChildren will NOT be generated.
|
||||||
|
|
||||||
|
|||||||
+1
@@ -28,6 +28,7 @@ class Element(
|
|||||||
val allParents: List<ClassOrElementRef>
|
val allParents: List<ClassOrElementRef>
|
||||||
get() = elementParents + otherParents
|
get() = elementParents + otherParents
|
||||||
var isLeaf = false
|
var isLeaf = false
|
||||||
|
val childrenOrderOverride: List<String>? = config.childrenOrderOverride
|
||||||
var walkableChildren: List<Field> = emptyList()
|
var walkableChildren: List<Field> = emptyList()
|
||||||
val transformableChildren get() = walkableChildren.filter { it.transformable }
|
val transformableChildren get() = walkableChildren.filter { it.transformable }
|
||||||
|
|
||||||
|
|||||||
+7
-1
@@ -223,10 +223,16 @@ private fun addWalkableChildren(elements: List<Element>) {
|
|||||||
|
|
||||||
element.fields.filter { it.isChild }.associateByTo(walkableChildren) { it.name }
|
element.fields.filter { it.isChild }.associateByTo(walkableChildren) { it.name }
|
||||||
|
|
||||||
element.walkableChildren = walkableChildren.values.toList()
|
element.walkableChildren = reorderIfNecessary(walkableChildren.values.toList(), element.childrenOrderOverride)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun reorderIfNecessary(fields: List<Field>, order: List<String>?): List<Field> =
|
||||||
|
if (order == null) fields else fields.sortedBy {
|
||||||
|
val position = order.indexOf(it.name)
|
||||||
|
if (position < 0) order.size else position
|
||||||
|
}
|
||||||
|
|
||||||
private fun iterateElementsParentFirst(elements: List<Element>) = sequence {
|
private fun iterateElementsParentFirst(elements: List<Element>) = sequence {
|
||||||
val pending = elements.sortedBy { it.elementParents.size }.toMutableSet()
|
val pending = elements.sortedBy { it.elementParents.size }.toMutableSet()
|
||||||
pendingLoop@ while (pending.isNotEmpty()) {
|
pendingLoop@ while (pending.isNotEmpty()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user