diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-23 13:53:22 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:14:09 +0100 |
commit | f16b12c3a58bdd692089c23288a45a80f14332ab (patch) | |
tree | b8bc321075c2bb022c31ae225a73ad2d880cb4fb /src/dotty/tools/dotc/core/pickling/PositionPickler.scala | |
parent | 8fea2ef8368dc1bf82bb8064dd17368c38bb2347 (diff) | |
download | dotty-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.scala | 51 |
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 |