diff options
Diffstat (limited to 'sources/meta/scalac/ast/MetaLazyTreeCopier.java')
-rw-r--r-- | sources/meta/scalac/ast/MetaLazyTreeCopier.java | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/sources/meta/scalac/ast/MetaLazyTreeCopier.java b/sources/meta/scalac/ast/MetaLazyTreeCopier.java index 56ed1e3e00..c389ab9404 100644 --- a/sources/meta/scalac/ast/MetaLazyTreeCopier.java +++ b/sources/meta/scalac/ast/MetaLazyTreeCopier.java @@ -13,26 +13,38 @@ public class MetaLazyTreeCopier extends AbstractTreeMethodExpander { //######################################################################## // Public Methods - public void printTreeMethod(TreeNode node) { - printTreeMethodHeader(node, tree.t_Tree + " tree"); - writer.lbrace(); - writer.println(node.name + " t = (" + node.name + ")tree;"); - if (node.fields.length > 0) { + public void printTreeMethod(TreeNode node, boolean withSymbol) { + TreeField symbol = node.getSymbol(); + node.printMethod(writer, tree.getFormal("tree"), withSymbol).lbrace(); + if (!withSymbol && node.hasLinkedFields()) + writer.println("assert tree.symbol() == null : "+ + "\"tree's symbol is not null\";"); + writer.print(node.getType(0)).print(" t = ("). + print(node.getType(0)).println(")tree;"); + TreeField[] fields = node.getFields(withSymbol); + // !!! why do we copy if there is no symbol and no field + if (withSymbol || node.fields.length > 0) { writer.print("if (").indent(); - for (int i = 0; i < node.fields.length; i++) { - if (i > 0) writer.println(" &&"); - String name = node.fields[i].name; - writer.print("t." + name + " == " + name); + if (withSymbol) writer.print("t.symbol() == " + symbol); + for (int i = 0; i < fields.length; i++) { + if (i > 0 ? true : withSymbol) writer.println(" &&"); + writer.print("t." + fields[i] + " == " + fields[i]); } writer.println(")"); writer.println("return t;").undent(); - writer.print("t = copier." + node.name + "("); - node.printArgs(writer, "tree").println(");"); - writer.println("t.type = tree.type;"); - if (node.hasSymbol())writer.println("t.setSymbol(tree.symbol());"); } - writer.println("return t;"); + writer.print("return copier."); + node.printCall(writer, "tree", withSymbol).println(";"); writer.rbrace(); + + if (withSymbol && node.hasLinkedFields()) { + node.printMethod(writer, tree.getFormal("tree"), false, true); + writer.lbrace(); + symbol.print(writer, true).println(" = tree.symbol();"); + node.printCall(writer.print("return "), "tree", true).println(";"); + writer.rbrace(); + return; + } } //######################################################################## |