aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/Traversals.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/Traversals.scala')
-rw-r--r--src/dotty/tools/dotc/core/pickling/Traversals.scala54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/Traversals.scala b/src/dotty/tools/dotc/core/pickling/Traversals.scala
new file mode 100644
index 000000000..85dc53cd0
--- /dev/null
+++ b/src/dotty/tools/dotc/core/pickling/Traversals.scala
@@ -0,0 +1,54 @@
+package dotty.tools.dotc
+package core
+package pickling
+
+import util.Positions._
+import ast.tpd._
+import ast.Trees.Lazy
+import core.Contexts._
+
+object Traversals {
+
+ def traverse(x: Any, leftOp: Tree => Unit, rightOp: Tree => Unit) = {
+
+ def traverseElems(xs: TraversableOnce[Any]) = xs.foreach(traverseElem)
+
+ def traverseElem(x: Any): Unit = x match {
+ case x: Tree @ unchecked =>
+/** TODO: pickle annotation positions
+ x match {
+ case x: MemberDef => traverseElems(x.symbol.annotations)
+ case _ =>
+ } */
+ leftOp(x)
+ x match {
+ case x: ValDef =>
+ traverseElem(x.tpt)
+ traverseUnlessLazy(x.unforced)
+ case x: DefDef =>
+ traverseElems(x.tparams)
+ traverseElems(x.vparamss)
+ traverseElem(x.tpt)
+ traverseUnlessLazy(x.unforced)
+ case x: Template =>
+ traverseElem(x.constr)
+ traverseElems(x.parents)
+ traverseElem(x.self)
+ traverseUnlessLazy(x.unforced)
+ case _ =>
+ traverseElems(x.productIterator)
+ }
+ rightOp(x)
+ case xs: List[_] =>
+ traverseElems(xs)
+ case _ =>
+ }
+
+ def traverseUnlessLazy(x: Any) = x match {
+ case x: Lazy[_] =>
+ case _ => traverseElem(x)
+ }
+
+ traverseElem(x)
+ }
+} \ No newline at end of file