aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-25 18:29:30 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:14:10 +0100
commit1b301e9b8da1fc48b1720cccedafdb7cdb7058a4 (patch)
treeadfdf48087277745254595c113a620dbdc4e5641 /src/dotty/tools/dotc/core/pickling/PositionPickler.scala
parentafeb331346d49e8fd0b47178365b3f95bf89b340 (diff)
downloaddotty-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.scala22
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