changeset 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 c7d9ff67beed
children 6879565ee10b
files graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTreeBuilder.java graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTreeKind.java
diffstat 2 files changed, 26 insertions(+), 1 deletions(-) [+]
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);
--- a/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTreeKind.java	Thu Aug 01 20:47:57 2013 +0200
+++ b/graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/ast/CodeTreeKind.java	Thu Aug 01 20:48:56 2013 +0200
@@ -23,5 +23,5 @@
 package com.oracle.truffle.dsl.processor.ast;
 
 public enum CodeTreeKind {
-    STATIC_FIELD_REFERENCE, STATIC_METHOD_REFERENCE, GROUP, COMMA_GROUP, INDENT, STRING, NEW_LINE, TYPE;
+    STATIC_FIELD_REFERENCE, STATIC_METHOD_REFERENCE, GROUP, COMMA_GROUP, REMOVE_LAST, INDENT, STRING, NEW_LINE, TYPE;
 }