summaryrefslogtreecommitdiff
path: root/src/library/scala/reflect/api/Trees.scala
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2012-02-22 22:46:32 -0800
committerPaul Phillips <paulp@improving.org>2012-02-23 00:35:22 -0800
commit4a984f82d5bfca05123c53bd385d0299818f8a75 (patch)
treed9f5cc270fee70649ee22cd715c0899ae204ef26 /src/library/scala/reflect/api/Trees.scala
parent98cf4014a3a14dbc348a464584133d90719bdbb8 (diff)
downloadscala-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.scala29
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