summaryrefslogtreecommitdiff
path: root/sources/scalac/ast
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-02-20 13:15:06 +0000
committerMartin Odersky <odersky@gmail.com>2003-02-20 13:15:06 +0000
commit17bd66e3cf7734ccf1ccd3a0adb987feb880d325 (patch)
tree52c57891aac018ce89643e41dd0dd05170ae42ab /sources/scalac/ast
parent2fc8c8dc203f00a936aab60dba50c2d7e4ae054b (diff)
downloadscala-17bd66e3cf7734ccf1ccd3a0adb987feb880d325.tar.gz
scala-17bd66e3cf7734ccf1ccd3a0adb987feb880d325.tar.bz2
scala-17bd66e3cf7734ccf1ccd3a0adb987feb880d325.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/ast')
-rw-r--r--sources/scalac/ast/TreeInfo.java9
-rw-r--r--sources/scalac/ast/parser/Parser.java129
-rw-r--r--sources/scalac/ast/printer/TextTreePrinter.java11
3 files changed, 71 insertions, 78 deletions
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java
index 81d9481f31..75d6dfa863 100644
--- a/sources/scalac/ast/TreeInfo.java
+++ b/sources/scalac/ast/TreeInfo.java
@@ -120,6 +120,15 @@ public class TreeInfo {
}
}
+ public static boolean isVarPattern(Tree pat) {
+ switch (pat) {
+ case Ident(Name name):
+ return name.isVariable();
+ default:
+ return false;
+ }
+ }
+
/** The method symbol of an application node, or Symbol.NONE, if none exists.
*/
public static Symbol methSymbol(Tree tree) {
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index f9aa54cb3a..7455080054 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -15,6 +15,8 @@ import scalac.symtab.Modifiers;
import scalac.ast.*;
import Tree.*;
+//todo: add type idents?
+
/** A recursive descent parser for the programming language Scala.
*
* @author Martin Odersky, Matthias Zenger
@@ -186,71 +188,32 @@ public class Parser implements Tokens {
}
}
- /** Create tree representing type scala.Any
- */
- Tree scalaAnyType(int pos) {
- return make.Select(pos, make.Ident(pos, Names.scala), Names.Any.toTypeName());
- }
-
- /** Create tree representing type scala.Seq
- */
- Tree scalaSeqType(int pos) {
- return make.Select(pos, make.Ident(pos, Names.scala), Names.Seq.toTypeName());
- }
-
- /** Create tree representing constructor scala.Object
- */
- Tree scalaObjectConstr(int pos) {
- return make.Select(pos, make.Ident(pos, Names.scala), Names.Object.toConstrName());
- }
- /** Create tree representing method scala.Symbol
- */
- Tree scalaSymbol(int pos) {
- return make.Select(pos, make.Ident(pos, Names.scala), Names.Symbol);
- }
-
- /** Create tree representing method scala.Labelled
- */
- Tree scalaLabelled(int pos) {
- return make.Select(pos, make.Ident(pos, Names.scala), Names.Labelled);
- }
-
- /** Create tree representing method scala.Predef.List
- */
- Tree scalaPredefList(int pos) {
- return make.Select(pos,
- make.Select(pos, make.Ident(pos, Names.scala), Names.Predef),
- Names.List);
- }
-
- /** Create tree representing type scala.List
- */
- Tree scalaListType(int pos) {
- return make.Select(pos, make.Ident(pos, Names.scala), Names.List.toTypeName());
+ Tree scalaDot(int pos, Name name) {
+ return make.Select(pos, make.Ident(pos, Names.scala), name);
}
/** Create tree for for-comprehension <for (enums) do body> or
* <for (enums) yield body> where mapName and flatmapName are chosen
* corresponding to whether this is a for-do or a for-yield.
*/
- Tree makeFor(Tree[] enums, Name mapName, Name flatmapName, Tree body) {
+ Tree makeFor(int pos, Tree[] enums, Name mapName, Name flatmapName, Tree body) {
switch (enums[0]) {
case PatDef(int mods, Tree pat, Tree rhs):
if (enums.length == 1)
- return makeFor1(enums[0].pos, mapName, pat, rhs, body);
+ return makeFor1(pos, mapName, pat, rhs, body);
Tree[] newenums = new Tree[enums.length - 1];
switch (enums[1]) {
case PatDef(int mods2, Tree pat2, Tree rhs2):
System.arraycopy(enums, 1, newenums, 0, newenums.length);
- return makeFor1(enums[0].pos, flatmapName, pat, rhs,
- makeFor(newenums, mapName, flatmapName, body));
+ return makeFor1(pos, flatmapName, pat, rhs,
+ makeFor(enums[1].pos, newenums, mapName, flatmapName, body));
default:
System.arraycopy(enums, 2, newenums, 1, newenums.length - 1);
newenums[0] = make.PatDef(
enums[0].pos, mods, pat,
- makeFor1(enums[0].pos, Names.filter, pat, rhs, enums[1]));
- return makeFor(newenums, mapName, flatmapName, body);
+ makeFor1(enums[1].pos, Names.filter, pat, rhs, enums[1]));
+ return makeFor(pos, newenums, mapName, flatmapName, body);
}
default:
throw new ApplicationError();
@@ -493,17 +456,17 @@ public class Parser implements Tokens {
t = make.Ident(s.pos, Names.null_);
break;
case SYMBOLLIT:
- Tree symt = scalaSymbol(s.pos);
+ Tree symt = scalaDot(s.pos, Names.Symbol);
if (isPattern) symt = convertToTypeId(symt);
t = make.Apply(s.pos,
symt,
new Tree[]{make.Literal(s.pos, s.name.toString())});
s.nextToken();
if (s.token == LPAREN || s.token == LBRACE) {
- Tree labt = scalaLabelled(s.pos);
+ Tree labt = scalaDot(s.pos, Names.Labelled);
if (isPattern) labt = convertToTypeId(labt);
- Tree listt = isPattern ? scalaListType(s.pos)
- : scalaPredefList(s.pos);
+ Tree listt = isPattern ? scalaDot(s.pos, Names.List.toTypeName())
+ : make.Select(s.pos, scalaDot(s.pos, Names.Predef), Names.List);
t = make.Apply(s.pos,
labt,
new Tree[]{t, make.Apply(s.pos, listt, argumentExprs())});
@@ -707,11 +670,9 @@ public class Parser implements Tokens {
Tree[] enums = enumerators();
accept(RPAREN);
if (s.token == DO) {
- s.nextToken();
- return makeFor(enums, Names.foreach, Names.foreach, expr());
+ return makeFor(s.skipToken(), enums, Names.foreach, Names.foreach, expr());
} else if (s.token == YIELD) {
- s.nextToken();
- return makeFor(enums, Names.map, Names.flatmap, expr());
+ return makeFor(s.skipToken(), enums, Names.map, Names.flatmap, expr());
} else {
return syntaxError("`do' or `yield' expected", true);
}
@@ -962,9 +923,26 @@ public class Parser implements Tokens {
*/
Tree generator() {
int pos = accept(VAL);
- Tree p = pattern();
+ Tree pat = pattern();
accept(LARROW);
- return make.PatDef(pos, 0, p, expr());
+ Tree rhs = expr();
+ if (!TreeInfo.isVarPattern(pat))
+ rhs = make.Apply(
+ rhs.pos,
+ make.Select(rhs.pos, rhs, Names.filter),
+ new Tree[]{
+ make.Visitor(
+ rhs.pos,
+ new Tree.CaseDef[]{
+ (CaseDef)make.CaseDef(
+ rhs.pos, pat, Tree.Empty,
+ make.Select(rhs.pos,
+ scalaDot(rhs.pos, Names.Boolean), Names.True)),
+ (CaseDef)make.CaseDef(
+ rhs.pos, make.Ident(rhs.pos, Names.WILDCARD), Tree.Empty,
+ make.Select(rhs.pos,
+ scalaDot(rhs.pos, Names.Boolean), Names.False))})});
+ return make.PatDef(pos, 0, pat, rhs);
}
//////// PATTERNS ////////////////////////////////////////////////////////////
@@ -989,11 +967,8 @@ public class Parser implements Tokens {
int base = sp;
Tree top = simplePattern();
if (s.token == COLON) {
- switch (top) {
- case Ident(Name name):
- if (name.isVariable())
- return make.Typed(s.skipToken(), top, type1());
- }
+ if (TreeInfo.isVarPattern(top))
+ return make.Typed(s.skipToken(), top, type1());
}
while (s.token == IDENTIFIER) {
top = reduceStack(
@@ -1159,7 +1134,9 @@ public class Parser implements Tokens {
if (s.token == IDENTIFIER && s.name == STAR) {
s.nextToken();
mods |= Modifiers.REPEATED;
- tp = make.AppliedType(tp.pos, scalaSeqType(tp.pos), new Tree[]{tp});
+ tp = make.AppliedType(tp.pos,
+ scalaDot(tp.pos, Names.Seq.toTypeName()),
+ new Tree[]{tp});
}
return (ValDef)make.ValDef(pos, mods, name, tp, Tree.Empty);
}
@@ -1190,7 +1167,7 @@ public class Parser implements Tokens {
s.nextToken();
tp = type();
} else {
- tp = scalaAnyType(pos);
+ tp = scalaDot(pos, Names.Any.toTypeName());
}
return make.TypeDef(pos, Modifiers.PARAM, name.toTypeName(),
Tree.ExtTypeDef.EMPTY_ARRAY, tp);
@@ -1390,7 +1367,7 @@ public class Parser implements Tokens {
if (tp == Tree.Empty || s.token == EQUALS)
return make.ValDef(pos, mods, name, tp, equalsExpr());
else
- return make.ValDef(pos, mods | Modifiers.ABSTRACT, name, tp, Tree.Empty);
+ return make.ValDef(pos, mods | Modifiers.DEFERRED, name, tp, Tree.Empty);
default:
return make.PatDef(pos, mods, pat, equalsExpr());
}
@@ -1415,7 +1392,7 @@ public class Parser implements Tokens {
}
return make.ValDef(pos, mods | Modifiers.MUTABLE, name, type, rhs);
} else {
- return make.ValDef(pos, mods | Modifiers.MUTABLE | Modifiers.ABSTRACT,
+ return make.ValDef(pos, mods | Modifiers.MUTABLE | Modifiers.DEFERRED,
name, type, Tree.Empty);
}
}
@@ -1437,7 +1414,7 @@ public class Parser implements Tokens {
return make.DefDef(pos, mods, name, tparams, vparams,
restype, equalsExpr());
else
- return make.DefDef(pos, mods | Modifiers.ABSTRACT, name,
+ return make.DefDef(pos, mods | Modifiers.DEFERRED, name,
tparams, vparams, restype, Tree.Empty);
}
@@ -1458,7 +1435,7 @@ public class Parser implements Tokens {
return make.DefDef(pos, mods, name, tparams, vparams,
restype, (s.token == LBRACE) ? blockConstr() : constr());
} else
- return make.DefDef(pos, mods | Modifiers.ABSTRACT, name,
+ return make.DefDef(pos, mods | Modifiers.DEFERRED, name,
tparams, vparams, restype, Tree.Empty);
}
@@ -1470,7 +1447,7 @@ public class Parser implements Tokens {
Name name = ident().toTypeName();
if (s.token == SUBTYPE) {
s.nextToken();
- return make.TypeDef(pos, mods | Modifiers.ABSTRACT, name,
+ return make.TypeDef(pos, mods | Modifiers.DEFERRED, name,
Tree.ExtTypeDef.EMPTY_ARRAY, type());
} else if (s.token == LBRACKET) {
TypeDef[] tparams = typeParamClauseOpt();
@@ -1482,8 +1459,8 @@ public class Parser implements Tokens {
Tree.ExtTypeDef.EMPTY_ARRAY, type());
} else if (s.token == SEMI || s.token == COMMA) {
return make.TypeDef(
- pos, mods | Modifiers.ABSTRACT, name,
- Tree.ExtTypeDef.EMPTY_ARRAY, scalaAnyType(pos));
+ pos, mods | Modifiers.DEFERRED, name,
+ Tree.ExtTypeDef.EMPTY_ARRAY, scalaDot(pos, Names.Any.toTypeName()));
} else {
return syntaxError("`=' or `<:' expected", true);
}
@@ -1519,12 +1496,14 @@ public class Parser implements Tokens {
s.nextToken();
return template();
} else if (s.token == LBRACE) {
- return (Template)make.Template(
- pos, new Tree[]{scalaObjectConstr(pos)}, templateBody());
+ return (Template)make.Template(pos,
+ new Tree[]{scalaDot(pos, Names.Object.toConstrName())},
+ templateBody());
} else {
syntaxError("`extends' or `{' expected", true);
- return (Template)make.Template(
- pos, new Tree[]{scalaObjectConstr(pos)}, Tree.EMPTY_ARRAY);
+ return (Template)make.Template(pos,
+ new Tree[]{scalaDot(pos, Names.Object.toConstrName())},
+ Tree.EMPTY_ARRAY);
}
}
diff --git a/sources/scalac/ast/printer/TextTreePrinter.java b/sources/scalac/ast/printer/TextTreePrinter.java
index 58010b8412..5836e24f0e 100644
--- a/sources/scalac/ast/printer/TextTreePrinter.java
+++ b/sources/scalac/ast/printer/TextTreePrinter.java
@@ -275,7 +275,11 @@ public class TextTreePrinter implements TreePrinter {
print(Text.Space);
printSymbolDefinition(tree.symbol(), name);
printOpt(TXT_COLON, tpe, false);
- printOpt(TXT_EQUAL, rhs, true);
+ if ((mods & Modifiers.DEFERRED) == 0) {
+ print(Text.Space); print(TXT_EQUAL); print(Text.Space);
+ if (rhs == Tree.Empty) print("_");
+ else print(rhs);
+ }
break;
case PatDef(int mods, Tree pat, Tree rhs):
@@ -311,7 +315,7 @@ public class TextTreePrinter implements TreePrinter {
print(Text.Space);
printSymbolDefinition(tree.symbol(), name);
printParams(tparams);
- if ((mods & (Modifiers.ABSTRACT | Modifiers.PARAM)) != 0) printOpt(TXT_SUBTYPE, rhs, true);
+ if ((mods & (Modifiers.DEFERRED | Modifiers.PARAM)) != 0) printOpt(TXT_SUBTYPE, rhs, true);
else printOpt(TXT_EQUAL, rhs, true);
break;
@@ -514,6 +518,7 @@ public class TextTreePrinter implements TreePrinter {
print(TXT_UNKNOWN);
break;
}
+ //print("{" + tree.type + "}");//DEBUG
return this;
}
@@ -575,7 +580,7 @@ public class TextTreePrinter implements TreePrinter {
}
protected void printModifiers(int flags) {
- if ((flags & Modifiers.ABSTRACT) != 0) {
+ if ((flags & Modifiers.ABSTRACTCLASS) != 0) {
print(KW_ABSTRACT);
print(Text.Space);
}