diff options
author | Martin Odersky <odersky@gmail.com> | 2005-11-24 17:01:23 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2005-11-24 17:01:23 +0000 |
commit | b7e1ffda4843cc55cfbff2d9855b20917a14b2af (patch) | |
tree | 3a6fa6f285edf0abd5b030bc9c35e3dca5d263f0 /sources | |
parent | 029c7504a5f072c337ff0dd1e09f90cef0c8e95d (diff) | |
download | scala-b7e1ffda4843cc55cfbff2d9855b20917a14b2af.tar.gz scala-b7e1ffda4843cc55cfbff2d9855b20917a14b2af.tar.bz2 scala-b7e1ffda4843cc55cfbff2d9855b20917a14b2af.zip |
*** empty log message ***
Diffstat (limited to 'sources')
-rwxr-xr-x | sources/scala/tools/nsc/transform/Constructors.scala | 26 | ||||
-rwxr-xr-x | sources/scala/tools/nsc/typechecker/Codification.scala | 4 |
2 files changed, 26 insertions, 4 deletions
diff --git a/sources/scala/tools/nsc/transform/Constructors.scala b/sources/scala/tools/nsc/transform/Constructors.scala index bd21b499cc..88162c9850 100755 --- a/sources/scala/tools/nsc/transform/Constructors.scala +++ b/sources/scala/tools/nsc/transform/Constructors.scala @@ -75,6 +75,7 @@ abstract class Constructors extends Transform { val defBuf = new ListBuffer[Tree]; val constrStatBuf = new ListBuffer[Tree]; + val constrPrefixBuf = new ListBuffer[Tree]; constrBody.stats foreach (constrStatBuf +=); for (val stat <- stats) stat match { @@ -92,7 +93,9 @@ abstract class Constructors extends Transform { assert(stat.symbol.getter != NoSymbol, stat) else { if (rhs != EmptyTree) { - constrStatBuf += mkAssign(stat.symbol, intoConstructor(stat.symbol, rhs)); + val rhs1 = intoConstructor(stat.symbol, rhs); + (if (refersToThis(rhs1)) constrStatBuf else constrPrefixBuf) + += mkAssign(stat.symbol, rhs1) } defBuf += copy.ValDef(stat, mods, name, tpt, EmptyTree) } @@ -128,7 +131,10 @@ abstract class Constructors extends Transform { defBuf += copy.DefDef( constr, constr.mods, constr.name, constr.tparams, constr.vparamss, constr.tpt, - copy.Block(constrBody, paramInits ::: constrStatBuf.toList, constrBody.expr)); + copy.Block( + constrBody, + paramInits ::: constrPrefixBuf.toList ::: constrStatBuf.toList, + constrBody.expr)); copy.Template(impl, impl.parents, defBuf.toList filter (stat => isAccessed(stat.symbol))) } @@ -140,4 +146,20 @@ abstract class Constructors extends Transform { super.transform(tree) } } + + def refersToThis(tree: Tree): boolean = { + refersToThisTraverser.result = false; + refersToThisTraverser.traverse(tree); + refersToThisTraverser.result + } + + object refersToThisTraverser extends Traverser { + var result: boolean = _; + override def traverse(tree: Tree) = { + tree match { + case This(_) => result = true; + case _ => super.traverse(tree) + } + } + } } diff --git a/sources/scala/tools/nsc/typechecker/Codification.scala b/sources/scala/tools/nsc/typechecker/Codification.scala index 3c1b53b952..aa387ea10b 100755 --- a/sources/scala/tools/nsc/typechecker/Codification.scala +++ b/sources/scala/tools/nsc/typechecker/Codification.scala @@ -187,9 +187,9 @@ import scala.tools.nsc.util.{ListBuffer, FreshNameCreator}; */ def codify(tree: Tree): Tree = { val reified = reify(tree); - System.out.println("reified = " + reified); + if (settings.debug.value) log("reified = " + reified); val injected = inject(reified); - System.out.println("injected = " + injected); + if (settings.debug.value) log("injected = " + injected); New(TypeTree(appliedType(definitions.TypedCodeClass.typeConstructor, List(tree.tpe))), List(List(injected))); |