diff options
author | Martin Odersky <odersky@gmail.com> | 2013-08-16 19:01:08 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-08-16 19:01:08 +0200 |
commit | 502f426981105df448896f635ef559cd72787c43 (patch) | |
tree | ca3a85271ae10c7f697dd3e88b07b7045bf81e2e /src/dotty/tools/dotc/ast/Trees.scala | |
parent | f540194f1b04c044c969772d5989d129264ea781 (diff) | |
download | dotty-502f426981105df448896f635ef559cd72787c43.tar.gz dotty-502f426981105df448896f635ef559cd72787c43.tar.bz2 dotty-502f426981105df448896f635ef559cd72787c43.zip |
Various bugfixes for namer/typer/trees
Diffstat (limited to 'src/dotty/tools/dotc/ast/Trees.scala')
-rw-r--r-- | src/dotty/tools/dotc/ast/Trees.scala | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/src/dotty/tools/dotc/ast/Trees.scala b/src/dotty/tools/dotc/ast/Trees.scala index 4f467b76f..9eeb28da4 100644 --- a/src/dotty/tools/dotc/ast/Trees.scala +++ b/src/dotty/tools/dotc/ast/Trees.scala @@ -662,7 +662,7 @@ object Trees { extends Tree[T] with WithoutType[T] { type ThisTree[-T >: Untyped] = Thicket[T] override def isEmpty: Boolean = trees.isEmpty - override def toList: List[Tree[T]] = trees + override def toList: List[Tree[T]] = flatten(trees) override def toString = if (isEmpty) "EmptyTree" else "Thicket(" + trees.mkString(", ") + ")" } @@ -686,8 +686,34 @@ object Trees { def forwardTo: Tree[T] = shared } - implicit class ListOfTreeDecorator[T <: untpd.Tree](val xs: List[T]) extends AnyVal { - def tpes: List[Type] = xs map (_.tpe) + def flatten[T >: Untyped](trees: List[Tree[T]]): List[Tree[T]] = { + var buf: ListBuffer[Tree[T]] = null + def add(tree: Tree[T]) = { + assert(!tree.isInstanceOf[Thicket[_]]) + buf += tree + } + var xs = trees + while (xs.nonEmpty) { + xs.head match { + case Thicket(elems) => + if (buf == null) { + buf = new ListBuffer + var ys = trees + while (ys ne xs) { + buf += ys.head + ys = ys.tail + } + } + for (elem <- elems) { + assert(!elem.isInstanceOf[Thicket[_]]) + buf += elem + } + case tree => + if (buf != null) buf += tree + } + xs = xs.tail + } + if (buf != null) buf.toList else trees } // ----- Generic Tree Instances, inherited from `tpt` and `untpd`. @@ -767,37 +793,7 @@ object Trees { def Thicket(x1: Tree, x2: Tree, x3: Tree): Thicket = Thicket(x1 :: x2 :: x3 :: Nil) def flatTree(xs: List[Tree]): Tree = flatten(xs) match { case x :: Nil => x - case _ => Thicket(xs) - } - - def flatten(trees: List[Tree]): List[Tree] = { - var buf: ListBuffer[Tree] = null - def add(tree: Tree) = { - assert(!tree.isInstanceOf[Thicket]) - buf += tree - } - var xs = trees - while (xs.nonEmpty) { - xs.head match { - case Thicket(elems) => - if (buf == null) { - buf = new ListBuffer - var ys = trees - while (ys ne xs) { - buf += ys.head - ys = ys.tail - } - } - for (elem <- elems) { - assert(!elem.isInstanceOf[Thicket]) - buf += elem - } - case tree => - if (buf != null) buf += tree - } - xs = xs.tail - } - if (buf != null) buf.toList else trees + case ys => Thicket(ys) } // ----- Position handling ----------------------------------------- |