summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-03-05 17:07:52 +0000
committerMartin Odersky <odersky@gmail.com>2003-03-05 17:07:52 +0000
commitf00a69459a7b5ad8142daa700b0ede7a63c3957d (patch)
tree01e631309c448ce158e7eb14dd6d32c1acbcfdf7 /sources
parent8503fe1a88d596157c47146e816ce13297ec4e92 (diff)
downloadscala-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.java8
-rw-r--r--sources/scalac/typechecker/Analyzer.java41
-rw-r--r--sources/scalac/typechecker/DeSugarize.java7
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.