diff options
Diffstat (limited to 'src/main/scala/scala/async/internal/Lifter.scala')
-rw-r--r-- | src/main/scala/scala/async/internal/Lifter.scala | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/main/scala/scala/async/internal/Lifter.scala b/src/main/scala/scala/async/internal/Lifter.scala index 2998baf..3afe6d6 100644 --- a/src/main/scala/scala/async/internal/Lifter.scala +++ b/src/main/scala/scala/async/internal/Lifter.scala @@ -76,8 +76,9 @@ trait Lifter { // are already accounted for. val stateIdToDirectlyReferenced: Map[Int, List[Symbol]] = { val refs: List[(Int, Symbol)] = asyncStates.flatMap( - asyncState => asyncState.stats.filterNot(_.isDef).flatMap(_.collect { - case rt: RefTree if symToDefiningState.contains(rt.symbol) => (asyncState.state, rt.symbol) + asyncState => asyncState.stats.filterNot(t => t.isDef && !isLabel(t.symbol)).flatMap(_.collect { + case rt: RefTree + if symToDefiningState.contains(rt.symbol) => (asyncState.state, rt.symbol) }) ) toMultiMap(refs) @@ -91,7 +92,7 @@ trait Lifter { // Only mark transitive references of defs, modules and classes. The RHS of lifted vals/vars // stays in its original location, so things that it refers to need not be lifted. - if (!(sym.isTerm && (sym.asTerm.isVal || sym.asTerm.isVar))) + if (!(sym.isTerm && !sym.asTerm.isLazy && (sym.asTerm.isVal || sym.asTerm.isVar))) defSymToReferenced(sym).foreach(sym2 => markForLift(sym2)) } } @@ -116,7 +117,8 @@ trait Lifter { sym.setFlag(MUTABLE | STABLE | PRIVATE | LOCAL) sym.setName(name.fresh(sym.name.toTermName)) sym.setInfo(deconst(sym.info)) - treeCopy.ValDef(vd, Modifiers(sym.flags), sym.name, TypeTree(tpe(sym)).setPos(t.pos), EmptyTree) + val rhs1 = if (sym.asTerm.isLazy) rhs else EmptyTree + treeCopy.ValDef(vd, Modifiers(sym.flags), sym.name, TypeTree(tpe(sym)).setPos(t.pos), rhs1) case dd@DefDef(_, _, tparams, vparamss, tpt, rhs) => sym.setName(this.name.fresh(sym.name.toTermName)) sym.setFlag(PRIVATE | LOCAL) |