diff options
Diffstat (limited to 'sources/scalac/ast')
-rw-r--r-- | sources/scalac/ast/TreeGen.java | 30 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Parser.java | 12 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Scanner.java | 1 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Tokens.java | 2 |
4 files changed, 42 insertions, 3 deletions
diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java index e3c2315005..751e78044d 100644 --- a/sources/scalac/ast/TreeGen.java +++ b/sources/scalac/ast/TreeGen.java @@ -21,7 +21,7 @@ import Tree.*; * @author Martin Odersky, Christine Roeckl * @version 1.0 */ -public class TreeGen implements Kinds, Modifiers { +public class TreeGen implements Kinds, Modifiers, TypeTags { /********************************************************************************/ /********************************************************************************/ @@ -185,6 +185,34 @@ public class TreeGen implements Kinds, Modifiers { return make.Literal(pos, new Integer(value)).setType(definitions.INT_TYPE); } + /** Build a default zero value according to type + */ + public Tree mkDefaultValue(int pos, Type tp) { + if (tp.isSubType(definitions.ANYREF_TYPE)) { + return Ident(pos, definitions.NULL); + } else { + switch (tp.unbox()) { + case UnboxedType(BOOLEAN): + return mkBooleanLit(pos, false); + case UnboxedType(BYTE): + case UnboxedType(SHORT): + case UnboxedType(CHAR): + case UnboxedType(INT): + return mkIntLit(pos, 0); + case UnboxedType(LONG): + return make.Literal(pos, new Long(0)).setType(definitions.LONG_TYPE); + case UnboxedType(FLOAT): + return make.Literal(pos, new Float(0)).setType(definitions.FLOAT_TYPE); + case UnboxedType(DOUBLE): + return make.Literal(pos, new Double(0)).setType(definitions.DOUBLE_TYPE); + case UnboxedType(UNIT): + return Block(pos, Tree.EMPTY_ARRAY); + default: + return Ident(pos, definitions.ZERO); + } + } + } + /** Build a tree to be used as a base class constructor for a template. */ public Tree mkParentConstr(int pos, Type parentType, Tree[] parentArgs) { diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java index af165b22ea..7a6cd2b3db 100644 --- a/sources/scalac/ast/parser/Parser.java +++ b/sources/scalac/ast/parser/Parser.java @@ -159,7 +159,7 @@ public class Parser implements Tokens { case SYMBOLLIT: case TRUE: case FALSE: case NULL: case IDENTIFIER: case THIS: case SUPER: case IF: case FOR: case NEW: case USCORE: - case TRY: case WHILE: case DO: + case TRY: case WHILE: case DO: case RETURN: case THROW: case LPAREN: case LBRACE: return true; default: @@ -812,6 +812,8 @@ public class Parser implements Tokens { * | while `(' Expr `)' Expr * | do Expr [`;'] while `(' Expr `)' * | for `(' Enumerators `)' (do | yield) Expr + * | throw Expr + * | return [Expr] * | [SimpleExpr `.'] Id `=' Expr * | SimpleExpr ArgumentExprs `=' Expr * | PostfixExpr [`:' Type1 | as Type1 | is Type1] @@ -885,6 +887,14 @@ public class Parser implements Tokens { } else { return syntaxError("`do' or `yield' expected", true); } + } else if (s.token == RETURN) { + int pos = s.skipToken(); + Tree e = (isExprIntro()) ? expr() + : make.Block(pos, Tree.EMPTY_ARRAY); + return make.Return(pos, e); + } else if (s.token == THROW) { + int pos = s.skipToken(); + return make.Throw(pos, expr()); // } else if (s.token == ARROW) { // return make.Function(s.skipToken(), new ValDef[]{}, expr()); } else { diff --git a/sources/scalac/ast/parser/Scanner.java b/sources/scalac/ast/parser/Scanner.java index 7ae8840697..62109eacb0 100644 --- a/sources/scalac/ast/parser/Scanner.java +++ b/sources/scalac/ast/parser/Scanner.java @@ -834,6 +834,7 @@ public class Scanner extends TokenData { enterKeyword("sealed", SEALED); enterKeyword("super", SUPER); enterKeyword("this", THIS); + enterKeyword("throw", THROW); enterKeyword("trait", TRAIT); enterKeyword("true", TRUE); enterKeyword("try", TRY); diff --git a/sources/scalac/ast/parser/Tokens.java b/sources/scalac/ast/parser/Tokens.java index 3153d4a78d..485ce6a465 100644 --- a/sources/scalac/ast/parser/Tokens.java +++ b/sources/scalac/ast/parser/Tokens.java @@ -59,7 +59,7 @@ public interface Tokens { DO = 49, TRAIT = 50, SEALED = 51, - /* THROW = 54, */ + THROW = 52, TRY = 53, CATCH = 54, FINALLY = 55, |