aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/core/pickling/Edge.scala33
-rw-r--r--src/dotty/tools/dotc/core/pickling/PositionPickler.scala32
2 files changed, 36 insertions, 29 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/Edge.scala b/src/dotty/tools/dotc/core/pickling/Edge.scala
index 543f85831..dbdc7fe65 100644
--- a/src/dotty/tools/dotc/core/pickling/Edge.scala
+++ b/src/dotty/tools/dotc/core/pickling/Edge.scala
@@ -1,16 +1,45 @@
package dotty.tools.dotc
-package core.pickling
+package core
+package pickling
import util.Positions._
-import ast.tpd._
+import ast.tpd.{Tree, MemberDef}
import core.Contexts._
abstract class Edge {
+
def offset(pos: Position): Int
def seq(op1: () => Unit, op2: () => Unit): Unit
+
+ private val noOp = () => ()
+
+ def traverseAll(root: Tree)(op: Tree => Unit)(implicit ctx: Context) = {
+
+ def elemsTraversal(xs: TraversableOnce[Any]): () => Unit =
+ (noOp /: xs) ((op, x) => () => seq(op, elemTraversal(x)))
+
+ def elemTraversal(x: Any): () => Unit = () => x match {
+ case x: Tree @ unchecked =>
+ op(x)
+
+ val annotTraversal = x match {
+ case x: MemberDef => elemsTraversal(x.symbol.annotations)
+ case _ => noOp
+ }
+ val childrenTraversal = elemsTraversal(x.productIterator)
+ seq(annotTraversal, childrenTraversal)
+ case xs: List[_] =>
+ elemsTraversal(xs)()
+ case _ =>
+ ()
+ }
+
+ elemTraversal(root)()
+ }
}
object Edge {
+
object left extends Edge {
def offset(pos: Position): Int = pos.start
def seq(op1: () => Unit, op2: () => Unit) = { op1(); op2() }
diff --git a/src/dotty/tools/dotc/core/pickling/PositionPickler.scala b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
index 0cf519b23..84ab35462 100644
--- a/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
@@ -14,35 +14,13 @@ class PositionPickler(pickler: TastyPickler, addrOfTree: Tree => Option[Addr]) {
val buf = new PositionBuffer
pickler.newSection("Positions", buf)
import buf._
-
- val noOp = () => ()
-
- def traverseAll(root: Tree, recorder: PositionRecorder)(implicit ctx: Context) = {
- import recorder.edge.{seq, offset}
- def elemsTraversal(xs: TraversableOnce[Any]): () => Unit =
- (noOp /: xs) ((op, x) => () => seq(op, elemTraversal(x)))
-
- def elemTraversal(x: Any): () => Unit = () => x match {
- case x: Tree @ unchecked =>
- if (x.pos.exists)
- for (addr <- addrOfTree(x))
- recorder.record(addr, offset(x.pos))
-
- val annotTraversal = x match {
- case x: MemberDef => elemsTraversal(x.symbol.annotations)
- case _ => noOp
- }
- val childrenTraversal = elemsTraversal(x.productIterator)
- seq(annotTraversal, childrenTraversal)
- case xs: List[_] =>
- elemsTraversal(xs)()
- case _ =>
- ()
+ def traverseAll(root: Tree, recorder: PositionRecorder)(implicit ctx: Context) =
+ recorder.edge.traverseAll(root) { tree =>
+ if (tree.pos.exists)
+ for (addr <- addrOfTree(tree))
+ recorder.record(addr, recorder.edge.offset(tree.pos))
}
-
- elemTraversal(root)()
- }
def picklePositions(root: Tree)(implicit ctx: Context) = {
traverseAll(root, startPos)