aboutsummaryrefslogblamecommitdiff
path: root/compiler/src/dotty/tools/dotc/core/tasty/PositionUnpickler.scala
blob: cbe213d89aaef85200e6e9b48570a79c21bd6503 (plain) (tree)
1
2
3
4
5
6
7
8
9


                   

             


                         
                                 


                                              

                 




                                                       
                      
                            



                                      



                                         


                                                                      
     
             
   

                                                               
 
 
package dotty.tools
package dotc
package core
package tasty


import util.Positions._
import collection.mutable
import TastyBuffer.{Addr, NoAddr}

/** Unpickler for tree positions */
class PositionUnpickler(reader: TastyReader) {
  import reader._

  private[tasty] lazy val positions = {
    val positions = new mutable.HashMap[Addr, Position]
    var curIndex = 0
    var curStart = 0
    var curEnd = 0
    while (!isAtEnd) {
      val header = readInt()
      val addrDelta = header >> 3
      val hasStart = (header & 4) != 0
      val hasEnd = (header & 2) != 0
      val hasPoint = (header & 1) != 0
      curIndex += addrDelta
      assert(curIndex >= 0)
      if (hasStart) curStart += readInt()
      if (hasEnd) curEnd += readInt()
      positions(Addr(curIndex)) = 
        if (hasPoint) Position(curStart, curEnd, curStart + readInt())
        else Position(curStart, curEnd)
    }
    positions
  }

  def posAt(addr: Addr) = positions.getOrElse(addr, NoPosition)
}