summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala5
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala28
2 files changed, 24 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index cfe1b02f76..10f30a7f31 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -23,8 +23,6 @@ import transform.InfoTransform;
*
* - Local modules are replaced by variables and classes
* - Calls to case factory methods are replaced by new's.
- * - References to parameter accessors with aliases are replaced by super references to
- * these aliases.
* - eliminate branches in a conditional if the condition is a constant
*/
abstract class RefChecks extends InfoTransform {
@@ -607,13 +605,13 @@ abstract class RefChecks extends InfoTransform {
if (base.isTrait && sym.isTerm && mix == nme.EMPTY.toTypeName) {
val superAccName = nme.superName(sym.name);
val superAcc = base.info.decl(superAccName) suchThat (.alias.==(sym));
- assert(superAcc != NoSymbol, "" + sym + " " + base + " " + superAccName);//debug
val tree1 = Select(This(base), superAcc);
if (settings.debug.value) log("super-replacement: " + tree + "=>" + tree1);
result = atPos(tree.pos) {
Select(gen.mkAttributedThis(base), superAcc) setType superAcc.tpe
}
}
+/*
case This(_) =>
if ((sym hasFlag PARAMACCESSOR) && (sym.alias != NoSymbol)) {
result = typed {
@@ -624,6 +622,7 @@ abstract class RefChecks extends InfoTransform {
if (settings.debug.value)
System.out.println("alias replacement: " + tree + " ==> " + result);//debug
}
+*/
case _ =>
}
case _ =>
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
index a7c9206711..59dad92a0d 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
@@ -8,7 +8,10 @@ package scala.tools.nsc.typechecker;
import scala.collection.mutable.ListBuffer;
import nsc.symtab.Flags._;
-/** A sample transform.
+/** This phase adds super accessors for all super calls that
+ * either appear in a trait or have as a target a member of some outer class.
+ * It also replaces references to parameter accessors with aliases by super
+ * references to these aliases.
*/
abstract class SuperAccessors extends transform.Transform {
// inherits abstract value `global' and class `Phase' from Transform
@@ -43,19 +46,32 @@ abstract class SuperAccessors extends transform.Transform {
val body1 = transformTrees(body);
accDefs = accDefs.tail;
copy.Template(tree, parents, ownAccDefs.toList ::: body1);
+ case Select(qual @ This(_), name) =>
+ val sym = tree.symbol;
+ if ((sym hasFlag PARAMACCESSOR) && (sym.alias != NoSymbol)) {
+ val result = typed {
+ Select(
+ Super(qual.symbol, nme.EMPTY.toTypeName/*qual.symbol.info.parents.head.symbol.name*/) setPos qual.pos,
+ sym.alias) setPos tree.pos
+ }
+ if (settings.debug.value)
+ System.out.println("alias replacement: " + tree + " ==> " + result);//debug
+ transform(result)
+ } else tree
case Select(sup @ Super(_, mix), name) =>
+ val sym = tree.symbol;
val clazz = sup.symbol;
if (tree.isTerm && mix == nme.EMPTY.toTypeName &&
(clazz.isTrait || clazz != currentOwner.enclClass || !validCurrentOwner)) {
- val supername = nme.superName(tree.symbol.name);
- var superAcc = clazz.info.decl(supername).suchThat(.alias.==(tree.symbol));
+ val supername = nme.superName(sym.name);
+ var superAcc = clazz.info.decl(supername).suchThat(.alias.==(sym));
if (superAcc == NoSymbol) {
- if (settings.debug.value) log("add super acc " + tree.symbol + tree.symbol.locationString + " to `" + clazz);//debug
+ if (settings.debug.value) log("add super acc " + sym + sym.locationString + " to `" + clazz);//debug
superAcc =
clazz.newMethod(tree.pos, supername)
.setFlag(SUPERACCESSOR | PRIVATE)
- .setInfo(clazz.thisType.memberType(tree.symbol))
- .setAlias(tree.symbol)
+ .setInfo(clazz.thisType.memberType(sym))
+ .setAlias(sym)
clazz.info.decls enter superAcc;
accDefBuf(clazz) += typed(DefDef(superAcc, vparamss => EmptyTree))
}