aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-26 18:06:52 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:14:11 +0100
commitc669d08e84aa05fb8ee849fbc1ddb09502a76256 (patch)
tree4dff1106da9567733afa4e9d864b1cb6f79e2dbc /src/dotty/tools/dotc/core/pickling/PositionPickler.scala
parent66e9c7e74b9548c2f61d6ac7af7de791ee2113f0 (diff)
downloaddotty-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.scala57
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