diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2017-09-29 10:34:38 +1000 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2017-09-29 10:56:58 +1000 |
commit | f2cf8e76fd184c95f2ad2f81659b60ee2ce75ec3 (patch) | |
tree | 6e7d09162e9db8c2f44c47f6928ca1842358825b /src/main/scala/scala/async/internal/TransformUtils.scala | |
parent | 1fe789ac1855488f2fef392e3b8fb74229e907f5 (diff) | |
download | scala-async-f2cf8e76fd184c95f2ad2f81659b60ee2ce75ec3.tar.gz scala-async-f2cf8e76fd184c95f2ad2f81659b60ee2ce75ec3.tar.bz2 scala-async-f2cf8e76fd184c95f2ad2f81659b60ee2ce75ec3.zip |
Fix ANF transform for corner case in late transforms
Unfortunately I wasn't able to extract a test case, but the patch
has been tested to fix a problem on a real world code base.
Diffstat (limited to 'src/main/scala/scala/async/internal/TransformUtils.scala')
-rw-r--r-- | src/main/scala/scala/async/internal/TransformUtils.scala | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/main/scala/scala/async/internal/TransformUtils.scala b/src/main/scala/scala/async/internal/TransformUtils.scala index 1720815..848861c 100644 --- a/src/main/scala/scala/async/internal/TransformUtils.scala +++ b/src/main/scala/scala/async/internal/TransformUtils.scala @@ -544,6 +544,27 @@ private[async] trait TransformUtils { result :: Nil } } + + def deriveLabelDef(ld: LabelDef, applyToRhs: Tree => Tree): LabelDef = { + val rhs2 = applyToRhs(ld.rhs) + val ld2 = treeCopy.LabelDef(ld, ld.name, ld.params, rhs2) + if (ld eq ld2) ld + else { + val info2 = ld2.symbol.info match { + case MethodType(params, p) => internal.methodType(params, rhs2.tpe) + case t => t + } + internal.setInfo(ld2.symbol, info2) + ld2 + } + } + object MatchEnd { + def unapply(t: Tree): Option[LabelDef] = t match { + case ValDef(_, _, _, t) => unapply(t) + case ld: LabelDef if ld.name.toString.startsWith("matchEnd") => Some(ld) + case _ => None + } + } } case object ContainsAwait |