From 5a0b1918238cb385401f304b22132f51936d795b Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Wed, 10 Apr 2013 23:52:31 +0200 Subject: Allow await in applications with multiple argument lists Before, we levied an implementation restriction to prevent this. As it turned out, that needlessly prevented use of `await` in the receiver of a multi-param-list application. This commit lifts the restriction altogether, and treats such applications holistically, being careful to preserve the left-to-right evaluation order of arguments in the translated code. - use `TreeInfo.Applied` and `Type#paramss` from `reflect.internal` to get the info we need - use the parameter name for the lifted argument val, rather than `argN` - encapsulate handling of by-name-ness and parameter names in `mapArgumentss` - test for evaluation order preservation --- src/test/scala/scala/async/TreeInterrogation.scala | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) (limited to 'src/test/scala/scala/async/TreeInterrogation.scala') diff --git a/src/test/scala/scala/async/TreeInterrogation.scala b/src/test/scala/scala/async/TreeInterrogation.scala index 4d611e5..deaee03 100644 --- a/src/test/scala/scala/async/TreeInterrogation.scala +++ b/src/test/scala/scala/async/TreeInterrogation.scala @@ -71,17 +71,14 @@ object TreeInterrogation extends App { val tb = mkToolbox("-cp target/scala-2.10/classes -Xprint:flatten") import scala.async.Async._ val tree = tb.parse( - """ import scala.async.AsyncId._ - | async { - | val x = 1 - | val opt = Some("") - | await(0) - | val o @ Some(y) = opt - | - | { - | val o @ Some(y) = Some(".") - | } + """ import _root_.scala.async.AsyncId.{async, await} + | def foo[T](a0: Int)(b0: Int*) = s"a0 = $a0, b0 = ${b0.head}" + | val res = async { + | var i = 0 + | def get = async {i += 1; i} + | foo[Int](await(get))(await(get) :: Nil : _*) | } + | res | """.stripMargin) println(tree) val tree1 = tb.typeCheck(tree.duplicate) -- cgit v1.2.3