diff options
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/PositionPickler.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/PositionPickler.scala | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/PositionPickler.scala b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala index 58f00926d..7cb7de6e3 100644 --- a/src/dotty/tools/dotc/core/pickling/PositionPickler.scala +++ b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala @@ -4,25 +4,27 @@ package core package pickling import ast.tpd._ +import ast.Trees.WithLazyField import PickleFormat._ import core._ import Contexts._, Symbols._, Types._, Names._, Constants._, Decorators._, Annotations._ import collection.mutable import TastyBuffer._ +import Traversals._ class PositionPickler(pickler: TastyPickler, addrOfTree: Tree => Option[Addr]) { val buf = new PositionBuffer pickler.newSection("Positions", buf) import buf._ - def picklePositions(roots: List[Tree])(implicit ctx: Context) = { - def traverseWith(recorder: PositionRecorder) = - recorder.edge.traverseAll(roots) { tree => - if (tree.pos.exists) - for (addr <- addrOfTree(tree)) - recorder.record(addr, recorder.edge.offset(tree.pos)) - } - traverseWith(startPos) - traverseWith(endPos) - } + private def record(tree: Tree, start: Boolean) = + if (tree.pos.exists) + for (addr <- addrOfTree(tree)) + buf.record( + addr, + offset = if (start) tree.pos.start else tree.pos.end, + recordAlways = !start && tree.isInstanceOf[WithLazyField[_]]) + + def picklePositions(roots: List[Tree])(implicit ctx: Context) = + traverse(roots, record(_, true), record(_, false)) }
\ No newline at end of file |