From 2014d1feeefd1bc6bcfee0cee347c4a77db05253 Mon Sep 17 00:00:00 2001 From: paltherr Date: Thu, 12 Feb 2004 15:10:40 +0000 Subject: - Changed Tree.Block(Tree[]) to Tree.Block(Tree... - Changed Tree.Block(Tree[]) to Tree.Block(Tree[],Tree) --- sources/scalac/ast/Transformer.java.tmpl | 4 +- sources/scalac/ast/TreeGen.java | 100 ++++++++++++++++-------- sources/scalac/ast/parser/Parser.java | 44 +++++++---- sources/scalac/ast/printer/TextTreePrinter.java | 9 ++- 4 files changed, 104 insertions(+), 53 deletions(-) (limited to 'sources/scalac/ast') 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 " = ". */ @@ -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; -- cgit v1.2.3