summaryrefslogtreecommitdiff
path: root/sources
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2003-08-15 12:54:18 +0000
committerMartin Odersky <odersky@gmail.com>2003-08-15 12:54:18 +0000
commit5fdf691280325593178fb60c1eee97255dcddf8a (patch)
treeb577b7a9c9b5cc5fafef1f03686331905bd71e48 /sources
parentcce804c34f58e904cdc66889ba9990b3edd827f5 (diff)
downloadscala-5fdf691280325593178fb60c1eee97255dcddf8a.tar.gz
scala-5fdf691280325593178fb60c1eee97255dcddf8a.tar.bz2
scala-5fdf691280325593178fb60c1eee97255dcddf8a.zip
*** empty log message ***
Diffstat (limited to 'sources')
-rw-r--r--sources/meta/scalac/ast/Tree.java5
-rw-r--r--sources/scala/collection/mutable/Stack.scala2
-rw-r--r--sources/scalac/ast/TreeGen.java2
-rw-r--r--sources/scalac/ast/TreeInfo.java2
-rw-r--r--sources/scalac/ast/parser/Parser.java32
-rw-r--r--sources/scalac/ast/printer/TextTreePrinter.java11
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java4
-rw-r--r--sources/scalac/backend/jvm/GenJVMBCEL.java6
-rw-r--r--sources/scalac/backend/msil/GenMSIL.java4
-rw-r--r--sources/scalac/transformer/AddInterfaces.java2
-rw-r--r--sources/scalac/transformer/Erasure.java2
-rw-r--r--sources/scalac/transformer/ExpandMixins.java2
-rw-r--r--sources/scalac/transformer/ExplicitOuterClasses.java2
-rw-r--r--sources/scalac/typechecker/Analyzer.java52
14 files changed, 59 insertions, 69 deletions
diff --git a/sources/meta/scalac/ast/Tree.java b/sources/meta/scalac/ast/Tree.java
index 39f15f0bfc..a01919d56e 100644
--- a/sources/meta/scalac/ast/Tree.java
+++ b/sources/meta/scalac/ast/Tree.java
@@ -291,7 +291,8 @@ public class Tree {
n_Super.
setDescription("Super reference").
setRange(Phase.PARSER, Phase.END).
- addField(t_TypeName, "qualifier", SymName);
+ addField(t_TypeName, "qualifier", SymName).
+ addField(t_TypeName, "mixin");
n_This.
setDescription("Self reference").
@@ -327,7 +328,7 @@ public class Tree {
setDescription("Type selection").
setRange(Phase.PARSER, Phase.REFCHECK).
addField(t_TypeTree, "qualifier").
- addField(t_TestName, "selector", SymName);
+ addField(t_TypeName, "selector", SymName);
n_FunType.
setDescription("Function type").
diff --git a/sources/scala/collection/mutable/Stack.scala b/sources/scala/collection/mutable/Stack.scala
index db224c1ff7..51e5e89c73 100644
--- a/sources/scala/collection/mutable/Stack.scala
+++ b/sources/scala/collection/mutable/Stack.scala
@@ -77,7 +77,7 @@ class Stack[A] with MutableList[A] with StructuralEquality[Stack[A]] {
*
* @returns the created list.
*/
- override def toList: List[A] = super.toList.reverse;
+ override def toList: List[A] = super[MutableList].toList.reverse;
/** Checks if two stacks are structurally identical.
*
diff --git a/sources/scalac/ast/TreeGen.java b/sources/scalac/ast/TreeGen.java
index 863c652090..36729e3270 100644
--- a/sources/scalac/ast/TreeGen.java
+++ b/sources/scalac/ast/TreeGen.java
@@ -494,7 +494,7 @@ public class TreeGen implements Kinds, Modifiers {
/** Build and attribute super node with given type.
*/
public Tree Super(int pos, Symbol sym) {
- return make.Super(pos, sym).setType(sym.thisType());
+ return make.Super(pos, sym, TypeNames.EMPTY).setType(sym.thisType());
}
/** Build and attribute value/variable/let definition node whose signature
diff --git a/sources/scalac/ast/TreeInfo.java b/sources/scalac/ast/TreeInfo.java
index bc5e03f9b8..fc12935250 100644
--- a/sources/scalac/ast/TreeInfo.java
+++ b/sources/scalac/ast/TreeInfo.java
@@ -95,7 +95,7 @@ public class TreeInfo {
switch (tree) {
case Empty:
case This(_):
- case Super(_):
+ case Super(_, _):
return true;
case Ident(_):
assert tree.type != null : tree.toString();
diff --git a/sources/scalac/ast/parser/Parser.java b/sources/scalac/ast/parser/Parser.java
index 7212745657..3bcb1c4045 100644
--- a/sources/scalac/ast/parser/Parser.java
+++ b/sources/scalac/ast/parser/Parser.java
@@ -526,7 +526,8 @@ public class Parser implements Tokens {
if (!thisOK || s.token == DOT)
t = selectors(accept(DOT), t, typeOK);
} else if (s.token == SUPER) {
- t = make.Super(s.skipToken(), TypeNames.EMPTY);
+ t = make.Super(
+ s.skipToken(), TypeNames.EMPTY, mixinQualifierOpt());
t = make.Select(accept(DOT), t, ident());
if (s.token == DOT)
t = selectors(s.skipToken(), t, typeOK);
@@ -542,7 +543,8 @@ public class Parser implements Tokens {
t = selectors(accept(DOT), t, typeOK);
} else if (s.token == SUPER) {
s.nextToken();
- t = make.Super(i.pos, i.name.toTypeName());
+ t = make.Super(
+ i.pos, i.name.toTypeName(), mixinQualifierOpt());
t = make.Select(accept(DOT), t, ident());
if (s.token == DOT)
t = selectors(s.skipToken(), t, typeOK);
@@ -567,9 +569,22 @@ public class Parser implements Tokens {
}
}
+ /** MixinQualifier ::= `(' Id `)'
+ */
+ Name mixinQualifierOpt() {
+ if (s.token == LBRACKET) {
+ s.nextToken();
+ Name name = ident().toTypeName();
+ accept(RBRACKET);
+ return name;
+ } else {
+ return TypeNames.EMPTY;
+ }
+ }
+
/** StableId ::= Id
* | StableRef `.' Id
- * | [Ident '.'] super `.' Id
+ * | [Id '.'] super [MixinQualifier] ` `.' Id
*/
Tree stableId() {
return stableRef(false, false);
@@ -937,7 +952,6 @@ public class Parser implements Tokens {
* | BlockExpr
* | new Template
* | SimpleExpr `.' Id
- * | Id `#' Id
* | SimpleExpr TypeArgs
* | SimpleExpr ArgumentExprs
*/
@@ -999,16 +1013,6 @@ public class Parser implements Tokens {
case DOT:
t = make.Select(s.skipToken(), t, ident());
break;
- case HASH:
- switch (t) {
- case Ident(Name name):
- t = make.SelectFromType(
- s.skipToken(), convertToTypeId(t), ident());
- break;
- default:
- return t;
- }
- break;
case LBRACKET:
switch (t) {
case Ident(_):
diff --git a/sources/scalac/ast/printer/TextTreePrinter.java b/sources/scalac/ast/printer/TextTreePrinter.java
index 20013c0711..07859f0215 100644
--- a/sources/scalac/ast/printer/TextTreePrinter.java
+++ b/sources/scalac/ast/printer/TextTreePrinter.java
@@ -487,12 +487,17 @@ public class TextTreePrinter implements TreePrinter {
printType(tree);
break;
- case Super(Name name):
- if (name != TypeNames.EMPTY) {
- printSymbolUse(tree.symbol(), name);
+ case Super(Name qualifier, Name mixin):
+ if (qualifier != TypeNames.EMPTY) {
+ printSymbolUse(tree.symbol(), qualifier);
print(TXT_DOT);
}
print(KW_SUPER);
+ if (mixin != TypeNames.EMPTY) {
+ print(TXT_LEFT_PAREN);
+ print(mixin.toString());
+ print(TXT_RIGHT_PAREN);
+ }
printType(tree);
break;
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java
index 980cc7e23f..153a30ca0b 100644
--- a/sources/scalac/backend/jvm/GenJVM.java
+++ b/sources/scalac/backend/jvm/GenJVM.java
@@ -378,7 +378,7 @@ class GenJVM {
boolean isConstrCall = (funSym.name == CONSTRUCTOR_NAME);
boolean isSuperCall;
switch (fun) {
- case Select(Super(_), _): isSuperCall = true; break;
+ case Select(Super(_, _), _): isSuperCall = true; break;
default: isSuperCall = false; break;
}
@@ -482,7 +482,7 @@ class GenJVM {
} break;
case This(_):
- case Super(_):
+ case Super(_, _):
ctx.code.emitALOAD_0();
generatedType = JAVA_LANG_OBJECT_T;
break;
diff --git a/sources/scalac/backend/jvm/GenJVMBCEL.java b/sources/scalac/backend/jvm/GenJVMBCEL.java
index c9a2ed5031..cb26af50d9 100644
--- a/sources/scalac/backend/jvm/GenJVMBCEL.java
+++ b/sources/scalac/backend/jvm/GenJVMBCEL.java
@@ -319,7 +319,7 @@ class GenJVMBCEL {
boolean isConstrCall = (funSym.name == CONSTRUCTOR_NAME);
boolean isSuperCall;
switch (fun) {
- case Select(Super(_), _): isSuperCall = true; break;
+ case Select(Super(_, _), _): isSuperCall = true; break;
default: isSuperCall = false; break;
}
@@ -479,7 +479,7 @@ class GenJVMBCEL {
break;
case Sequence(_):
- case Super(_):
+ case Super(_, _):
case ModuleDef(_,_,_,_):
case PatDef(_,_,_):
case Import(_, _):
@@ -628,7 +628,7 @@ class GenJVMBCEL {
protected void genLoadQualifier(Tree tree) {
switch (tree) {
- case Select(Super(_), _):
+ case Select(Super(_, _), _):
case Ident(_):
currIL.append(ic.THIS);
break;
diff --git a/sources/scalac/backend/msil/GenMSIL.java b/sources/scalac/backend/msil/GenMSIL.java
index eb4ba27c1c..350cf84453 100644
--- a/sources/scalac/backend/msil/GenMSIL.java
+++ b/sources/scalac/backend/msil/GenMSIL.java
@@ -586,7 +586,7 @@ public class GenMSIL /*implements Modifiers */ {
case This(_):
return items.SelfItem(tc.getType(currentClass));
- case Super(_):
+ case Super(_, _):
//logErr("Not implemented yet: Super(" + Debug.show(sym) + ")");
//log("gen.Super(_): Super.symbol() = " + dumpSym(sym));
//log("gen.Super(tpe): tpe.symbol() = " + dumpSym(tpe.symbol()));
@@ -831,7 +831,7 @@ public class GenMSIL /*implements Modifiers */ {
//Debug.show(qualifier.type()));
/// FIXME after the Super attribution is correct
switch (qualifier) {
- case Super(_):
+ case Super(_, _):
load(items.SelfItem(tc.getType(currentClass)));
break;
default:
diff --git a/sources/scalac/transformer/AddInterfaces.java b/sources/scalac/transformer/AddInterfaces.java
index 18d7f296e3..fadc2eed35 100644
--- a/sources/scalac/transformer/AddInterfaces.java
+++ b/sources/scalac/transformer/AddInterfaces.java
@@ -152,7 +152,7 @@ class AddInterfaces extends Transformer {
return gen.This(tree.pos, classThisSym);
}
- case Select(Super(_), _): {
+ case Select(Super(_, _), _): {
// Use class member symbols for references to "super".
Symbol sym = tree.symbol();
diff --git a/sources/scalac/transformer/Erasure.java b/sources/scalac/transformer/Erasure.java
index aceb0b03f1..a42f61d9dd 100644
--- a/sources/scalac/transformer/Erasure.java
+++ b/sources/scalac/transformer/Erasure.java
@@ -507,7 +507,7 @@ public class Erasure extends Transformer implements Modifiers {
case PackageDef(_,_):
case Template(_,_):
case Sequence(_): // !!! ? [BE:was Tuple before]
- case Super(_):
+ case Super(_, _):
case This(_):
case Literal(_):
case TypeTerm():
diff --git a/sources/scalac/transformer/ExpandMixins.java b/sources/scalac/transformer/ExpandMixins.java
index 07e8a587a5..41816b58f9 100644
--- a/sources/scalac/transformer/ExpandMixins.java
+++ b/sources/scalac/transformer/ExpandMixins.java
@@ -114,7 +114,7 @@ public class ClassExpander {
Transformer superFixer = new Transformer(global) {
public Tree transform(Tree tree) {
switch (tree) {
- case Select(Super(_), _):
+ case Select(Super(_, _), _):
Symbol symbol = map.lookupSymbol(tree.symbol());
if (symbol != null)
return gen.Select(gen.This(tree.pos, clasz), symbol);
diff --git a/sources/scalac/transformer/ExplicitOuterClasses.java b/sources/scalac/transformer/ExplicitOuterClasses.java
index b71a063b5d..a9977a11ef 100644
--- a/sources/scalac/transformer/ExplicitOuterClasses.java
+++ b/sources/scalac/transformer/ExplicitOuterClasses.java
@@ -203,7 +203,7 @@ public class ExplicitOuterClasses extends Transformer {
return super.transform(tree);
}
- case Select(Super(_), Name selector): {
+ case Select(Super(_, _), Name selector): {
// If "super" refers to an outer class, access the value
// (a method) through outer link(s).
int level = outerLevel(((Select)tree).qualifier.symbol());
diff --git a/sources/scalac/typechecker/Analyzer.java b/sources/scalac/typechecker/Analyzer.java
index fa1d391f1c..03e70c423f 100644
--- a/sources/scalac/typechecker/Analyzer.java
+++ b/sources/scalac/typechecker/Analyzer.java
@@ -2271,11 +2271,22 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
infer.applyErrorMsg(
"", fn1, " cannot be applied to ", argtypes, pt));
- case Super(Name name):
- Symbol clazz = qualifyingClass(tree, name);
+ case Super(Name qualifier, Name mixin):
+ Symbol clazz = qualifyingClass(tree, qualifier);
tree.setSymbol(clazz);
if (clazz == Symbol.ERROR) return tree.setType(Type.ErrorType);
- return tree.setType(Type.compoundType(clazz.parents(), Scope.EMPTY).symbol().thisType());
+ Type[] parents = clazz.parents();
+ if (mixin == TypeNames.EMPTY) {
+ return tree.setType(parents[0].instanceType());
+ } else {
+ for (int i = 1; i < parents.length; i++) {
+ if (parents[i].symbol().name == mixin) {
+ return tree.setType(parents[i].instanceType());
+ }
+ }
+ return error(tree.pos,
+ mixin + " does not name a mixin base class of " + clazz);
+ }
case This(Name name):
Symbol clazz = qualifyingClass(tree, name);
@@ -2355,39 +2366,8 @@ public class Analyzer extends Transformer implements Modifiers, Kinds {
.setType(checkObjectType(tree.pos, ref1.type.resultType()));
case SelectFromType(Tree qual, Name name):
- if ((mode & TYPEmode) != 0) {
- Tree qual1 = transform(qual, TYPEmode);
- return transformSelect(tree, qual1, name);
- } else {
- Symbol clazz = context.enclClass.owner;
- if (clazz != null) {
- Type[] parents = clazz.parents();
- Name qualname = ((Ident) qual).name;
- for (int i = 1; i < parents.length; i++) {
- if (parents[i].symbol().name == qualname) {
- Symbol bsym = parents[i].lookup(name);
- if (bsym.kind == NONE) {
- return error(tree.pos,
- decode(name) + " is not a member of " +
- parents[i]);
- } else if ((bsym.flags & PRIVATE) != 0) {
- return error(tree.pos,
- decode(name) + " is not accessible in " +
- parents[i]);
- }
- return gen.Select(
- tree.pos,
- gen.mkStableId(tree.pos, clazz.thisType()),
- bsym);
- }
- }
- return error(qual.pos,
- qual + " does not name a mixin base class");
- } else {
- return error(tree.pos, tree +
- " can be used only in a class, object, or template");
- }
- }
+ Tree qual1 = transform(qual, TYPEmode);
+ return transformSelect(tree, qual1, name);
case CompoundType(Tree[] parents, Tree[] refinements):
Tree[] parents1 = transform(parents, TYPEmode);