summaryrefslogtreecommitdiff
path: root/sources/scalac/ast
diff options
context:
space:
mode:
authorpaltherr <paltherr@epfl.ch>2004-02-12 15:10:40 +0000
committerpaltherr <paltherr@epfl.ch>2004-02-12 15:10:40 +0000
commit2014d1feeefd1bc6bcfee0cee347c4a77db05253 (patch)
treedeffe18f0bf6527171d655885445abc8bb17023b /sources/scalac/ast
parentb62de8dc4f94efa47bf6714865b8bbf4df700046 (diff)
downloadscala-2014d1feeefd1bc6bcfee0cee347c4a77db05253.tar.gz
scala-2014d1feeefd1bc6bcfee0cee347c4a77db05253.tar.bz2
scala-2014d1feeefd1bc6bcfee0cee347c4a77db05253.zip
- Changed Tree.Block(Tree[]) to Tree.Block(Tree...
- Changed Tree.Block(Tree[]) to Tree.Block(Tree[],Tree)
Diffstat (limited to 'sources/scalac/ast')
-rw-r--r--sources/scalac/ast/Transformer.java.tmpl4
-rw-r--r--sources/scalac/ast/TreeGen.java100
-rw-r--r--sources/scalac/ast/parser/Parser.java44
-rw-r--r--sources/scalac/ast/printer/TextTreePrinter.java9
4 files changed, 104 insertions, 53 deletions
diff --git a/sources/scalac/ast/Transformer.java.tmpl b/sources/scalac/ast/Transformer.java.tmpl
index 69aef7dfca..1af073fc86 100644
--- a/sources/scalac/ast/Transformer.java.tmpl
+++ b/sources/scalac/ast/Transformer.java.tmpl
@@ -206,8 +206,8 @@ public class GenTransformer {
Symbol symbol = getSymbolFor(tree);
return gen.LabelDef(symbol, transform(params), transform(rhs));
- case Block(Tree[] stats):
- return gen.Block(tree.pos, transform(stats));
+ case Block(Tree[] stats, Tree value):
+ return gen.Block(tree.pos, transform(stats), transform(value));
// case Sequence(Tree[] trees):
// case Alternative(Tree[] trees):
diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java
index 1ebcaf7c53..27b168abd8 100644
--- a/sources/scalac/ast/TreeGen.java
+++ b/sources/scalac/ast/TreeGen.java
@@ -468,7 +468,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
// Public Methods - Building expressions - Simple nodes
/** Flattens the given tree array by inlining Block nodes. */
- public Tree[] flatten(Tree[] trees) {
+ public Tree[] flatten_(Tree[] trees) {
boolean copy = false;
int length = 0;
for (int i = 0; i < trees.length; i++) {
@@ -477,10 +477,9 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
copy = true;
length -= 1;
continue;
- case Block(Tree[] stats):
- if (stats.length == 0) break; // preserve unit literals
+ case Block(Tree[] stats, Tree value):
copy = true;
- length += stats.length;
+ length += stats.length + 1;
continue;
}
length += 1;
@@ -491,9 +490,9 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
switch (trees[i]) {
case Empty:
continue;
- case Block(Tree[] stats):
- if (stats.length == 0) break; // preserve unit literals
+ case Block(Tree[] stats, Tree value):
for (int j = 0; j < stats.length; j++) clone[o++] = stats[j];
+ clone[o++] = value;
continue;
}
clone[o++] = trees[i];
@@ -530,16 +529,43 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
return mkAsInstanceOf(value.pos, value, type);
}
- /** Builds an expression with given non-empty tree array. */
- public Tree mkBlock(int pos, Tree[] trees) {
- assert trees.length != 0;
- Tree[] flatten = flatten(trees);
- assert flatten.length != 0: Debug.show(trees);
- return Block(pos, flatten);
+ /** Builds an expression of type Unit with given statements. */
+ public Tree mkUnitBlock(int pos, Tree[] stats) {
+ return mkBlock(pos, stats, mkUnitLit(pos));
}
- public Tree mkBlock(Tree[] trees) {
- assert trees.length != 0;
- return mkBlock(trees[0].pos, trees);
+
+ /** Builds an expression of type Unit with given statement. */
+ public Tree mkUnitBlock(int pos, Tree stat) {
+ return mkUnitBlock(pos, new Tree[]{stat});
+ }
+ public Tree mkUnitBlock(Tree stat) {
+ return mkUnitBlock(stat.pos, stat);
+ }
+
+ /** Builds an expression with given statements and value. */
+ public Tree mkBlock(int pos, Tree[] stats, Tree value) {
+ if (stats.length == 0) return value;
+ return Block(pos, stats, value); // !!! add flatten?
+ }
+ public Tree mkBlock(Tree[] stats, Tree value) {
+ return mkBlock((stats.length!=0 ? stats[0] : value).pos, stats, value);
+ }
+
+ /** Builds an expression with given statement and value. */
+ public Tree mkBlock(int pos, Tree stat, Tree value) {
+ switch (stat) {
+ case Empty:
+ return value;
+ case Block(Tree[] block_stats, Tree block_value):
+ Tree[] stats = Tree.cloneArray(block_stats, 1);
+ stats[block_stats.length] = block_value;
+ return Block(stat.pos, stats, value);
+ default:
+ return Block(pos, new Tree[]{stat}, value);
+ }
+ }
+ public Tree mkBlock(Tree stat, Tree value) {
+ return mkBlock(stat.pos, stat, value);
}
/** Builds an Import node with given qualifier and names. */
@@ -562,20 +588,29 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
return tree;
}
- /** Builds a Block node with given statements. */
- public Tree Block(int pos, Tree[] stats) {
- Block tree = make.Block(pos, stats);
- global.nextPhase();
- tree.setType(stats.length == 0
- ? definitions.UNIT_TYPE()
- : stats[stats.length - 1].type);
- global.prevPhase();
+ /** Builds a Block node with given statements and value. */
+ public Block Block(int pos, Tree[] stats, Tree value) {
+ inline:
+ switch (value) {
+ case Block(Tree[] value_stats, Tree value_value):
+ int count = 0;
+ for (int i = 0; i < value_stats.length; i++) {
+ if (value_stats[i].definesSymbol()) break inline;
+ if (value_stats[i] != Tree.Empty) count++;
+ }
+ Tree[] array = Tree.cloneArray(stats, count);
+ for (int i = 0, j = stats.length; i < value_stats.length; i++) {
+ if (value_stats[i] != Tree.Empty) array[j++] = value_stats[i];
+ }
+ stats = array;
+ value = value_value;
+ }
+ Block tree = make.Block(pos, stats, value);
+ tree.setType(value.type());
return tree;
}
-
- /** Builds a Block node with given non-empty statements list. */
- public Tree Block(Tree[] stats) {
- return Block(stats[0].pos, stats);
+ public Block Block(Tree[] stats, Tree value) {
+ return Block((stats.length != 0 ? stats[0] : value).pos, stats, value);
}
/** Builds an Assign node corresponding to "<lhs> = <rhs>". */
@@ -762,14 +797,13 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
*/
public Tree mkNewArray(int pos, Type element, Tree[] values, Symbol owner){
if (values.length == 0) return mkNewArray(pos, element, 0);
- Tree[] trees = new Tree[1 + values.length + 1];
+ Tree[] trees = new Tree[1 + values.length];
Symbol array =
newLocal(pos, Names.array, owner, definitions.ARRAY_TYPE(element));
trees[0] = ValDef(array, mkNewArray(pos, element, values.length));
for (int i = 0; i < values.length; i++)
trees[1 + i] = mkArraySet(Ident(pos, array), i, values[i]);
- trees[values.length + 1] = Ident(pos, array);
- return Block(pos, trees);
+ return Block(pos, trees, Ident(pos, array));
}
/** Builds an array length operation. */
@@ -1101,7 +1135,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
Tree classDef = ClassDef(clazz, memberTrees);
Tree alloc = New(mkApply__(mkPrimaryConstructorLocalRef(pos, clazz)))
.setType(parentTypes[1]); // !!!
- return Block(new Tree[]{classDef, alloc});
+ return mkBlock(classDef, alloc);
}
@@ -1123,7 +1157,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
Tree classDef = ClassDef(clazz, memberTrees);
Tree alloc = New(mkApply__(mkPrimaryConstructorLocalRef(pos, clazz)))
.setType(parentTypes[1]); // !!!
- return Block(new Tree[]{classDef, alloc});
+ return mkBlock(classDef, alloc);
}
//where
private Tree makeVisitorMethod(int pos, Name name, Tree visitor,
@@ -1172,7 +1206,7 @@ public class TreeGen implements Kinds, Modifiers, TypeTags {
.setInfo(obj.type);
Tree tmpdef = ValDef(tmp, obj);
Tree expr = postfixApply(Ident(obj.pos, tmp), fn, owner);
- return Block(new Tree[]{tmpdef, expr});
+ return mkBlock(tmpdef, expr);
}
}
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index 12226aa922..6cbf3e342a 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -15,6 +15,7 @@ import scalac.*;
import scalac.util.*;
import scalac.symtab.Modifiers;
import scalac.ast.*;
+import scalac.atree.AConstant;
import Tree.*;
/** A recursive descent parser for the programming language Scala.
@@ -243,10 +244,10 @@ public class Parser implements Tokens {
Name x = fresh();
return make.Block(pos,
new Tree[]{
- make.ValDef(pos, 0, x, Tree.Empty, left),
+ make.ValDef(pos, 0, x, Tree.Empty, left)},
make.Apply(pos,
make.Select(pos, right, NameTransformer.encode(op)),
- new Tree[]{make.Ident(left.pos, x)})});
+ new Tree[]{make.Ident(left.pos, x)}));
}
} else {
return make.Apply(pos,
@@ -370,8 +371,8 @@ public class Parser implements Tokens {
Tree rhs = make.If(
pos,
cond,
- make.Block(body.pos, new Tree[]{body, continu}),
- make.Block(pos, Tree.EMPTY_ARRAY));
+ make.Block(body.pos, new Tree[]{body}, continu),
+ gen.mkUnitLit(pos));
return make.LabelDef(pos, lname, new Ident[0], rhs);
}
@@ -381,12 +382,12 @@ public class Parser implements Tokens {
Tree rhs = make.Block(
body.pos,
new Tree[]{
- body,
+ body},
make.If(
cond.pos,
cond,
continu,
- make.Block(pos, Tree.EMPTY_ARRAY))});
+ gen.mkUnitLit(pos)));
return make.LabelDef(pos, lname, new Ident[0], rhs);
}
@@ -399,8 +400,8 @@ public class Parser implements Tokens {
case Ident(_):
case Typed(Ident(_), _):
return new ValDef[]{convertToParam(t)};
- case Block(Tree[] stats):
- if (stats.length == 0) return Tree.ValDef_EMPTY_ARRAY;
+ case Literal(AConstant.UNIT):
+ return Tree.ValDef_EMPTY_ARRAY; // !!!
}
syntaxError(t.pos, "malformed formal parameter list", false);
return Tree.ValDef_EMPTY_ARRAY;
@@ -912,7 +913,7 @@ public class Parser implements Tokens {
} else if (s.token == RETURN) {
int pos = s.skipToken();
Tree e = (isExprIntro()) ? expr()
- : make.Block(pos, Tree.EMPTY_ARRAY);
+ : gen.mkUnitLit(pos);
return make.Return(pos, e);
} else if (s.token == THROW) {
int pos = s.skipToken();
@@ -1031,7 +1032,7 @@ public class Parser implements Tokens {
int pos = s.skipToken();
if (s.token == RPAREN) {
s.nextToken();
- t = make.Block(pos, Tree.EMPTY_ARRAY);
+ t = gen.mkUnitLit(pos);
} else {
t = expr();
if (s.token == COMMA) {
@@ -1126,9 +1127,20 @@ public class Parser implements Tokens {
/** Block ::= BlockStatSeq
*/
Tree block(int pos) {
- Tree[] stats = blockStatSeq(new TreeList());
- if (stats.length == 1 && stats[0].isTerm()) return stats[0];
- else return make.Block(pos, stats);
+ return block(pos, blockStatSeq(new TreeList()));
+ }
+ private Tree block(int pos, Tree[] stats) {
+ if (stats.length == 0)
+ return gen.mkUnitLit(pos);
+ else if (!stats[stats.length - 1].isTerm())
+ return make.Block(pos, stats, gen.mkUnitLit(pos));
+ else if (stats.length == 1)
+ return stats[0];
+ else {
+ Tree[] trees = new Tree[stats.length - 1];
+ System.arraycopy(stats, 0, trees, 0, trees.length);
+ return make.Block(pos, trees, stats[stats.length - 1]);
+ }
}
/** CaseClause ::= case Pattern [if PostfixExpr] `=>' Block
@@ -1832,7 +1844,7 @@ public class Parser implements Tokens {
stats = statlist.toArray();
}
accept(RBRACE);
- return make.Block(pos, stats);
+ return block(pos, stats);
} else {
return selfInvocation();
}
@@ -2070,13 +2082,13 @@ public class Parser implements Tokens {
stats.append(defOrDcl(0));
accept(SEMI);
if (s.token == RBRACE || s.token == CASE) {
- stats.append(make.Block(s.pos, Tree.EMPTY_ARRAY));
+ stats.append(gen.mkUnitLit(s.pos));
}
} else if (isLocalModifier()) {
stats.append(clsDef(localClassModifiers()));
accept(SEMI);
if (s.token == RBRACE || s.token == CASE) {
- stats.append(make.Block(s.pos, Tree.EMPTY_ARRAY));
+ stats.append(gen.mkUnitLit(s.pos));
}
} else if (s.token == SEMI) {
s.nextToken();
diff --git a/sources/scalac/ast/printer/TextTreePrinter.java b/sources/scalac/ast/printer/TextTreePrinter.java
index 9cefa783d8..6a8be8f696 100644
--- a/sources/scalac/ast/printer/TextTreePrinter.java
+++ b/sources/scalac/ast/printer/TextTreePrinter.java
@@ -391,8 +391,13 @@ public class TextTreePrinter implements TreePrinter {
print(rhs);
break;
- case Block(Tree[] stats):
- printArray(stats, TXT_BLOCK_BEGIN, TXT_BLOCK_END, TXT_BLOCK_SEP);
+ case Block(Tree[] stats, Tree value):
+ printArray(stats, TXT_BLOCK_BEGIN, TXT_SEMICOLON, TXT_BLOCK_SEP);
+ indent();
+ printNewLine();
+ print(value);
+ undent();
+ print(TXT_BLOCK_END);
printType(tree);
break;