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 /src | |
parent | 8e56e0e55bfacfd23fae87ed2f07151e2240aeaa (diff) | |
download | scala-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.scala | 30 |
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 _ => |