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.java65
1 files changed, 65 insertions, 0 deletions
diff --git a/sources/meta/scalac/ast/MetaTransformer.java b/sources/meta/scalac/ast/MetaTransformer.java
new file mode 100644
index 0000000000..c4f2794851
--- /dev/null
+++ b/sources/meta/scalac/ast/MetaTransformer.java
@@ -0,0 +1,65 @@
+/* ____ ____ ____ ____ ______ *\
+** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
+** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
+** /_____/\____/\___/\____/____/ **
+\* */
+
+// $Id$
+
+package meta.scalac.ast;
+
+import meta.java.Type;
+
+public class MetaTransformer extends AbstractTreeCaseExpander {
+
+ //########################################################################
+ // Public Methods
+
+ public void printTreeCaseBody(TreeNode node) {
+ 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);
+ }
+ writer.println(");");
+ }
+ }
+
+ public void printTransformArrays() {
+ printTransformArrayOf(tree.t_Tree, false);
+ printTransformArrayOf(tree.t_Trees, 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);
+ }
+
+ 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]")+";");
+ 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("return res;");
+ writer.rbrace();
+ writer.rbrace();
+ writer.println("return ts;");
+ writer.rbrace();
+ writer.line();
+ }
+
+ //########################################################################
+}