aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-02-26 17:23:06 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-03-18 11:14:11 +0100
commit66e9c7e74b9548c2f61d6ac7af7de791ee2113f0 (patch)
tree20f7fd9b8a1d82c0d7a8d20cbf0aacb07860ca4c /src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala
parent90696143b36f6ef68bf281a739dd3846908aec34 (diff)
downloaddotty-66e9c7e74b9548c2f61d6ac7af7de791ee2113f0.tar.gz
dotty-66e9c7e74b9548c2f61d6ac7af7de791ee2113f0.tar.bz2
dotty-66e9c7e74b9548c2f61d6ac7af7de791ee2113f0.zip
Finished new position unpickling code.
Pickling still has to be written.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala')
-rw-r--r--src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala b/src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala
new file mode 100644
index 000000000..c341d58cc
--- /dev/null
+++ b/src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala
@@ -0,0 +1,37 @@
+package dotty.tools
+package dotc
+package core
+package pickling
+
+import util.Positions._
+import collection.mutable
+import TastyBuffer.Addr
+
+object PositionUnpickler {
+ type AddrToPosition = mutable.HashMap[Addr, Position]
+}
+
+/** Unpickler for tree positions */
+class PositionUnpickler(reader: TastyReader) {
+ import PositionUnpickler._
+ import reader._
+
+ def unpickle(): (Position, AddrToPosition) = {
+ val positions = new mutable.HashMap[Addr, Position] // Dotty deviation: Can't use new AddrToPosition here. TODO: fix this!
+ val sourceLength = readNat()
+ def readDelta() = if (isAtEnd) 0 else readInt()
+ var curIndex: Addr = Addr(readDelta())
+ while (!isAtEnd) {
+ val delta1 = readDelta()
+ val delta2 = readDelta()
+ val (startDelta, endDelta, indexDelta) =
+ if (delta2 <= 0) (delta1, -delta2, readDelta())
+ else if (delta1 < 0) (0, -delta1, delta2)
+ else (delta1, 0, delta2)
+ positions(curIndex) = Position(startDelta, endDelta, 0)
+ // make non-synthetic position; will be made synthetic by normalization.
+ curIndex += indexDelta
+ }
+ (Position(0, sourceLength), positions)
+ }
+} \ No newline at end of file