summaryrefslogtreecommitdiff
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
parent8e56e0e55bfacfd23fae87ed2f07151e2240aeaa (diff)
downloadscala-a4e49ea5acfcbdf2d8b0e5d55333562cf2848c67.tar.gz
scala-a4e49ea5acfcbdf2d8b0e5d55333562cf2848c67.tar.bz2
scala-a4e49ea5acfcbdf2d8b0e5d55333562cf2848c67.zip
Improved class-level value initialization
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala30
-rw-r--r--test/files/run/bug428.check12
2 files changed, 28 insertions, 14 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 _ =>
diff --git a/test/files/run/bug428.check b/test/files/run/bug428.check
index 21bef2f8d3..1e933a9b78 100644
--- a/test/files/run/bug428.check
+++ b/test/files/run/bug428.check
@@ -1,8 +1,8 @@
-Foo 1: a = 0, b = 0, x = 0, y = 0
-Foo 2: a = 2, b = 0, x = 0, y = 0
-Foo 3: a = 2, b = 3, x = 0, y = 0
-Foo 4: a = 2, b = 3, x = 0, y = 0
-Foo 5: a = 2, b = 3, x = 0, y = 0
-Bar 1: a = 2, b = 3, x = 0, y = 0
+Foo 1: a = 2, b = 0, x = 5, y = 0
+Foo 2: a = 2, b = 0, x = 5, y = 0
+Foo 3: a = 2, b = 3, x = 5, y = 0
+Foo 4: a = 2, b = 3, x = 5, y = 0
+Foo 5: a = 2, b = 3, x = 5, y = 0
+Bar 1: a = 2, b = 3, x = 5, y = 0
Bar 2: a = 2, b = 3, x = 5, y = 0
Bar 3: a = 2, b = 3, x = 5, y = 7