diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-25 18:29:30 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:14:10 +0100 |
commit | 1b301e9b8da1fc48b1720cccedafdb7cdb7058a4 (patch) | |
tree | adfdf48087277745254595c113a620dbdc4e5641 /src/dotty/tools/dotc/core/pickling/PositionPickler.scala | |
parent | afeb331346d49e8fd0b47178365b3f95bf89b340 (diff) | |
download | dotty-1b301e9b8da1fc48b1720cccedafdb7cdb7058a4.tar.gz dotty-1b301e9b8da1fc48b1720cccedafdb7cdb7058a4.tar.bz2 dotty-1b301e9b8da1fc48b1720cccedafdb7cdb7058a4.zip |
New scheme for recording positions
Single traverser, also handles lazy trees.
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 |