summaryrefslogtreecommitdiff
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
parentcce804c34f58e904cdc66889ba9990b3edd827f5 (diff)
downloadscala-5fdf691280325593178fb60c1eee97255dcddf8a.tar.gz
scala-5fdf691280325593178fb60c1eee97255dcddf8a.tar.bz2
scala-5fdf691280325593178fb60c1eee97255dcddf8a.zip
*** empty log message ***
-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
-rw-r--r--test/files/neg/S7.check2
-rw-r--r--test/files/neg/bug71.check4
-rw-r--r--test/files/neg/bug71.scala10
-rw-r--r--test/files/pos/michel2.scala19
-rw-r--r--test/files/pos/override.scala2
-rw-r--r--test/neg/S7.check2
-rw-r--r--test/neg/bug71.check4
-rw-r--r--test/neg/bug71.scala10
-rw-r--r--test/pos/michel2.scala19
-rw-r--r--test/pos/override.scala2
24 files changed, 91 insertions, 111 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);
diff --git a/test/files/neg/S7.check b/test/files/neg/S7.check
index 59c57786b3..c12c624cd7 100644
--- a/test/files/neg/S7.check
+++ b/test/files/neg/S7.check
@@ -1,4 +1,4 @@
S7.scala:6: illegal cyclic reference involving class S7.A
class C() extends a.A() {}
- ^
+ ^
one error found
diff --git a/test/files/neg/bug71.check b/test/files/neg/bug71.check
deleted file mode 100644
index 8a939dbbae..0000000000
--- a/test/files/neg/bug71.check
+++ /dev/null
@@ -1,4 +0,0 @@
-bug71.scala:3: class ga2 needs to be abstract, since method foo in class gu.ga1 is not defined
-object ga2 extends gu.ga1() {
- ^
-one error found
diff --git a/test/files/neg/bug71.scala b/test/files/neg/bug71.scala
deleted file mode 100644
index 67c3cdd7f9..0000000000
--- a/test/files/neg/bug71.scala
+++ /dev/null
@@ -1,10 +0,0 @@
-// ga2
-
-object ga2 extends gu.ga1() {
- // implementation of foo()
- def foo():java.lang.String = "foo";
- // my main inherited
- def main( args:Array[String] ):Unit = {
- mymain ();
- }
-}
diff --git a/test/files/pos/michel2.scala b/test/files/pos/michel2.scala
index d5b61dda21..e6976b0f40 100644
--- a/test/files/pos/michel2.scala
+++ b/test/files/pos/michel2.scala
@@ -1,7 +1,16 @@
-trait A extends Object {
- def f : Int = 1
+object Test {
+
+ trait A extends Object {
+ def f : Int = 1
+ }
+
+ class B extends Object with A {
+ override def f : Int = super[A].f
+ }
+
+ def main(args: Array[String]) =
+ System.out.println(new B().f);
}
-trait B extends Object with A {
- override def f : Int = super.f
-} \ No newline at end of file
+
+
diff --git a/test/files/pos/override.scala b/test/files/pos/override.scala
index a6c81c9b8a..9f068b8ecd 100644
--- a/test/files/pos/override.scala
+++ b/test/files/pos/override.scala
@@ -8,7 +8,7 @@ trait B extends Object {
}
trait C extends Object with A with B {
- override def f = super.f;
+ override def f = super[B].f;
val a: A;
val x: a.type = a;
}
diff --git a/test/neg/S7.check b/test/neg/S7.check
index 59c57786b3..c12c624cd7 100644
--- a/test/neg/S7.check
+++ b/test/neg/S7.check
@@ -1,4 +1,4 @@
S7.scala:6: illegal cyclic reference involving class S7.A
class C() extends a.A() {}
- ^
+ ^
one error found
diff --git a/test/neg/bug71.check b/test/neg/bug71.check
deleted file mode 100644
index 8a939dbbae..0000000000
--- a/test/neg/bug71.check
+++ /dev/null
@@ -1,4 +0,0 @@
-bug71.scala:3: class ga2 needs to be abstract, since method foo in class gu.ga1 is not defined
-object ga2 extends gu.ga1() {
- ^
-one error found
diff --git a/test/neg/bug71.scala b/test/neg/bug71.scala
deleted file mode 100644
index 67c3cdd7f9..0000000000
--- a/test/neg/bug71.scala
+++ /dev/null
@@ -1,10 +0,0 @@
-// ga2
-
-object ga2 extends gu.ga1() {
- // implementation of foo()
- def foo():java.lang.String = "foo";
- // my main inherited
- def main( args:Array[String] ):Unit = {
- mymain ();
- }
-}
diff --git a/test/pos/michel2.scala b/test/pos/michel2.scala
index d5b61dda21..e6976b0f40 100644
--- a/test/pos/michel2.scala
+++ b/test/pos/michel2.scala
@@ -1,7 +1,16 @@
-trait A extends Object {
- def f : Int = 1
+object Test {
+
+ trait A extends Object {
+ def f : Int = 1
+ }
+
+ class B extends Object with A {
+ override def f : Int = super[A].f
+ }
+
+ def main(args: Array[String]) =
+ System.out.println(new B().f);
}
-trait B extends Object with A {
- override def f : Int = super.f
-} \ No newline at end of file
+
+
diff --git a/test/pos/override.scala b/test/pos/override.scala
index a6c81c9b8a..9f068b8ecd 100644
--- a/test/pos/override.scala
+++ b/test/pos/override.scala
@@ -8,7 +8,7 @@ trait B extends Object {
}
trait C extends Object with A with B {
- override def f = super.f;
+ override def f = super[B].f;
val a: A;
val x: a.type = a;
}