summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/Constructors.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-04-12 18:23:58 +0000
committerMartin Odersky <odersky@gmail.com>2007-04-12 18:23:58 +0000
commiteecb5e5c4cdc96c2ea4e58a0c4b735eeffbee043 (patch)
treed6e914ff40d9b3499ac64856e6f37b7c394298c9 /src/compiler/scala/tools/nsc/transform/Constructors.scala
parent5d449bfbc1a39aaf2cb78f04241990c8c6c37d5f (diff)
downloadscala-eecb5e5c4cdc96c2ea4e58a0c4b735eeffbee043.tar.gz
scala-eecb5e5c4cdc96c2ea4e58a0c4b735eeffbee043.tar.bz2
scala-eecb5e5c4cdc96c2ea4e58a0c4b735eeffbee043.zip
added early field initialization.
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/Constructors.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala
index d9355bf24e..71f9c9d828 100644
--- a/src/compiler/scala/tools/nsc/transform/Constructors.scala
+++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala
@@ -120,7 +120,25 @@ abstract class Constructors extends Transform {
val defBuf = new ListBuffer[Tree]
val constrStatBuf = new ListBuffer[Tree]
val constrPrefixBuf = new ListBuffer[Tree]
- constrBody.stats foreach (constrStatBuf +=)
+ val presupers = treeInfo.preSuperFields(stats)
+ for (val stat <- constrBody.stats) {
+ constrStatBuf += stat
+ stat match {
+ case ValDef(mods, name, _, _) if (mods hasFlag PRESUPER) =>
+ constrStatBuf +=
+ localTyper.typed {
+ atPos(stat.pos) {
+ val fields = presupers filter (
+ vdef => nme.localToGetter(vdef.name) == name)
+ assert(fields.length == 1)
+ Assign(
+ gen.mkAttributedRef(clazz.thisType, fields.head.symbol),
+ Ident(stat.symbol))
+ }
+ }
+ case _ =>
+ }
+ }
for (val stat <- stats) stat match {
case DefDef(mods, name, tparams, vparamss, tpt, rhs) =>