diff options
author | Martin Odersky <odersky@gmail.com> | 2015-02-26 17:23:06 +0100 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-03-18 11:14:11 +0100 |
commit | 66e9c7e74b9548c2f61d6ac7af7de791ee2113f0 (patch) | |
tree | 20f7fd9b8a1d82c0d7a8d20cbf0aacb07860ca4c /src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala | |
parent | 90696143b36f6ef68bf281a739dd3846908aec34 (diff) | |
download | dotty-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.scala | 37 |
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 |