summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2006-11-06 08:00:41 +0000
committermihaylov <mihaylov@epfl.ch>2006-11-06 08:00:41 +0000
commita4e49ea5acfcbdf2d8b0e5d55333562cf2848c67 (patch)
tree4a57536c834dd3cb9dccbe3320c0b107a9265b23 /src
parent8e56e0e55bfacfd23fae87ed2f07151e2240aeaa (diff)
downloadscala-a4e49ea5acfcbdf2d8b0e5d55333562cf2848c67.tar.gz
scala-a4e49ea5acfcbdf2d8b0e5d55333562cf2848c67.tar.bz2
scala-a4e49ea5acfcbdf2d8b0e5d55333562cf2848c67.zip
Improved class-level value initialization
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala30
1 files changed, 22 insertions, 8 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala
index 6b69eb059a..a09eaa8ebf 100644
--- a/src/compiler/scala/tools/nsc/transform/Constructors.scala
+++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala
@@ -65,22 +65,36 @@ abstract class Constructors extends Transform {
val intoConstructorTransformer = new Transformer {
override def transform(tree: Tree): Tree = tree match {
case Apply(Select(This(_), _), List()) =>
- if ((tree.symbol hasFlag PARAMACCESSOR) && tree.symbol.owner == clazz)
+ if ((tree.symbol hasFlag PARAMACCESSOR) && tree.symbol.owner == clazz) {
+ thisRefSeen = false
gen.mkAttributedIdent(parameter(tree.symbol.accessed)) setPos tree.pos
- else if (tree.symbol.outerSource == clazz && !clazz.isImplClass)
+ }
+ else if (tree.symbol.outerSource == clazz && !clazz.isImplClass) {
+ thisRefSeen = false
gen.mkAttributedIdent(parameterNamed(nme.OUTER))
+ }
else
super.transform(tree)
case Select(This(_), _)
if ((tree.symbol hasFlag PARAMACCESSOR) && tree.symbol.owner == clazz) =>
+ thisRefSeen = false
gen.mkAttributedIdent(parameter(tree.symbol)) setPos tree.pos
- case Select(_, _) =>
- thisRefSeen = true
- super.transform(tree)
- case This(_) =>
+ case Apply(fun, args) =>
+ var tmpRefSeen = thisRefSeen
+ val fun1 = transform(fun)
+ thisRefSeen = tmpRefSeen || thisRefSeen
+ val args1 = List.mapConserve(args){ tree =>
+ tmpRefSeen = thisRefSeen
+ val res = transform(tree)
+ thisRefSeen = tmpRefSeen || thisRefSeen
+ res
+ }
+ copy.Apply(tree, fun1, args1)
+ case Block(_, _) =>
+ val res = super.transform(tree)
thisRefSeen = true
- super.transform(tree)
- case Super(_, _) =>
+ res
+ case This(_) | Super(_, _) | Select(_, _) =>
thisRefSeen = true
super.transform(tree)
case _ =>