From 8341c5c36e88000e24bfd26d62c98805fc96fdcf Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Thu, 21 Aug 2003 09:44:58 +0000 Subject: *** empty log message *** --- sources/scalac/ast/TreeInfo.java | 15 +++++++++++++++ sources/scalac/ast/parser/Parser.java | 30 +++++++++++++++++------------- 2 files changed, 32 insertions(+), 13 deletions(-) (limited to 'sources/scalac/ast') 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 { -- cgit v1.2.3