summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2005-11-24 17:01:23 +0000
committerMartin Odersky <odersky@gmail.com>2005-11-24 17:01:23 +0000
commitb7e1ffda4843cc55cfbff2d9855b20917a14b2af (patch)
tree3a6fa6f285edf0abd5b030bc9c35e3dca5d263f0
parent029c7504a5f072c337ff0dd1e09f90cef0c8e95d (diff)
downloadscala-b7e1ffda4843cc55cfbff2d9855b20917a14b2af.tar.gz
scala-b7e1ffda4843cc55cfbff2d9855b20917a14b2af.tar.bz2
scala-b7e1ffda4843cc55cfbff2d9855b20917a14b2af.zip
*** empty log message ***
-rwxr-xr-xsources/scala/tools/nsc/transform/Constructors.scala26
-rwxr-xr-xsources/scala/tools/nsc/typechecker/Codification.scala4
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)));