diff options
author | Martin Odersky <odersky@gmail.com> | 2016-11-14 11:58:59 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-11-16 14:25:40 +0100 |
commit | fe20b9064fca765a38345a09aa484bfb537aa3c0 (patch) | |
tree | 99cce659b7c2fe7d79fd5c9c87ba51bcb96a7545 /src/dotty/tools/dotc/core/tasty/PositionPickler.scala | |
parent | 97b6985c34915b58e0c81fbab464f4bd532c27d0 (diff) | |
download | dotty-fe20b9064fca765a38345a09aa484bfb537aa3c0.tar.gz dotty-fe20b9064fca765a38345a09aa484bfb537aa3c0.tar.bz2 dotty-fe20b9064fca765a38345a09aa484bfb537aa3c0.zip |
Pickle and unpickle type trees
Lots of other changes to make positions work out everywhere.
One important change is that now trees can be shared, just
as types can. This change improves memory requirements (a bit)
and also makes positions in shared trees more robust.
Diffstat (limited to 'src/dotty/tools/dotc/core/tasty/PositionPickler.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/tasty/PositionPickler.scala | 26 |
1 files changed, 6 insertions, 20 deletions
diff --git a/src/dotty/tools/dotc/core/tasty/PositionPickler.scala b/src/dotty/tools/dotc/core/tasty/PositionPickler.scala index 4b67bc188..546894a9e 100644 --- a/src/dotty/tools/dotc/core/tasty/PositionPickler.scala +++ b/src/dotty/tools/dotc/core/tasty/PositionPickler.scala @@ -13,7 +13,7 @@ import collection.mutable import TastyBuffer._ import util.Positions._ -class PositionPickler(pickler: TastyPickler, addrsOfTree: tpd.Tree => List[Addr]) { +class PositionPickler(pickler: TastyPickler, addrOfTree: tpd.Tree => Option[Addr]) { val buf = new TastyBuffer(5000) pickler.newSection("Positions", buf) import buf._ @@ -21,21 +21,6 @@ class PositionPickler(pickler: TastyPickler, addrsOfTree: tpd.Tree => List[Addr] private val remainingAddrs = new java.util.IdentityHashMap[Tree, Iterator[Addr]] - def nextTreeAddr(tree: Tree): Option[Addr] = remainingAddrs.get(tree) match { - case null => - addrsOfTree(tree) match { - case Nil => - None - case addr :: Nil => - Some(addr) - case addrs => - remainingAddrs.put(tree, addrs.iterator) - nextTreeAddr(tree) - } - case it: Iterator[_] => - if (it.hasNext) Some(it.next) else None - } - def header(addrDelta: Int, hasStartDelta: Boolean, hasEndDelta: Boolean, hasPoint: Boolean) = { def toInt(b: Boolean) = if (b) 1 else 0 (addrDelta << 3) | (toInt(hasStartDelta) << 2) | (toInt(hasEndDelta) << 1) | toInt(hasPoint) @@ -60,8 +45,7 @@ class PositionPickler(pickler: TastyPickler, addrsOfTree: tpd.Tree => List[Addr] */ def alwaysNeedsPos(x: Positioned) = x match { case _: WithLazyField[_] // initialPos is inaccurate for trees with lazy field - | _: Trees.PackageDef[_] => true // package defs might be split into several Tasty files - case x: Trees.Tree[_] => x.isType // types are unpickled as TypeTrees, so child positions are not available + | _: Trees.PackageDef[_] => true // package defs might be split into several Tasty files case _ => false } @@ -69,7 +53,7 @@ class PositionPickler(pickler: TastyPickler, addrsOfTree: tpd.Tree => List[Addr] case x: Tree @unchecked => val pos = if (x.isInstanceOf[MemberDef]) x.pos else x.pos.toSynthetic if (pos.exists && (pos != x.initialPos.toSynthetic || alwaysNeedsPos(x))) { - nextTreeAddr(x) match { + addrOfTree(x) match { case Some(addr) => //println(i"pickling $x with $pos at $addr") pickleDeltas(addr.index, pos) @@ -79,13 +63,15 @@ class PositionPickler(pickler: TastyPickler, addrsOfTree: tpd.Tree => List[Addr] } //else if (x.pos.exists) println(i"skipping $x") x match { - case x: MemberDef @unchecked => + case x: MemberDef @unchecked => for (ann <- x.symbol.annotations) traverse(ann.tree) case _ => } traverse(x.productIterator) case xs: TraversableOnce[_] => xs.foreach(traverse) + case x: Annotation => + traverse(x.tree) case _ => } traverse(roots) |