diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-09-15 07:21:26 -0700 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-09-15 07:21:26 -0700 |
commit | c2f7ce5cbbc3ccd086764e49c47e139786e0ab24 (patch) | |
tree | 5779d4b901132c164a94e75f52916fb2cf3bdc92 /src/reflect | |
parent | f3d9bdc283a82b816218aefc3df7d287e0cdd271 (diff) | |
parent | 27d73ee7a92d8dd10d4d0598a29d3a3657053995 (diff) | |
download | scala-c2f7ce5cbbc3ccd086764e49c47e139786e0ab24.tar.gz scala-c2f7ce5cbbc3ccd086764e49c47e139786e0ab24.tar.bz2 scala-c2f7ce5cbbc3ccd086764e49c47e139786e0ab24.zip |
Merge pull request #2884 from retronym/ticket/3832
SI-1909 SI-3832 SI-7007 SI-7223 Improved handling of larval objects
Diffstat (limited to 'src/reflect')
-rw-r--r-- | src/reflect/scala/reflect/internal/Trees.scala | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala index a54f86bdde..38f1f0f725 100644 --- a/src/reflect/scala/reflect/internal/Trees.scala +++ b/src/reflect/scala/reflect/internal/Trees.scala @@ -1606,6 +1606,25 @@ trait Trees extends api.Trees { self: SymbolTable => } } + /** Tracks the classes currently under construction during a transform */ + trait UnderConstructionTransformer extends Transformer { + import collection.mutable + + protected def isUnderConstruction(clazz: Symbol) = selfOrSuperCalls contains clazz + + /** The stack of class symbols in which a call to this() or to the super + * constructor, or early definition is active */ + private val selfOrSuperCalls = mutable.Stack[Symbol]() + + abstract override def transform(tree: Tree) = { + if ((treeInfo isSelfOrSuperConstrCall tree) || (treeInfo isEarlyDef tree)) { + selfOrSuperCalls push currentOwner.owner + try super.transform(tree) + finally selfOrSuperCalls.pop() + } else super.transform(tree) + } + } + def duplicateAndKeepPositions(tree: Tree) = new Duplicator(focusPositions = false) transform tree // ------ copiers ------------------------------------------- |