aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-23 13:53:22 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:14:09 +0100
commitf16b12c3a58bdd692089c23288a45a80f14332ab (patch)
treeb8bc321075c2bb022c31ae225a73ad2d880cb4fb /src/dotty/tools/dotc/core/pickling/PositionPickler.scala
parent8fea2ef8368dc1bf82bb8064dd17368c38bb2347 (diff)
downloaddotty-f16b12c3a58bdd692089c23288a45a80f14332ab.tar.gz
dotty-f16b12c3a58bdd692089c23288a45a80f14332ab.tar.bz2
dotty-f16b12c3a58bdd692089c23288a45a80f14332ab.zip
First version of position pickler.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/PositionPickler.scala')
-rw-r--r--src/dotty/tools/dotc/core/pickling/PositionPickler.scala51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/PositionPickler.scala b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
new file mode 100644
index 000000000..0cf519b23
--- /dev/null
+++ b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
@@ -0,0 +1,51 @@
+package dotty.tools
+package dotc
+package core
+package pickling
+
+import ast.tpd._
+import PickleFormat._
+import core._
+import Contexts._, Symbols._, Types._, Names._, Constants._, Decorators._, Annotations._
+import collection.mutable
+import TastyBuffer._
+
+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 _ =>
+ ()
+ }
+
+ elemTraversal(root)()
+ }
+
+ def picklePositions(root: Tree)(implicit ctx: Context) = {
+ traverseAll(root, startPos)
+ traverseAll(root, endPos)
+ }
+} \ No newline at end of file