summaryrefslogtreecommitdiff
path: root/sources/scalac/ast
diff options
context:
space:
mode:
Diffstat (limited to 'sources/scalac/ast')
-rw-r--r--sources/scalac/ast/TreeGen.java30
-rw-r--r--sources/scalac/ast/parser/Parser.java12
-rw-r--r--sources/scalac/ast/parser/Scanner.java1
-rw-r--r--sources/scalac/ast/parser/Tokens.java2
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,