From 1b301e9b8da1fc48b1720cccedafdb7cdb7058a4 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 25 Feb 2015 18:29:30 +0100 Subject: New scheme for recording positions Single traverser, also handles lazy trees. --- .../tools/dotc/core/pickling/PositionPickler.scala | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) (limited to 'src/dotty/tools/dotc/core/pickling/PositionPickler.scala') 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 -- cgit v1.2.3