summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-03-20 11:40:33 +0000
committerMartin Odersky <odersky@gmail.com>2003-03-20 11:40:33 +0000
commitf449cd95e9e1805f50b1c267c6b18c281673cb3b (patch)
treea18f790688b6a73993aca13d744652c7bd2f1ab5
parent6440a65cbedc6751122d191a9fe119f72a8d0d5f (diff)
downloadscala-f449cd95e9e1805f50b1c267c6b18c281673cb3b.tar.gz
scala-f449cd95e9e1805f50b1c267c6b18c281673cb3b.tar.bz2
scala-f449cd95e9e1805f50b1c267c6b18c281673cb3b.zip
*** empty log message ***
-rw-r--r--sources/scalac/ast/Transformer.java1
-rw-r--r--sources/scalac/ast/TreeInfo.java1
-rw-r--r--sources/scalac/ast/parser/Parser.java13
-rw-r--r--sources/scalac/symtab/Modifiers.java5
-rw-r--r--sources/scalac/symtab/Symbol.java2
-rw-r--r--sources/scalac/transformer/AddAccessors.java3
-rw-r--r--sources/scalac/typechecker/Analyzer.java61
-rw-r--r--sources/scalac/typechecker/DeSugarize.java4
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())));
}