diff options
author | Martin Odersky <odersky@gmail.com> | 2003-03-05 17:07:52 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2003-03-05 17:07:52 +0000 |
commit | f00a69459a7b5ad8142daa700b0ede7a63c3957d (patch) | |
tree | 01e631309c448ce158e7eb14dd6d32c1acbcfdf7 /sources | |
parent | 8503fe1a88d596157c47146e816ce13297ec4e92 (diff) | |
download | scala-f00a69459a7b5ad8142daa700b0ede7a63c3957d.tar.gz scala-f00a69459a7b5ad8142daa700b0ede7a63c3957d.tar.bz2 scala-f00a69459a7b5ad8142daa700b0ede7a63c3957d.zip |
*** empty log message ***
Diffstat (limited to 'sources')
-rw-r--r-- | sources/scalac/ast/parser/Parser.java | 8 | ||||
-rw-r--r-- | sources/scalac/typechecker/Analyzer.java | 41 | ||||
-rw-r--r-- | sources/scalac/typechecker/DeSugarize.java | 7 |
3 files changed, 35 insertions, 21 deletions
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java index 2dca2ce14e..122f300412 100644 --- a/sources/scalac/ast/parser/Parser.java +++ b/sources/scalac/ast/parser/Parser.java @@ -1457,7 +1457,7 @@ public class Parser implements Tokens { } else if (s.token == EQUALS) { s.nextToken(); return make.TypeDef(pos, mods, name, type()); - } else if (s.token == SEMI || s.token == COMMA) { + } else if (s.token == SEMI || s.token == COMMA || s.token == RBRACE) { return make.TypeDef( pos, mods | Modifiers.DEFERRED, name, scalaDot(pos, Names.Any.toTypeName())); @@ -1488,7 +1488,7 @@ public class Parser implements Tokens { } /** ClassTemplate ::= extends Template - * | TemplateBody + * | [TemplateBody] */ Template classTemplate() { int pos = s.pos; @@ -1499,6 +1499,10 @@ public class Parser implements Tokens { return (Template)make.Template(pos, new Tree[]{scalaDot(pos, Names.Object.toConstrName())}, templateBody()); + } else if (s.token == SEMI || s.token == COMMA || s.token == RBRACE) { + return (Template)make.Template(pos, + new Tree[]{scalaDot(pos, Names.Object.toConstrName())}, + Tree.EMPTY_ARRAY); } else { syntaxError("`extends' or `{' expected", true); return (Template)make.Template(pos, diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java index 99693848ca..1a37745586 100644 --- a/sources/scalac/typechecker/Analyzer.java +++ b/sources/scalac/typechecker/Analyzer.java @@ -345,11 +345,16 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { * 3. Check that case classes do not inherit from case classes. */ void validateBaseTypes(Symbol clazz) { - if (clazz.type().parents().length > 1) - validateBaseTypes(clazz, clazz.type(), - new boolean[clazz.closure().length], 0); + validateBaseTypes(clazz, clazz.type().parents(), + new boolean[clazz.closure().length], 0); } //where + void validateBaseTypes(Symbol clazz, Type[] tps, boolean[] seen, int start) { + for (int i = tps.length - 1; i >= start; i--) { + validateBaseTypes(clazz, tps[i].unalias(), seen, i == 0 ? 0 : 1); + } + } + void validateBaseTypes(Symbol clazz, Type tp, boolean[] seen, int start) { Symbol baseclazz = tp.symbol(); if (baseclazz.kind == CLASS) { @@ -378,13 +383,10 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { // check that case classes do not inherit from case classes if (clazz.isCaseClass() && baseclazz.isCaseClass()) error(clazz.pos, "illegal inheritance;\n " + "case " + clazz + - "inherits from other case " + baseclazz); + " inherits from other case " + baseclazz); seen[index] = true; - Type[] parents = tp.parents(); - for (int i = parents.length - 1; i >= start; i--) { - validateBaseTypes(clazz, parents[i].unalias(), seen, i == 0 ? 0 : 1); - } + validateBaseTypes(clazz, tp.parents(), seen, start); } } @@ -761,12 +763,13 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { assert (mods & LOCKED) == 0 || sym.isAnonymousClass(): sym; // to catch repeated evaluations ((ClassDef) tree).mods |= LOCKED; - if ((mods & CASE) != 0 && vparams.length > 0) - templ.body = desugarize.addCaseElements(templ.body, vparams[0]); - pushContext(tree, sym.constructor(), new Scope(context.scope)); Symbol[] tparamSyms = enterParams(tparams); Symbol[][] vparamSyms = enterParams(vparams); + + if ((mods & CASE) != 0 && vparams.length > 0) + templ.body = desugarize.addCaseElements(templ.body, vparams[0]); + for (int i = 0; i < vparamSyms.length; i++) for (int j = 0; j < vparamSyms[i].length; j++) context.scope.unlink( @@ -810,7 +813,11 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { } owntype = tpe.type; } else { - ((ValDef) tree).rhs = rhs = transform(rhs, EXPRmode); + if ((mods & CASE) != 0) { + //rhs was already attributed + } else { + ((ValDef) tree).rhs = rhs = transform(rhs, EXPRmode); + } owntype = rhs.type; } popContext(); @@ -1609,9 +1616,13 @@ public class Analyzer extends Transformer implements Modifiers, Kinds { tpe1 = gen.mkType(rhs1.pos, rhs.type); // rhs already attributed by defineSym in this case } else if (rhs != Tree.Empty) { - pushContext(tree, sym, context.scope); - rhs1 = transform(rhs1, EXPRmode, sym.type()); - popContext(); + if ((mods & CASE) != 0) { + rhs1 = rhs; //rhs was already attributed + } else { + pushContext(tree, sym, context.scope); + rhs1 = transform(rhs1, EXPRmode, sym.type()); + popContext(); + } } return copy.ValDef(tree, mods, name, tpe1, rhs1) .setType(definitions.UNIT_TYPE); diff --git a/sources/scalac/typechecker/DeSugarize.java b/sources/scalac/typechecker/DeSugarize.java index 8638e0c45b..929d2c7275 100644 --- a/sources/scalac/typechecker/DeSugarize.java +++ b/sources/scalac/typechecker/DeSugarize.java @@ -675,12 +675,11 @@ public class DeSugarize implements Kinds, Modifiers { */ void addCaseElement(TreeList ts, ValDef vparam) { //System.out.println("add case for " + vparam.name);//DEBUG - Name name = vparam.name; - vparam.name = Name.fromString(name + "$"); ts.append( make.ValDef( - vparam.pos, CASE, name, vparam.tpe, - make.Ident(vparam.pos, vparam.name))); + vparam.pos, CASE, vparam.name, vparam.tpe, + make.Ident(vparam.pos, vparam.name) + .setSymbol(vparam.symbol()).setType(vparam.symbol().type()))); } /** add case constructor, value defintiions and access functions. |