summaryrefslogtreecommitdiff
path: root/sources/meta/scalac/ast/TreeNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'sources/meta/scalac/ast/TreeNode.java')
-rw-r--r--sources/meta/scalac/ast/TreeNode.java191
1 files changed, 133 insertions, 58 deletions
diff --git a/sources/meta/scalac/ast/TreeNode.java b/sources/meta/scalac/ast/TreeNode.java
index 5a985bc3ae..340eaa8109 100644
--- a/sources/meta/scalac/ast/TreeNode.java
+++ b/sources/meta/scalac/ast/TreeNode.java
@@ -44,30 +44,7 @@ public class TreeNode {
}
//########################################################################
- // Public Methods
-
- public boolean hasExtClass() {
- return hasSymbol();
- }
-
- public boolean hasSymbol() {
- return symbol == symbol.HasSym || symbol == symbol.DefSym;
- }
-
- public boolean hasLinkedFields() {
- for (int i = 0; i < fields.length; i++)
- if (fields[i].link != null) return true;
- return false;
- }
-
- public boolean definesSymbol() {
- return symbol == symbol.DefSym;
- }
-
- public Type getType(int rank) {
- arrays = Math.max(arrays , rank);
- return rank == 0 ? TreeType.Node(this) : Type.Array(getType(rank - 1));
- }
+ // Public Methods - Initializing
public TreeNode setDescription(String description) {
this.description = description;
@@ -90,9 +67,8 @@ public class TreeNode {
}
public TreeNode addField(Type type, String name, TreeFieldLink link) {
- if (link != null)
- if (symbol != TreeSymbol.HasSym && symbol != TreeSymbol.DefSym)
- throw new Error("node "+this+" may not have linked fields");
+ if (link != null && !hasSymbol())
+ throw new Error("node "+this+" may not have linked fields");
TreeField[] array = new TreeField[fields.length + 1];
for (int i = 0; i < fields.length; i++) array[i] = fields[i];
array[fields.length] = new TreeField(type, name, link);
@@ -100,52 +76,60 @@ public class TreeNode {
return this;
}
- public JavaWriter printCase(JavaWriter writer, boolean wildcards) {
- writer.print("case ").print(name);
- if (fields!=null) printParams(writer.print("("),wildcards).print(")");
- return writer.print(":").space();
- }
+ //########################################################################
+ // Public Methods - Querying
- public JavaWriter printParams(JavaWriter writer) {
- return printParams(writer, false);
+ public Type getType(int rank) {
+ arrays = Math.max(arrays , rank);
+ return rank == 0 ? TreeType.Node(this) : Type.Array(getType(rank - 1));
}
- public JavaWriter printParams(JavaWriter writer, String prefix) {
- return printParams(printPrefix(writer, prefix));
+ public boolean hasExtClass() {
+ return hasSymbol();
}
- public JavaWriter printParams(JavaWriter writer, boolean wildcards) {
- if (fields != null) for (int i = 0; i < fields.length; i++) {
- if (i > 0) writer.print(", ");
- if (wildcards) writer.print("_");
- else writer.print(fields[i].type).space().print(fields[i].name);
+ public boolean hasSymbol() {
+ switch (symbol) {
+ case TreeSymbol.HasSym(_, _):
+ return true;
+ default:
+ return false;
}
- return writer;
}
- public JavaWriter printArgs(JavaWriter writer) {
- if (fields != null) for (int i = 0; i < fields.length; i++) {
- if (i > 0) writer.print(", ");
- writer.print(fields[i].name);
+ public boolean definesSymbol() {
+ switch (symbol) {
+ case TreeSymbol.HasSym(_, true):
+ return true;
+ default:
+ return false;
}
- return writer;
}
- public JavaWriter printArgs(JavaWriter writer, String prefix) {
- return printArgs(printPrefix(writer, prefix));
+ public TreeField getSymbol() {
+ switch (symbol) {
+ case TreeSymbol.HasSym(TreeField field, _):
+ return field;
+ default:
+ return null;
+ }
}
- public JavaWriter printPrefix(JavaWriter writer, String prefix) {
- if (prefix != null) {
- writer.print(prefix);
- if (fields != null && fields.length > 0) writer.print(", ");
- }
- return writer;
+ public boolean hasLinkedFields() {
+ for (int i = 0; i < fields.length; i++)
+ if (fields[i].link != null) return true;
+ return false;
}
- public JavaWriter printNew(JavaWriter writer) {
- String classname = (hasExtClass() ? "Ext" : "") + name;
- return printArgs(writer.print("new " + classname + "(")).print(")");
+ public TreeField[] getFields(boolean withoutLinkedFields) {
+ if (fields == null || !withoutLinkedFields) return fields;
+ int count = 0;;
+ for (int i = 0; i < fields.length; i++)
+ if (fields[i].link == null) count++;
+ TreeField[] array = new TreeField[count];
+ for (int i = 0, j = 0; i < fields.length; i++)
+ if (fields[i].link == null) array[j++] = fields[i];
+ return array;
}
public String toString() {
@@ -153,4 +137,95 @@ public class TreeNode {
}
//########################################################################
+ // Public Methods - Printing
+
+ public JavaWriter printCase(JavaWriter writer, boolean withWildcards) {
+ writer.print("case ");
+ if (fields != null && withWildcards) {
+ writer.print(name).print('(');
+ for (int i = 0; i < fields.length; i++) {
+ if (i > 0) writer.print(", ");
+ writer.print("_");
+ }
+ writer.print(')');
+ } else {
+ printDecl(writer, null, false);
+ }
+ return writer.print(":").space();
+ }
+
+ public JavaWriter printNew(JavaWriter writer, boolean withSymbol) {
+ writer.print("new ");
+ if (hasExtClass()) writer.print("Ext");
+ return printCall(writer, null, withSymbol);
+ }
+
+ public JavaWriter printMethod(JavaWriter writer, String prefix,
+ boolean withSymbol)
+ {
+ return printMethod(writer, prefix, withSymbol, withSymbol);
+ }
+
+ public JavaWriter printMethod(JavaWriter writer, String prefix,
+ boolean withSymbol, boolean withoutLinkedFields)
+ {
+ writer.print("public ").print(name).space();
+ return printDecl(writer, prefix, withSymbol, withoutLinkedFields);
+ }
+
+ public JavaWriter printDecl(JavaWriter writer, String prefix,
+ boolean withSymbol)
+ {
+ return printDecl(writer, prefix, withSymbol, withSymbol);
+ }
+
+ public JavaWriter printDecl(JavaWriter writer, String prefix,
+ boolean withSymbol, boolean withoutLinkedFields)
+ {
+ return printPattern(writer,true,prefix,withSymbol,withoutLinkedFields);
+ }
+
+ public JavaWriter printCall(JavaWriter writer, String prefix,
+ boolean withSymbol)
+ {
+ return printCall(writer, prefix, withSymbol, withSymbol);
+ }
+
+ public JavaWriter printCall(JavaWriter writer, String prefix,
+ boolean withSymbol, boolean withoutLinkedFields)
+ {
+ return printPattern(
+ writer, false, prefix, withSymbol, withoutLinkedFields);
+ }
+
+ public JavaWriter printPattern(JavaWriter writer, boolean withType,
+ String prefix, boolean withSymbol, boolean withoutLinkedFields)
+ {
+ writer.print(name);
+ if (fields != null || prefix != null || withSymbol) {
+ writer.print('(');
+ printFields(writer,withType,prefix,withSymbol,withoutLinkedFields);
+ writer.print(')');
+ }
+ return writer;
+ }
+
+ public JavaWriter printFields(JavaWriter writer, boolean withType,
+ String prefix, boolean withSymbol, boolean withoutLinkedFields)
+ {
+ TreeField[] fields = getFields(withoutLinkedFields);
+ if (prefix != null) {
+ writer.print(prefix);
+ if (withSymbol || (fields != null && fields.length > 0))
+ writer.print(", ");
+ }
+ if (withSymbol) {
+ getSymbol().print(writer, withType);
+ if (fields != null && fields.length > 0) writer.print(", ");
+ }
+ TreeField.print(writer, fields, withType);
+ return writer;
+ }
+
+ //########################################################################
}