diff options
author | mihaylov <mihaylov@epfl.ch> | 2006-11-06 08:00:41 +0000 |
---|---|---|
committer | mihaylov <mihaylov@epfl.ch> | 2006-11-06 08:00:41 +0000 |
commit | a4e49ea5acfcbdf2d8b0e5d55333562cf2848c67 (patch) | |
tree | 4a57536c834dd3cb9dccbe3320c0b107a9265b23 | |
parent | 8e56e0e55bfacfd23fae87ed2f07151e2240aeaa (diff) | |
download | scala-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.scala | 30 | ||||
-rw-r--r-- | test/files/run/bug428.check | 12 |
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 |