diff options
author | Paul Phillips <paulp@improving.org> | 2012-02-22 22:46:32 -0800 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-02-23 00:35:22 -0800 |
commit | 4a984f82d5bfca05123c53bd385d0299818f8a75 (patch) | |
tree | d9f5cc270fee70649ee22cd715c0899ae204ef26 /src/library/scala/reflect/api/Trees.scala | |
parent | 98cf4014a3a14dbc348a464584133d90719bdbb8 (diff) | |
download | scala-4a984f82d5bfca05123c53bd385d0299818f8a75.tar.gz scala-4a984f82d5bfca05123c53bd385d0299818f8a75.tar.bz2 scala-4a984f82d5bfca05123c53bd385d0299818f8a75.zip |
Methods to derive new DefDefs.
I guess I'd seen DefDef(mods, name, tparams, vparamss, tpt, rhs)
one too many times and went a little crazy. What do you prefer:
- val DefDef(mods, name, tparams, vparamss, tpt, rhs) = tree1
- treeCopy.DefDef(tree1, mods, name, tparams, vparamss, tpt, transform(rhs))
+ deriveDefDef(tree1)(transform)
Me too.
Diffstat (limited to 'src/library/scala/reflect/api/Trees.scala')
-rw-r--r-- | src/library/scala/reflect/api/Trees.scala | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/src/library/scala/reflect/api/Trees.scala b/src/library/scala/reflect/api/Trees.scala index 1472866460..9d96f30afb 100644 --- a/src/library/scala/reflect/api/Trees.scala +++ b/src/library/scala/reflect/api/Trees.scala @@ -13,7 +13,7 @@ trait Trees { self: Universe => private[scala] var nodeCount = 0 - type Modifiers <: AbsModifiers + type Modifiers >: Null <: AbsModifiers abstract class AbsModifiers { def modifiers: Set[Modifier] @@ -660,6 +660,33 @@ trait Trees { self: Universe => val treeCopy = newLazyTreeCopier + def copyDefDef(tree: Tree)( + mods: Modifiers = null, + name: Name = null, + tparams: List[TypeDef] = null, + vparamss: List[List[ValDef]] = null, + tpt: Tree = null, + rhs: Tree = null + ): DefDef = tree match { + case DefDef(mods0, name0, tparams0, vparamss0, tpt0, rhs0) => + treeCopy.DefDef(tree, + if (mods eq null) mods0 else mods, + if (name eq null) name0 else name, + if (tparams eq null) tparams0 else tparams, + if (vparamss eq null) vparamss0 else vparamss, + if (tpt eq null) tpt0 else tpt, + if (rhs eq null) rhs0 else rhs + ) + case t => + sys.error("Not a DefDef: " + t + "/" + t.getClass) + } + def deriveDefDef(ddef: Tree)(applyToRhs: Tree => Tree): DefDef = ddef match { + case DefDef(mods0, name0, tparams0, vparamss0, tpt0, rhs0) => + treeCopy.DefDef(ddef, mods0, name0, tparams0, vparamss0, tpt0, applyToRhs(rhs0)) + case t => + sys.error("Not a DefDef: " + t + "/" + t.getClass) + } + class Traverser { protected var currentOwner: Symbol = definitions.RootClass |