diff options
Diffstat (limited to 'sources')
-rw-r--r-- | sources/meta/scalac/ast/Tree.java | 5 | ||||
-rw-r--r-- | sources/scala/collection/mutable/Stack.scala | 2 | ||||
-rw-r--r-- | sources/scalac/ast/TreeGen.java | 2 | ||||
-rw-r--r-- | sources/scalac/ast/TreeInfo.java | 2 | ||||
-rw-r--r-- | sources/scalac/ast/parser/Parser.java | 32 | ||||
-rw-r--r-- | sources/scalac/ast/printer/TextTreePrinter.java | 11 | ||||
-rw-r--r-- | sources/scalac/backend/jvm/GenJVM.java | 4 | ||||
-rw-r--r-- | sources/scalac/backend/jvm/GenJVMBCEL.java | 6 | ||||
-rw-r--r-- | sources/scalac/backend/msil/GenMSIL.java | 4 | ||||
-rw-r--r-- | sources/scalac/transformer/AddInterfaces.java | 2 | ||||
-rw-r--r-- | sources/scalac/transformer/Erasure.java | 2 | ||||
-rw-r--r-- | sources/scalac/transformer/ExpandMixins.java | 2 | ||||
-rw-r--r-- | sources/scalac/transformer/ExplicitOuterClasses.java | 2 | ||||
-rw-r--r-- | sources/scalac/typechecker/Analyzer.java | 52 |
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); |