Skip to content

Commit

Permalink
IR tree gen: restore IrWhileLoop children visit order
Browse files Browse the repository at this point in the history
  • Loading branch information
udalov committed Jun 9, 2022
1 parent 3781729 commit 9c27470
Show file tree
Hide file tree
Showing 5 changed files with 12 additions and 3 deletions.
Expand Up @@ -20,12 +20,12 @@ abstract class IrWhileLoop : IrLoop() {
visitor.visitWhileLoop(this, data)

override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
body?.accept(visitor, data)
condition.accept(visitor, data)
body?.accept(visitor, data)
}

override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
body = body?.transform(transformer, data)
condition = condition.transform(transformer, data)
body = body?.transform(transformer, data)
}
}
Expand Up @@ -907,6 +907,7 @@ object IrTree : AbstractTreeBuilder() {
val whileLoop: ElementConfig by element(Expression) {
visitorParent = loop
visitorParam = "loop"
childrenOrderOverride = listOf("condition", "body")

parent(loop)
}
Expand Down
Expand Up @@ -32,6 +32,7 @@ class ElementConfig(
var transform = false
var transformByChildren = false
var transformerReturnType: ElementConfig? = null
var childrenOrderOverride: List<String>? = null

var ownsChildren = true // If false, acceptChildren/transformChildren will NOT be generated.

Expand Down
Expand Up @@ -28,6 +28,7 @@ class Element(
val allParents: List<ClassOrElementRef>
get() = elementParents + otherParents
var isLeaf = false
val childrenOrderOverride: List<String>? = config.childrenOrderOverride
var walkableChildren: List<Field> = emptyList()
val transformableChildren get() = walkableChildren.filter { it.transformable }

Expand Down
Expand Up @@ -221,10 +221,16 @@ private fun addWalkableChildren(elements: List<Element>) {

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 {
val pending = elements.sortedBy { it.elementParents.size }.toMutableSet()
pendingLoop@ while (pending.isNotEmpty()) {
Expand Down

0 comments on commit 9c27470

Please sign in to comment.