aboutsummaryrefslogblamecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/PositionPickler.scala
blob: 7cb7de6e3101da9c5de07c152b80f077658ca462 (plain) (tree)
1
2
3
4
5
6
7





                   
                              




                                                                                        
                   




                                                                                
    









                                                                       
 
package dotty.tools
package dotc
package core
package pickling

import ast.tpd._
import ast.Trees.WithLazyField
import PickleFormat._
import core._
import Contexts._, Symbols._, Types._, Names._, Constants._, Decorators._, Annotations._
import collection.mutable
import TastyBuffer._
import Traversals._

class PositionPickler(pickler: TastyPickler, addrOfTree: Tree => Option[Addr]) {
  val buf = new PositionBuffer
  pickler.newSection("Positions", buf)
  import buf._
    
  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))
}