aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-10-17 15:49:42 +0200
committerMartin Odersky <odersky@gmail.com>2016-10-17 15:51:22 +0200
commit6ce403eb0c6b630f925db38b7538e0f9b8c892ea (patch)
tree1a395799f4aeee5a7295378c361966566c8c35ab /src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
parent2fe0f674124c5be064d1cbf80594fb8e7d5d78be (diff)
downloaddotty-6ce403eb0c6b630f925db38b7538e0f9b8c892ea.tar.gz
dotty-6ce403eb0c6b630f925db38b7538e0f9b8c892ea.tar.bz2
dotty-6ce403eb0c6b630f925db38b7538e0f9b8c892ea.zip
Pickle Inlined trees
Inlined trees should be preserved by pickling so that we keep positions accurate. With that change now all tasty tests are tested for position accuracy.
Diffstat (limited to 'src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala')
-rw-r--r--src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala19
1 files changed, 13 insertions, 6 deletions
diff --git a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
index 57c0fe32d..35613c08d 100644
--- a/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
+++ b/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
@@ -905,6 +905,15 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
def readLengthTerm(): Tree = {
val end = readEnd()
+ def readBlock(mkTree: (List[Tree], Tree) => Tree): Tree = {
+ val exprReader = fork
+ skipTree()
+ val localCtx = ctx.fresh.setNewScope
+ val stats = readStats(ctx.owner, end)(localCtx)
+ val expr = exprReader.readTerm()(localCtx)
+ mkTree(stats, expr)
+ }
+
val result =
(tag: @switch) match {
case SUPER =>
@@ -937,12 +946,10 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
case ASSIGN =>
Assign(readTerm(), readTerm())
case BLOCK =>
- val exprReader = fork
- skipTree()
- val localCtx = ctx.fresh.setNewScope
- val stats = readStats(ctx.owner, end)(localCtx)
- val expr = exprReader.readTerm()(localCtx)
- Block(stats, expr)
+ readBlock(Block)
+ case INLINED =>
+ val call = readTerm()
+ readBlock((defs, expr) => Inlined(call, defs.asInstanceOf[List[MemberDef]], expr))
case IF =>
If(readTerm(), readTerm(), readTerm())
case LAMBDA =>