aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2016-09-08 16:05:45 +1000
committerGitHub <noreply@github.com>2016-09-08 16:05:45 +1000
commit567ca8b1ca24c497c3a75e1d17609cca9d636a62 (patch)
tree0cb31396e673e880157cd154ca67e7afc65937a5 /src
parentea6afc0266c10b693ad0daa1643a2ee5c834e076 (diff)
parentc15c45292b1cb858b32e3967d53126c9cc36f41b (diff)
downloadscala-async-567ca8b1ca24c497c3a75e1d17609cca9d636a62.tar.gz
scala-async-567ca8b1ca24c497c3a75e1d17609cca9d636a62.tar.bz2
scala-async-567ca8b1ca24c497c3a75e1d17609cca9d636a62.zip
Merge pull request #160 from retronym/topic/2.12
Compatibility with Scala 2.12.0-RC1
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/scala/async/internal/AnfTransform.scala6
-rw-r--r--src/main/scala/scala/async/internal/AsyncAnalysis.scala2
-rw-r--r--src/main/scala/scala/async/internal/AsyncTransform.scala11
-rw-r--r--src/main/scala/scala/async/internal/Lifter.scala5
-rw-r--r--src/main/scala/scala/async/internal/TransformUtils.scala8
-rw-r--r--src/test/scala/scala/async/run/live/LiveVariablesSpec.scala1
6 files changed, 23 insertions, 10 deletions
diff --git a/src/main/scala/scala/async/internal/AnfTransform.scala b/src/main/scala/scala/async/internal/AnfTransform.scala
index dc10a95..3d14fb7 100644
--- a/src/main/scala/scala/async/internal/AnfTransform.scala
+++ b/src/main/scala/scala/async/internal/AnfTransform.scala
@@ -68,7 +68,7 @@ private[async] trait AnfTransform {
def transformToBlock(tree: Tree): Block = listToBlock(transformToList(tree))
def _transformToList(tree: Tree): List[Tree] = trace(tree) {
- val stats :+ expr = anf.transformToList(tree)
+ val stats :+ expr = _anf.transformToList(tree)
def statsExprUnit =
stats :+ expr :+ api.typecheck(atPos(expr.pos)(Literal(Constant(()))))
def statsExprThrow =
@@ -163,7 +163,7 @@ private[async] trait AnfTransform {
internal.valDef(sym, internal.changeOwner(lhs, api.currentOwner, sym)).setType(NoType).setPos(pos)
}
- object anf {
+ object _anf {
def transformToList(tree: Tree): List[Tree] = {
mode = Anf; blockToList(api.recur(tree))
}
@@ -385,7 +385,7 @@ private[async] trait AnfTransform {
def anfLinearize(tree: Tree): Block = {
val trees: List[Tree] = mode match {
- case Anf => anf._transformToList(tree)
+ case Anf => _anf._transformToList(tree)
case Linearizing => linearize._transformToList(tree)
}
listToBlock(trees)
diff --git a/src/main/scala/scala/async/internal/AsyncAnalysis.scala b/src/main/scala/scala/async/internal/AsyncAnalysis.scala
index 6b75493..bd64f17 100644
--- a/src/main/scala/scala/async/internal/AsyncAnalysis.scala
+++ b/src/main/scala/scala/async/internal/AsyncAnalysis.scala
@@ -62,6 +62,8 @@ trait AsyncAnalysis {
c.abort(tree.pos, "return is illegal within a async block")
case DefDef(mods, _, _, _, _, _) if mods.hasFlag(Flag.LAZY) && containsAwait(tree) =>
reportUnsupportedAwait(tree, "lazy val initializer")
+ case ValDef(mods, _, _, _) if mods.hasFlag(Flag.LAZY) && containsAwait(tree) =>
+ reportUnsupportedAwait(tree, "lazy val initializer")
case CaseDef(_, guard, _) if guard exists isAwait =>
// TODO lift this restriction
reportUnsupportedAwait(tree, "pattern guard")
diff --git a/src/main/scala/scala/async/internal/AsyncTransform.scala b/src/main/scala/scala/async/internal/AsyncTransform.scala
index 2f45034..feb1ea7 100644
--- a/src/main/scala/scala/async/internal/AsyncTransform.scala
+++ b/src/main/scala/scala/async/internal/AsyncTransform.scala
@@ -159,10 +159,13 @@ trait AsyncTransform {
case ValDef(_, _, _, rhs) if liftedSyms(tree.symbol) =>
api.atOwner(api.currentOwner) {
val fieldSym = tree.symbol
- val lhs = atPos(tree.pos) {
- gen.mkAttributedStableRef(thisType(fieldSym.owner.asClass), fieldSym)
+ if (fieldSym.asTerm.isLazy) Literal(Constant(()))
+ else {
+ val lhs = atPos(tree.pos) {
+ gen.mkAttributedStableRef(thisType(fieldSym.owner.asClass), fieldSym)
+ }
+ treeCopy.Assign(tree, lhs, api.recur(rhs)).setType(definitions.UnitTpe).changeOwner(fieldSym, api.currentOwner)
}
- treeCopy.Assign(tree, lhs, api.recur(rhs)).setType(definitions.UnitTpe).changeOwner(fieldSym, api.currentOwner)
}
case _: DefTree if liftedSyms(tree.symbol) =>
EmptyTree
@@ -176,7 +179,7 @@ trait AsyncTransform {
}
val liftablesUseFields = liftables.map {
- case vd: ValDef => vd
+ case vd: ValDef if !vd.symbol.asTerm.isLazy => vd
case x => typingTransform(x, stateMachineClass)(useFields)
}
diff --git a/src/main/scala/scala/async/internal/Lifter.scala b/src/main/scala/scala/async/internal/Lifter.scala
index 9481f69..3afe6d6 100644
--- a/src/main/scala/scala/async/internal/Lifter.scala
+++ b/src/main/scala/scala/async/internal/Lifter.scala
@@ -92,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))
}
}
@@ -117,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)
diff --git a/src/main/scala/scala/async/internal/TransformUtils.scala b/src/main/scala/scala/async/internal/TransformUtils.scala
index e3a1206..c86540b 100644
--- a/src/main/scala/scala/async/internal/TransformUtils.scala
+++ b/src/main/scala/scala/async/internal/TransformUtils.scala
@@ -480,6 +480,14 @@ private[async] trait TransformUtils {
typingTransform(t, owner) {
(tree, api) =>
tree match {
+ case LabelDef(name, params, rhs) =>
+ val rhs1 = api.recur(rhs)
+ if (rhs1.tpe =:= UnitTpe) {
+ internal.setInfo(tree.symbol, internal.methodType(tree.symbol.info.paramLists.head, UnitTpe))
+ treeCopy.LabelDef(tree, name, params, rhs1)
+ } else {
+ treeCopy.LabelDef(tree, name, params, rhs1)
+ }
case Block(stats, expr) =>
val stats1 = stats map api.recur
val expr1 = api.recur(expr)
diff --git a/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala b/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala
index 01cf911..af236aa 100644
--- a/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala
+++ b/src/test/scala/scala/async/run/live/LiveVariablesSpec.scala
@@ -266,7 +266,6 @@ class LiveVariablesSpec {
// https://github.com/scala/async/issues/104
@Test def dontNullOutVarsOfTypeNothing_t104(): Unit = {
- implicit val ec: scala.concurrent.ExecutionContext = null
import scala.async.Async._
import scala.concurrent.duration.Duration
import scala.concurrent.{Await, Future}