diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/Edge.scala | 33 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/PositionPickler.scala | 32 |
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) |