diff options
author | Martin Odersky <odersky@gmail.com> | 2016-10-17 15:49:42 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-10-17 15:51:22 +0200 |
commit | 6ce403eb0c6b630f925db38b7538e0f9b8c892ea (patch) | |
tree | 1a395799f4aeee5a7295378c361966566c8c35ab /src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala | |
parent | 2fe0f674124c5be064d1cbf80594fb8e7d5d78be (diff) | |
download | dotty-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.scala | 19 |
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 => |