aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/PositionUnpickler.scala
blob: 782e871c05b455b78a748149b67b417727d5331f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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, startDelta) 
        // make non-synthetic position; will be made synthetic by normalization.
      curIndex += indexDelta
    }
    (Position(0, sourceLength), positions)
  }
}