diff options
author | Martin Odersky <odersky@gmail.com> | 2010-04-09 16:22:02 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2010-04-09 16:22:02 +0000 |
commit | 2dba26ed12c86c63a568b85a4c094c22c7937412 (patch) | |
tree | 0c83870326e9fe3a8220ec49835eb4e463b1f9d6 /src/compiler/scala/tools/nsc/transform/LambdaLift.scala | |
parent | c46a200d8cead57030d007ca841e23ccdcd7bd55 (diff) | |
download | scala-2dba26ed12c86c63a568b85a4c094c22c7937412.tar.gz scala-2dba26ed12c86c63a568b85a4c094c22c7937412.tar.bz2 scala-2dba26ed12c86c63a568b85a4c094c22c7937412.zip |
Interrupted attempt to fix #2897.
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/LambdaLift.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/LambdaLift.scala | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala index b24b263b7a..6ed0bfcccb 100644 --- a/src/compiler/scala/tools/nsc/transform/LambdaLift.scala +++ b/src/compiler/scala/tools/nsc/transform/LambdaLift.scala @@ -331,6 +331,17 @@ abstract class LambdaLift extends InfoTransform { lifted(MethodType(sym.info.params ::: addParams, sym.info.resultType))) treeCopy.DefDef(tree, mods, name, tparams, List(vparams ::: freeParams), tpt, rhs) case ClassDef(mods, name, tparams, impl @ Template(parents, self, body)) => + // Disabled attempt to to add getters to freeParams + // this does not work yet. Problem is that local symbols need local names + // and references to local symbols need to be transformed into + // method calls to setters. + // def paramGetter(param: Symbol): Tree = { + // val getter = param.newGetter setFlag TRANS_FLAG resetFlag PARAMACCESSOR // mark because we have to add them to interface + // sym.info.decls.enter(getter) + // val rhs = Select(gen.mkAttributedThis(sym), param) setType param.tpe + // DefDef(getter, rhs) setPos tree.pos setType NoType + // } + // val newDefs = if (sym.isTrait) freeParams ::: (ps map paramGetter) else freeParams treeCopy.ClassDef(tree, mods, name, tparams, treeCopy.Template(impl, parents, self, body ::: freeParams)) } @@ -338,6 +349,38 @@ abstract class LambdaLift extends InfoTransform { tree } +/* Something like this will be necessary to eliminate the implementation + * restiction from paramGetter above: + * We need to pass getters to the interface of an implementation class. + private def fixTraitGetters(lifted: List[Tree]): List[Tree] = + for (stat <- lifted) yield stat match { + case ClassDef(mods, name, tparams, templ @ Template(parents, self, body)) + if stat.symbol.isTrait && !stat.symbol.isImplClass => + val iface = stat.symbol + lifted.find(l => l.symbol.isImplClass && l.symbol.toInterface == iface) match { + case Some(implDef) => + val impl = implDef.symbol + val implGetters = impl.info.decls.toList filter (_ hasFlag TRANS_FLAG) + if (implGetters.nonEmpty) { + val ifaceGetters = implGetters map { ig => + ig resetFlag TRANS_FLAG + val getter = ig cloneSymbol iface setFlag DEFERRED + iface.info.decls enter getter + getter + } + val ifaceGetterDefs = ifaceGetters map (DefDef(_, EmptyTree) setType NoType) + treeCopy.ClassDef( + stat, mods, name, tparams, + treeCopy.Template(templ, parents, self, body ::: ifaceGetterDefs)) + } else + stat + case None => + stat + } + case _ => + stat + } +*/ private def liftDef(tree: Tree): Tree = { val sym = tree.symbol if (sym.owner.isAuxiliaryConstructor && sym.isMethod) // # bug 1909 @@ -411,7 +454,7 @@ abstract class LambdaLift extends InfoTransform { override def transformStats(stats: List[Tree], exprOwner: Symbol): List[Tree] = { def addLifted(stat: Tree): Tree = stat match { case ClassDef(mods, name, tparams, impl @ Template(parents, self, body)) => - val lifted = liftedDefs(stat.symbol).toList map addLifted + val lifted = /*fixTraitGetters*/(liftedDefs(stat.symbol).toList map addLifted) val result = treeCopy.ClassDef( stat, mods, name, tparams, treeCopy.Template(impl, parents, self, body ::: lifted)) liftedDefs -= stat.symbol |