diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-26 18:06:52 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:14:11 +0100 |
commit | c669d08e84aa05fb8ee849fbc1ddb09502a76256 (patch) | |
tree | 4dff1106da9567733afa4e9d864b1cb6f79e2dbc /src/dotty/tools/dotc/core/pickling/PositionPickler.scala | |
parent | 66e9c7e74b9548c2f61d6ac7af7de791ee2113f0 (diff) | |
download | dotty-c669d08e84aa05fb8ee849fbc1ddb09502a76256.tar.gz dotty-c669d08e84aa05fb8ee849fbc1ddb09502a76256.tar.bz2 dotty-c669d08e84aa05fb8ee849fbc1ddb09502a76256.zip |
Added pickling part of new scheme.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/PositionPickler.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/PositionPickler.scala | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/PositionPickler.scala b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala index 7cb7de6e3..6215a452d 100644 --- a/src/dotty/tools/dotc/core/pickling/PositionPickler.scala +++ b/src/dotty/tools/dotc/core/pickling/PositionPickler.scala @@ -10,21 +10,56 @@ import core._ import Contexts._, Symbols._, Types._, Names._, Constants._, Decorators._, Annotations._ import collection.mutable import TastyBuffer._ -import Traversals._ +import util.Positions._ + +object PositionPickler { + + trait DeferredPosition { + var parentPos: Position = NoPosition + } + + def traverse(x: Any, parentPos: Position, op: (Tree, Position) => Unit)(implicit ctx: Context): Unit = + if (parentPos.exists) + x match { + case x: Tree @unchecked => + op(x, parentPos) + x match { + case x: MemberDef @unchecked => traverse(x.symbol.annotations, x.pos, op) + case _ => + } + traverse(x.productIterator, x.pos, op) + case x: DeferredPosition => + x.parentPos = parentPos + case xs: TraversableOnce[_] => + xs.foreach(traverse(_, parentPos, op)) + case _ => + } +} +import PositionPickler._ class PositionPickler(pickler: TastyPickler, addrOfTree: Tree => Option[Addr]) { - val buf = new PositionBuffer + val buf = new TastyBuffer(100000) pickler.newSection("Positions", buf) import buf._ + + private def record(tree: Tree, parentPos: Position): Unit = { + assert(tree.pos.exists) + val startDelta = tree.pos.start - parentPos.start + val endDelta = tree.pos.end - parentPos.end + if (startDelta != 0 || endDelta != 0) + for (addr <- addrOfTree(tree)) { + buf.writeInt(addr.index) + if (startDelta != 0) buf.writeInt(startDelta) + if (endDelta != 0) { + assert(endDelta < 0) + buf.writeInt(endDelta) + } else assert(startDelta >= 0) + } - 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)) + def picklePositions(roots: List[Tree], totalRange: Position)(implicit ctx: Context) = { + buf.writeNat(totalRange.end) + traverse(roots, totalRange, record) + } }
\ No newline at end of file |