summaryrefslogtreecommitdiff
path: root/sources/meta/scalac/ast/MetaTransformer.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/meta/scalac/ast/MetaTransformer.java')
-rw-r--r--sources/meta/scalac/ast/MetaTransformer.java62
1 files changed, 37 insertions, 25 deletions
diff --git a/sources/meta/scalac/ast/MetaTransformer.java b/sources/meta/scalac/ast/MetaTransformer.java
index c4f2794851..79ebebaf2f 100644
--- a/sources/meta/scalac/ast/MetaTransformer.java
+++ b/sources/meta/scalac/ast/MetaTransformer.java
@@ -19,40 +19,52 @@ public class MetaTransformer extends AbstractTreeCaseExpander {
if (node.fields == null) {
writer.println("return tree;");
} else {
- writer.print("return copy." + node + "(tree");
- for (int i = 0; i < node.fields.length; i++) {
- writer.print(", ");
- if (Tree.isTree(node.fields[i].type))
- writer.print("transform(" + node.fields[i] + ")");
- else
- writer.print(node.fields[i].name);
+ if (node.hasSymbol()) {
+ writer.print("if (tree.symbol() != null)").lbrace();
+ printTransformNode(node, true);
+ writer.undent().print("} else").lbrace();
}
- writer.println(");");
+ printTransformNode(node, false);
+ if (node.hasSymbol()) writer.rbrace();
}
}
+ public void printTransformNode(TreeNode node, boolean withSymbol) {
+ TreeField[] fields = node.getFields(withSymbol);
+ writer.print("return copy." + node + "(tree");
+ if (withSymbol) writer.print(", tree.symbol()");
+ for (int i = 0; i < fields.length; i++) {
+ writer.print(", ");
+ if (Tree.isTree(fields[i].type))
+ writer.print("transform(" + fields[i].name + ")");
+ else
+ writer.print(fields[i].name);
+ }
+ writer.println(");");
+ }
+
public void printTransformArrays() {
- printTransformArrayOf(tree.t_Tree, false);
- printTransformArrayOf(tree.t_Trees, false);
+ for (int j = 1; j <= tree.arrays; j++)
+ printTransformArray(tree.getType(j), false);
for (int i = 0; i < tree.nodes.length; i++)
- for (int j = 0; j < tree.nodes[i].arrays; j++)
- printTransformArrayOf(tree.nodes[i].getType(j), j == 0);
+ for (int j = 1; j <= tree.nodes[i].arrays; j++)
+ printTransformArray(tree.nodes[i].getType(j), j == 1);
}
- public void printTransformArrayOf(Type type, boolean needCast) {
- String cast = needCast ? "(" + type + ")" : "";
- writer.print("public "+type+"[] transform("+type+"[] ts)");
- writer.lbrace();
- writer.print("for (int i = 0; i < ts.length; i++)");
- writer.lbrace();
- writer.println((needCast?tree.t_Tree:type)+" t = transform(ts[i]);");
- writer.print("if (t != ts[i])");
- writer.lbrace();
- writer.println(type+"[] res = new "+type.newArray("[ts.length]")+";");
+ public void printTransformArray(Type type, boolean needCast) {
+ Type item = type.getItemType();
+ Type erased = needCast ? tree.getType(0) : item;
+ String cast = needCast ? "(" + item + ")" : "";
+ writer.print("public ").print(type).print(" transform").
+ print("(").print(type).print(" ts)").lbrace();
+ writer.print("for (int i = 0; i < ts.length; i++)").lbrace();
+ writer.println(erased + " t = transform(ts[i]);");
+ writer.print("if (t != ts[i])").lbrace();
+ writer.println(type+" res = new "+item.newArray("[ts.length]")+";");
writer.println("System.arraycopy(ts, 0, res, 0, i);");
- writer.println("res[i] = "+cast+"t;");
- writer.println("for (int j = i + 1; j < ts.length; j++)");
- writer.println("res[j] = "+cast+"transform(ts[j]);");
+ writer.println("res[i++] = "+cast+"t;");
+ writer.print("for (; i < ts.length; i++)").
+ println("res[i] = "+cast+"transform(ts[i]);");
writer.println("return res;");
writer.rbrace();
writer.rbrace();