diff --git a/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrWhileLoop.kt b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrWhileLoop.kt index 080c032a65a12..572ffc87a4962 100644 --- a/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrWhileLoop.kt +++ b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrWhileLoop.kt @@ -20,12 +20,12 @@ abstract class IrWhileLoop : IrLoop() { visitor.visitWhileLoop(this, data) override fun acceptChildren(visitor: IrElementVisitor, data: D) { - body?.accept(visitor, data) condition.accept(visitor, data) + body?.accept(visitor, data) } override fun transformChildren(transformer: IrElementTransformer, data: D) { - body = body?.transform(transformer, data) condition = condition.transform(transformer, data) + body = body?.transform(transformer, data) } } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt index d414de8d1bf5e..6b2b4d484dc32 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt @@ -911,6 +911,7 @@ object IrTree : AbstractTreeBuilder() { val whileLoop: ElementConfig by element(Expression) { visitorParent = loop visitorParam = "loop" + childrenOrderOverride = listOf("condition", "body") parent(loop) } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt index defc12511aa16..77e7e4d1ad807 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/config/ConfigModel.kt @@ -32,6 +32,7 @@ class ElementConfig( var transform = false var transformByChildren = false var transformerReturnType: ElementConfig? = null + var childrenOrderOverride: List? = null var ownsChildren = true // If false, acceptChildren/transformChildren will NOT be generated. diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt index 71acdf64a8faf..6a449d91ed232 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Model.kt @@ -28,6 +28,7 @@ class Element( val allParents: List get() = elementParents + otherParents var isLeaf = false + val childrenOrderOverride: List? = config.childrenOrderOverride var walkableChildren: List = emptyList() val transformableChildren get() = walkableChildren.filter { it.transformable } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt index 93970d8b16c6e..026b6438a15b7 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/model/Transformations.kt @@ -223,10 +223,16 @@ private fun addWalkableChildren(elements: List) { 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, order: List?): List = + 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) = sequence { val pending = elements.sortedBy { it.elementParents.size }.toMutableSet() pendingLoop@ while (pending.isNotEmpty()) {