diff options
author | Martin Odersky <odersky@gmail.com> | 2003-03-20 11:40:33 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-03-20 11:40:33 +0000 |
commit | f449cd95e9e1805f50b1c267c6b18c281673cb3b (patch) | |
tree | a18f790688b6a73993aca13d744652c7bd2f1ab5 /sources | |
parent | 6440a65cbedc6751122d191a9fe119f72a8d0d5f (diff) | |
download | scala-f449cd95e9e1805f50b1c267c6b18c281673cb3b.tar.gz scala-f449cd95e9e1805f50b1c267c6b18c281673cb3b.tar.bz2 scala-f449cd95e9e1805f50b1c267c6b18c281673cb3b.zip |
*** empty log message ***
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scalac/ast/Transformer.java | 1 | ||||
-rw-r--r-- | sources/scalac/ast/TreeInfo.java | 1 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Parser.java | 13 | ||||
-rw-r--r-- | sources/scalac/symtab/Modifiers.java | 5 | ||||
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 2 | ||||
-rw-r--r-- | sources/scalac/transformer/AddAccessors.java | 3 | ||||
-rw-r--r-- | sources/scalac/typechecker/Analyzer.java | 61 | ||||
-rw-r--r-- | sources/scalac/typechecker/DeSugarize.java | 4 |
8 files changed, 49 insertions, 41 deletions
diff --git a/sources/scalac/ast/Transformer.java b/sources/scalac/ast/Transformer.java index aa2135f5be..a5f49a9f48 100644 --- a/sources/scalac/ast/Transformer.java +++ b/sources/scalac/ast/Transformer.java @@ -64,6 +64,7 @@ public class Transformer extends Phase { } public void apply(Unit unit) { + global.log("transforming " + unit); unit.body = transform(unit.body); } diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java index 790bfc5bc6..d07627724f 100644 --- a/sources/scalac/ast/TreeInfo.java +++ b/sources/scalac/ast/TreeInfo.java @@ -105,7 +105,6 @@ public class TreeInfo { } /** Is tree a pure constructor? - * //todo: update */ public static boolean isPureConstr(Tree tree) { switch (tree) { diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java index f532c78cd1..84bfea6689 100644 --- a/sources/scalac/ast/parser/Parser.java +++ b/sources/scalac/ast/parser/Parser.java @@ -1340,11 +1340,9 @@ public class Parser implements Tokens { } } - /** TopDef ::= ([case] class) ClassDef {`,' ClassDef} - * | trait TraitDef {`,' TraitDef} + /** TopDef ::= ([case] class | trait) ClassDef {`,' ClassDef} * | module ModuleDef {`,' ModuleDef} - * LocalTopDef ::= class ClassDef {`,' ClassDef} - * | trait TraitDef {`,' TraitDef} + * LocalTopDef ::= class ClassDef {`,' ClassDef}//todo: keep? * | module ModuleDef {`,' ModuleDef} */ Tree[] topDef(int mods) { @@ -1480,16 +1478,15 @@ public class Parser implements Tokens { } } - /** ClassDef ::= Id [TypeParamClause] ParamClause [`:' Type] ClassTemplate - * TraitDef ::= Id [TypeParamClause] [`:' Type] ClassTemplate + /** ClassDef ::= Id [TypeParamClause] [`:' Type] ClassTemplate */ Tree classDef(int mods) { int pos = s.pos; Name name = ident(); TypeDef[] tparams = typeParamClauseOpt(); ValDef[][] params; - if ((mods & Modifiers.TRAIT) == 0) params = new ValDef[][]{paramClause()}; - else params = new ValDef[][]{}; + if (s.token == LPAREN) params = new ValDef[][]{paramClause()}; + else params = Tree.ExtValDef.EMPTY_ARRAY_ARRAY; return make.ClassDef(pos, mods, name.toTypeName(), tparams, params, typedOpt(), classTemplate()); } diff --git a/sources/scalac/symtab/Modifiers.java b/sources/scalac/symtab/Modifiers.java index b9b5dc7463..cbfafae068 100644 --- a/sources/scalac/symtab/Modifiers.java +++ b/sources/scalac/symtab/Modifiers.java @@ -43,6 +43,7 @@ public interface Modifiers { // (typically, access methods for valdefs) int CAPTURED = 0x01000000; // variables is accessed from nested function. + int CASEACCESSOR = 0x02000000; // function is a case constructor int ACCESSOR = 0x04000000; // function is an access function for a // value or variable @@ -87,6 +88,10 @@ public interface Modifiers { return (flags & CASE) != 0; } + public static boolean isCaseAccessor(int flags) { + return (flags & CASEACCESSOR) != 0; + } + public static boolean isInterface(int flags) { return (flags & INTERFACE) != 0; } diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index 89e2b685bf..c479271667 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -1273,7 +1273,7 @@ public class ClassSymbol extends TypeSymbol { for (int i = 0; i <= index; i++) { do { sym = it.next(); - } while (sym.kind != VAL || (sym.flags & CASE) == 0 || !sym.isMethod()); + } while (sym.kind != VAL || (sym.flags & CASEACCESSOR) == 0 || !sym.isMethod()); } //System.out.println(this + ", case field[" + index + "] = " + sym);//DEBUG assert sym != null : this; diff --git a/sources/scalac/transformer/AddAccessors.java b/sources/scalac/transformer/AddAccessors.java index e9c525bedc..92d07f4048 100644 --- a/sources/scalac/transformer/AddAccessors.java +++ b/sources/scalac/transformer/AddAccessors.java @@ -120,7 +120,7 @@ public class AddAccessors extends Transformer { // Do not go into RHS of value definitions which reference // case class constructor arguments, to avoid creating // another accessor. - if (Modifiers.Helper.isCase(tree.symbol().flags)) { + if (Modifiers.Helper.isCaseAccessor(tree.symbol().flags)) { return tree; } else return super.transform(tree); @@ -128,6 +128,7 @@ public class AddAccessors extends Transformer { case Select(Tree qualifier, Name selector): { Symbol sym = tree.symbol(); + assert sym.kind != Kinds.NONE : tree; if (sym.owner().isPrimaryConstructor()) return gen.Apply(gen.Select(transform(qualifier), accessor(sym)), Tree.EMPTY_ARRAY); diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index 338c2ac0ec..8c57883545 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -534,11 +534,13 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { /** Check that tree represents a pure definition. */ void checkTrait(Tree tree, Symbol clazz) { - if (!TreeInfo.isPureConstr(tree) && tree.type != Type.ErrorType) + if (!TreeInfo.isPureConstr(tree) && + tree.type != Type.ErrorType /*&& + !tree.type.symbol().isTrait()*/) error(tree.pos, " " + clazz + " may inherit only from stable trait constructors"); } - /** Check that tree is a stable expression . + /** Check that tree is a stable expression .p */ Tree checkStable(Tree tree) { if (TreeInfo.isPureExpr(tree) || tree.type == Type.ErrorType) return tree; @@ -918,7 +920,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { } owntype = tpe.type; } else { - if ((mods & CASE) != 0) { + if ((mods & CASEACCESSOR) != 0) { //rhs was already attributed } else { ((ValDef) tree).rhs = rhs = transform(rhs, EXPRmode); @@ -1644,12 +1646,32 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { return adapt(tree, mode, pt); } } - } else if ((mode & (QUALmode | EXPRmode)) == EXPRmode) { - // check that packages and static modules are not used as values - Symbol sym = tree.symbol(); - if (sym != null && sym.kind != ERROR && !sym.isValue() && tree.isTerm()) { - new TextTreePrinter().print(tree).println().end();//debug - error(tree.pos, tree.symbol() + " is not a value"); + } else if ((mode & (EXPRmode | FUNmode)) == EXPRmode) { + Symbol fsym = TreeInfo.methSymbol(tree); + if (fsym != null && fsym.isMethod() && (fsym.flags & CASE) != 0) { + Symbol constr = fsym.owner().info() + .lookup(fsym.name.toTypeName()).constructor(); + Template templ = make.Template( + tree.pos, + new Tree[]{desugarize.toConstructor(tree, constr)}, + Tree.EMPTY_ARRAY); + //templ.setSymbol(Symbol.NONE).setType(tree.type); + return transform( + make.New(tree.pos, templ).setType(tree.type.instanceType()), mode, pt); + } else if ((mode & QUALmode) == 0) { + // check that packages and static modules are not used as values + Symbol sym = tree.symbol(); + if (sym != null && sym.kind != ERROR && !sym.isValue() && tree.isTerm()) { + new TextTreePrinter().print(tree).println().end();//debug + error(tree.pos, tree.symbol() + " is not a value"); + } + } + } else if ((mode & (PATTERNmode | FUNmode)) == PATTERNmode) { + switch (tree) { + case Ident(_): + case Select(_, _): + if (!tree.type.unalias().symbol().isCaseClass()) + checkStable(tree); } } @@ -1772,7 +1794,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { tpe1 = gen.mkType(rhs.pos, rhs.type); // rhs already attributed by defineSym in this case } else if (rhs != Tree.Empty) { - if ((mods & CASE) != 0) { + if ((mods & CASEACCESSOR) != 0) { //rhs was already attribute } else { pushContext(tree, sym, context.scope); @@ -2010,24 +2032,7 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { ArrayApply.toString(argtypes, "[", ",", "]")); case Apply(Tree fn, Tree[] args): - Tree tree1 = transformApply(tree, fn, args); - - // handle the case of a case method call specially. - Symbol fsym = TreeInfo.methSymbol(tree1); - if ((mode & (EXPRmode | FUNmode)) == EXPRmode && - fsym != null && (fsym.flags & CASE) != 0) { - Symbol constr = fsym.owner().info() - .lookup(fsym.name.toTypeName()).constructor(); - Template templ = make.Template( - tree1.pos, - new Tree[]{desugarize.toConstructor(tree1, constr)}, - Tree.EMPTY_ARRAY); - templ.setSymbol(Symbol.NONE).setType(tree1.type); - return adapt( - make.New(tree1.pos, templ).setType(tree1.type.instanceType()), mode, pt); - } else { - return tree1; - } + return transformApply(tree, fn, args); case Super(Tree tpe): Symbol enclClazz = context.enclClass.owner; diff --git a/sources/scalac/typechecker/DeSugarize.java b/sources/scalac/typechecker/DeSugarize.java index 43e74dbaec..ae7dd9b970 100644 --- a/sources/scalac/typechecker/DeSugarize.java +++ b/sources/scalac/typechecker/DeSugarize.java @@ -506,7 +506,7 @@ public class DeSugarize implements Kinds, Modifiers { case ValDef(int mods, Name name, Tree tpe, Tree rhs): Name valname = Name.fromString(name + "$"); Tree valdef1 = copy.ValDef( - tree, (mods & (DEFERRED | MUTABLE | CASE | MODUL)) | PRIVATE, + tree, (mods & (DEFERRED | MUTABLE | CASEACCESSOR | MODUL)) | PRIVATE, valname, tpe, rhs); int mods1 = mods | ACCESSOR; if ((mods1 & MUTABLE) == 0) mods1 |= STABLE; @@ -687,7 +687,7 @@ public class DeSugarize implements Kinds, Modifiers { //System.out.println("add case for " + vparam.name);//DEBUG ts.append( make.ValDef( - vparam.pos, CASE, vparam.name, vparam.tpe, + vparam.pos, CASEACCESSOR, vparam.name, vparam.tpe, make.Ident(vparam.pos, vparam.name) .setSymbol(vparam.symbol()).setType(vparam.symbol().type()))); } |