summaryrefslogtreecommitdiff
path: root/sources/scalac/ast
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-08-21 09:44:58 +0000
committerMartin Odersky <odersky@gmail.com>2003-08-21 09:44:58 +0000
commit8341c5c36e88000e24bfd26d62c98805fc96fdcf (patch)
treee79189602238f756f686bf7805d91289cbe22d2c /sources/scalac/ast
parentda5c361c7af30fc25f542bad8e12f3fceefc144d (diff)
downloadscala-8341c5c36e88000e24bfd26d62c98805fc96fdcf.tar.gz
scala-8341c5c36e88000e24bfd26d62c98805fc96fdcf.tar.bz2
scala-8341c5c36e88000e24bfd26d62c98805fc96fdcf.zip
*** empty log message ***
Diffstat (limited to 'sources/scalac/ast')
-rw-r--r--sources/scalac/ast/TreeInfo.java15
-rw-r--r--sources/scalac/ast/parser/Parser.java30
2 files changed, 32 insertions, 13 deletions
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java
index fc12935250..19b2341f44 100644
--- a/sources/scalac/ast/TreeInfo.java
+++ b/sources/scalac/ast/TreeInfo.java
@@ -127,6 +127,21 @@ public class TreeInfo {
}
}
+ /** Is tree a self constructor call?
+ */
+ public static boolean isSelfConstrCall(Tree tree) {
+ switch (tree) {
+ case Ident(Name name):
+ return name == Names.CONSTRUCTOR;
+ case TypeApply(Tree constr, _):
+ return isSelfConstrCall(constr);
+ case Apply(Tree constr, _):
+ return isSelfConstrCall(constr);
+ default:
+ return false;
+ }
+ }
+
/** Is tree a variable pattern
*/
public static boolean isVarPattern(Tree pat) {
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index 3bcb1c4045..af165b22ea 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -284,20 +284,24 @@ public class Parser implements Tokens {
//where
Tree makeFor1(int pos, Name name, Tree pat, Tree rhs, Tree body) {
- Tree cont;
+ return make.Apply(
+ pos, make.Select(pos, rhs, name),
+ new Tree[]{makeForCont(pos, pat, body)});
+ }
+ Tree makeForCont(int pos, Tree pat, Tree body) {
switch (pat) {
case Ident(Name name1):
- cont = make.Function(pos,
- new Tree.ValDef[]{
- (ValDef)
- make.ValDef(pat.pos, Modifiers.PARAM, name1, Tree.Empty, Tree.Empty)},
- body);
- break;
- default:
- cont = make.Visitor(pos, new Tree.CaseDef[]{
- (CaseDef)make.CaseDef(pos, pat, Tree.Empty, body)});
+ if (name1.isVariable())
+ return make.Function(
+ pos,
+ new Tree.ValDef[]{
+ (ValDef) make.ValDef(
+ pat.pos, Modifiers.PARAM,
+ name1, Tree.Empty, Tree.Empty)},
+ body);
}
- return make.Apply(pos, make.Select(pos, rhs, name), new Tree[]{cont});
+ return make.Visitor(pos, new Tree.CaseDef[]{
+ (CaseDef)make.CaseDef(pos, pat, Tree.Empty, body)});
}
Tree makeTry(int pos, Tree body, Tree catcher, Tree finalizer) {
@@ -433,7 +437,7 @@ public class Parser implements Tokens {
switch (fn) {
case This(TypeNames.EMPTY):
return make.Apply(
- t.pos, make.Ident(t.pos, Names.this_.toTypeName()), args);
+ t.pos, make.Ident(t.pos, Names.CONSTRUCTOR), args);
}
}
return syntaxError(t.pos, "class constructor expected", false);
@@ -1729,7 +1733,7 @@ public class Parser implements Tokens {
ValDef[][] vparams = new ValDef[][]{paramClause()};
accept(EQUALS);
return make.DefDef(
- pos, mods, Names.this_.toTypeName(),
+ pos, mods, Names.CONSTRUCTOR,
Tree.AbsTypeDef_EMPTY_ARRAY, vparams, Tree.Empty,
convertToSelfConstr(expr()));
} else {