aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/ast/Trees.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-05-23 11:18:53 +0200
committerMartin Odersky <odersky@gmail.com>2013-05-23 11:18:53 +0200
commitdb39f1a5f5062f00e09e20a897e8f6d26e1e4193 (patch)
treef367993fb537210f2b297c7ec8ec0be857b3603b /src/dotty/tools/dotc/ast/Trees.scala
parent66fe5aaba6d5f7ae3694bcc942487cd1fe00c533 (diff)
downloaddotty-db39f1a5f5062f00e09e20a897e8f6d26e1e4193.tar.gz
dotty-db39f1a5f5062f00e09e20a897e8f6d26e1e4193.tar.bz2
dotty-db39f1a5f5062f00e09e20a897e8f6d26e1e4193.zip
Moved TempTrees to Trees, get automatically flattened in transforms.
Diffstat (limited to 'src/dotty/tools/dotc/ast/Trees.scala')
-rw-r--r--src/dotty/tools/dotc/ast/Trees.scala54
1 files changed, 28 insertions, 26 deletions
diff --git a/src/dotty/tools/dotc/ast/Trees.scala b/src/dotty/tools/dotc/ast/Trees.scala
index dd4567c50..5e3509441 100644
--- a/src/dotty/tools/dotc/ast/Trees.scala
+++ b/src/dotty/tools/dotc/ast/Trees.scala
@@ -612,8 +612,33 @@ object Trees {
def forwardTo: Tree[T] = shared
}
+ /** Temporary class that results from translation of ModuleDefs
+ * (and possibly other statements).
+ * The contained trees will be integrated when transformed with
+ * a `transform(List[Tree])` call.
+ */
+ case class TempTrees[T >: Untyped](trees: List[Tree[T]]) extends Tree[T] {
+ override def tpe: T = unsupported("tpe")
+ }
+
// ----- Auxiliary creation methods ------------------
+ /** Integrates nested TempTrees in given list of trees */
+ def flatten[T >: Untyped](trees: List[Tree[T]]): List[Tree[T]] =
+ if (trees exists isTempTrees)
+ trees flatMap {
+ case TempTrees(ts) => ts
+ case t => t :: Nil
+ }
+ else trees
+
+ def combine[T >: Untyped](trees: List[Tree[T]]): Tree[T] = flatten(trees) match {
+ case tree :: Nil => tree
+ case ts => TempTrees[T](ts)
+ }
+
+ private val isTempTrees: Any => Boolean = (_.isInstanceOf[TempTrees[_]])
+
def Block[T >: Untyped](stat: Tree[T], expr: Tree[T]): Block[T] =
Block(stat :: Nil, expr)
@@ -681,6 +706,7 @@ object Trees {
type Annotated = Trees.Annotated[T]
type EmptyTree = Trees.EmptyTree[T]
type SharedTree = Trees.SharedTree[T]
+ type TempTrees = Trees.TempTrees[T]
protected implicit def pos(implicit ctx: Context): Position = ctx.position
@@ -688,30 +714,6 @@ object Trees {
def Parameter(pname: TermName, tpe: Tree, mods: Modifiers = Modifiers()): ValDef =
ValDef(mods | Param, pname, tpe, EmptyTree())
-
- /** Temporary class that results from translation of ModuleDefs
- * (and possibly other statements).
- * The contained trees will be integrated in enclosing Blocks or Templates
- */
- case class TempTrees(trees: List[Tree]) extends Tree {
- override def tpe: T = unsupported("tpe")
- }
-
- /** Integrates nested TempTrees in given list of trees */
- def flatten(trees: List[Tree]): List[Tree] =
- if (trees exists isTempTrees)
- trees flatMap {
- case TempTrees(ts) => ts
- case t => t :: Nil
- }
- else trees
-
- def combine(trees: List[Tree]): Tree = flatten(trees) match {
- case tree :: Nil => tree
- case ts => TempTrees(ts)
- }
-
- private val isTempTrees: Tree => Boolean = (_.isInstanceOf[TempTrees])
}
// ----- Helper functions and classes ---------------------------------------
@@ -974,7 +976,7 @@ object Trees {
tree, c, plugins)
}
def transform(trees: List[Tree[T]], c: C): List[Tree[T]] =
- trees mapConserve (transform(_, c))
+ flatten(trees mapConserve (transform(_, c)))
def transformSub(tree: Tree[T], c: C): tree.ThisTree[T] =
transform(tree, c).asInstanceOf[tree.ThisTree[T]]
def transformSub[TT <: Tree[T]](trees: List[TT], c: C): List[TT] =
@@ -1121,7 +1123,7 @@ object Trees {
}
}
def transform(trees: List[Tree[T]]): List[Tree[T]] =
- trees mapConserve (transform(_))
+ flatten(trees mapConserve (transform(_)))
def transformSub(tree: Tree[T]): tree.ThisTree[T] =
transform(tree).asInstanceOf[tree.ThisTree[T]]
def transformSub[TT <: Tree[T]](trees: List[TT]): List[TT] =