diff options
author | Martin Odersky <odersky@gmail.com> | 2006-06-21 15:14:22 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-06-21 15:14:22 +0000 |
commit | 8446c6c7678de2b2df7b7e150ac106f564f41c86 (patch) | |
tree | aa9aa46cd73b44c09509e36b59cb582cebd95da4 | |
parent | 0d8b14c6055e76c0bff3b65d0f428d711abe1f5a (diff) | |
download | scala-8446c6c7678de2b2df7b7e150ac106f564f41c86.tar.gz scala-8446c6c7678de2b2df7b7e150ac106f564f41c86.tar.bz2 scala-8446c6c7678de2b2df7b7e150ac106f564f41c86.zip |
Fixed bug 629 by moving some code from RefCheck...
Fixed bug 629 by moving some code from RefChecks to SuperAccessors
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/RefChecks.scala | 5 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala | 28 |
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)) } |