Mercurial > hg > truffle
diff graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTreeBuilder.java @ 11192:0460c44aef60
Truffle-DSL: CodeTreeBuilder can now remove the previous element even if trees are concatinated at a later time.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Thu, 01 Aug 2013 20:48:56 +0200 |
parents | 4a9936bb03a4 |
children | 189baa5ea5f0 |
line wrap: on
line diff
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTreeBuilder.java Thu Aug 01 20:47:57 2013 +0200 +++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTreeBuilder.java Thu Aug 01 20:48:56 2013 +0200 @@ -97,6 +97,9 @@ private CodeTreeBuilder push(BuilderCodeTree tree) { if (currentElement != null) { + if (!removeLastIfEnqueued(tree)) { + return this; + } currentElement.add(tree); } switch (tree.getCodeKind()) { @@ -110,9 +113,30 @@ return this; } + private boolean removeLastIfEnqueued(BuilderCodeTree tree) { + if (tree.getCodeKind() == REMOVE_LAST) { + return !clearLastRec(tree.removeLast, currentElement.getEnclosedElements()); + } + List<CodeTree> childTree = tree.getEnclosedElements(); + if (!childTree.isEmpty()) { + CodeTree last = childTree.get(0); + if (last instanceof BuilderCodeTree) { + if (!removeLastIfEnqueued((BuilderCodeTree) last)) { + childTree.remove(0); + } + } + } + return true; + } + private void clearLast(CodeTreeKind kind) { if (clearLastRec(kind, currentElement.getEnclosedElements())) { treeCount--; + } else { + // delay clearing the last + BuilderCodeTree tree = new BuilderCodeTree(REMOVE_LAST, null, null); + tree.removeLast = kind; + push(tree); } } @@ -713,6 +737,7 @@ private static class BuilderCodeTree extends CodeTree { private EndCallback atEndListener; + private CodeTreeKind removeLast; public BuilderCodeTree(CodeTreeKind kind, TypeMirror type, String string) { super(kind, type, string);