| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The presentation compiler runs with `-Ymacro-expand:discard`, which
retains the macro expandee in the typechecked trees, rather than
substituting in the expansion. This mode was motivated as a means
to keep IDE functionality working (e.g. completion, navigation,
refactoring) inside macro applications.
However, if one has nested async macro applications, as reported in
the IDE ticket:
https://www.assembla.com/spaces/scala-ide/tickets/1002561
... the expansion of the outer async application was reporting
await calls enclosed by the inner async application.
This change tweaks the traversers used for this analysis to
stop whenever it sees an async.
|
|\
| |
| | |
Enable a compiler plugin to use the async transform after patmat
|
| |
| |
| |
| |
| |
| |
| |
| | |
- More internal docs
- Be more frugal with the `NoAwait` attachment, for some AST node
types this is implied.
- Just use `x`, rather than what was effectively
`x.reverseMap(identity).reverse`
|
|/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Currently, the async transformation is performed during the typer
phase, like all other macros.
We have to levy a few artificial restrictions on whern an async
boundary may be: for instance we don't support await within a
pattern guard. A more natural home for the transform would be
after patterns have been translated.
The test case in this commit shows how to use the async transform
from a custom compiler phase after patmat.
The remainder of the commit updates the implementation to handle
the new tree shapes.
For states that correspond to a label definition, we use `-symbol.id`
as the state ID. This made it easier to emit the forward jumps to when
processing the label application before we had seen the label
definition.
I've also made the transformation more efficient in the way it checks
whether a given tree encloses an `await` call: we traverse the input
tree at the start of the macro, and decorate it with tree attachments
containig the answer to this question. Even after the ANF and state
machine transforms introduce new layers of synthetic trees, the
`containsAwait` code need only traverse shallowly through those
trees to find a child that has the cached answer from the original
traversal.
I had to special case the ANF transform for expressions that always
lead to a label jump: we avoids trying to push an assignment to a result
variable into `if (cond) jump1() else jump2()`, in trees of the form:
```
% cat sandbox/jump.scala
class Test {
def test = {
(null: Any) match {
case _: String => ""
case _ => ""
}
}
}
% qscalac -Xprint:patmat -Xprint-types sandbox/jump.scala
def test: String = {
case <synthetic> val x1: Any = (null{Null(null)}: Any){Any};
case5(){
if (x1.isInstanceOf{[T0]=> Boolean}[String]{Boolean})
matchEnd4{(x: String)String}(""{String("")}){String}
else
case6{()String}(){String}{String}
}{String};
case6(){
matchEnd4{(x: String)String}(""{String("")}){String}
}{String};
matchEnd4(x: String){
x{String}
}{String}
}{String}
```
|
|\
| |
| | |
Typo
|
|/ |
|
|\
| |
| | |
Noop merge of 2.10.x to master.
|
| |\
| | |
| | |
| | | |
merge/2.10.x-to-master-20150730
|
| | |
| | |
| | |
| | |
| | |
| | | |
And remove unused code.
(cherry picked from commit 7238bc1982cb1d87157c650115a2ae92a58430c9)
|
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
This avoids leaving .class files in the working directory
after running the test.
(cherry picked from commit 5bb93b0b7357259eb588437a45063bf43595028a)
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
By declararing the parameter of `async` as by-name.
Fixes #150 (the bug in the original ticket.)
(cherry picked from commit 4b1dbeef9ec73612867afc5dd9c925faa8cbc30d)
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
If we blindly splicing `{..$stats, ..$generatedCode}`, and the last
expression in `$stats` is of type `Nothing`, we'll incur a dead
code warning when typechecking the block.
This commit:
- introduces a helper method to augment user-written stats with
synthetic code
- Emit a try/finally in that code (so we advance the state, even if we
are about to exit the state machine in the async-block global
exception handler
- Hide `Nothing` typed expressions from the dead code analysis
by wrapping them in an `expr: Any`
Fixes #150 (the part reported in the comments, not the original ticket.)
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Don't bother adding `{ ...; () }` if we can use the original tree(s) instead,
e.g. if the last tree in `...` conforms to `Unit`.
This makes the debug output of the macro a little easier to read.
(cherry picked from commit de641dc265f34b06e17dfa7c64be00219f72b670)
|
| | |\
| | | |
| | | | |
Update SBT for the warn command, now assumed by sbt-extras
|
| | | |
| | | |
| | | |
| | | | |
(cherry picked from commit f6a5c93acb7628c4d169b778e386332c6d1bd99b)
|
|\ \ \ \
| | | | |
| | | | | |
Avoid dead code warnings for users of async.
|
| | | | |
| | | | |
| | | | |
| | | | | |
And remove unused code.
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
This avoids leaving .class files in the working directory
after running the test.
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
By declararing the parameter of `async` as by-name.
Fixes #150 (the bug in the original ticket.)
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
If we blindly splicing `{..$stats, ..$generatedCode}`, and the last
expression in `$stats` is of type `Nothing`, we'll incur a dead
code warning when typechecking the block.
This commit:
- introduces a helper method to augment user-written stats with
synthetic code
- Emit a try/finally in that code (so we advance the state, even if we
are about to exit the state machine in the async-block global
exception handler
- Hide `Nothing` typed expressions from the dead code analysis
by wrapping them in an `expr: Any`
Fixes #150 (the part reported in the comments, not the original ticket.)
|
| |/ / /
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Don't bother adding `{ ...; () }` if we can use the original tree(s) instead,
e.g. if the last tree in `...` conforms to `Unit`.
This makes the debug output of the macro a little easier to read.
|
|\ \ \ \
| |/ / /
|/| | | |
Bump to 0.9.6-SNAPSHOT
|
|/ / / |
|
|\ \ \
| | | |
| | | | |
Avoid masking user exception with ??? for Nothing typed expressions
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Code like:
val x = if (cond) throw new A else throw new B
Was being transformed to:
val ifRes = ???
if (cond) ifRes = throw new A else ifRes = throw new B
val x = ifRes
by way of the use of `gen.mkZero` which throws `???` if the requested type is `Nothing`
This commit special cases `Nothing` typed expressions in a similar manner to `Unit` type expressions.
The example above is now translated to:
if (cond) throw new A else throw new B
val x = throw new IllegalStateException()
Fixes #120
|
|\ \ \ \
| | | | |
| | | | | |
Avoid leaking untyped trees out of macro
|
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | | |
The stack trace and bisection in #119 made me notice that we
are failing to typecheck the cast we generated in the fix for #74.
The ticket doesn't have a reproduction, so I'm submitting this
without a test case.
Fixes #119
|
|\ \ \ \ \
| |_|/ / /
|/| | | | |
Merge 2.10.x to master
|
|/| | | |
| | |/ /
| |/| |
| | | | |
merge/2.10.x-to-master-20150727
|
| |\ \ \
| | |_|/
| |/| | |
Opt in to container based TravisCI
|
| |/ / |
|
| |\ \
| | | |
| | | | |
Bump version to v0.9.5-SNAPSHOT
|
| |/ / |
|
|\ \ \
| | |/
| |/| |
Update SBT to support the command, which is assumed by sbt-extras
|
|/ / |
|
|\ \
| | |
| | | |
Bump to 0.9.5-SNAPSHOT
|
|/ / |
|
|\ \
| | |
| | | |
noop merge of 2.10.x to master
|
|/| |
| |/
| |
| | |
merge/2.10.x-to-master-20150707
|
| |\
| | |
| | | |
Avoid compiler warning when awaiting Future[Unit]
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
During the ANF transform, we were generating a tree of the shape:
{
val temp: Unit = await(futureOfUnit)
temp
()
}
I tried to simplifiy this to avoid creating the temporary value,
but this proved difficult as it would have required changes to
the subsequent state machine transformation.
Even replacing `temp` with `()` made the state machine transform
harder.
So for now, I've just inserted `temp.asInstanceOf[Unit]` to hide
from the compiler warning.
Fixes #74
(cherry picked from commit f3f058991b207a07041672a7e119422d9054788d)
|
| |\ \
| | | |
| | | | |
[backport] Avoid masking real errors with NotImplemented awaiting Future[Nothing]
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Future[Nothing]
This commit disabled live variable analysis for intermediate values of type Nothing.
Fixes #104
(cherry picked from commit 6353443a0adec384172c38efac3bc96b9d2cbad2)
|
|\ \ \
| | | |
| | | | |
Avoid compiler warning when awaiting Future[Unit]
|
|/ / /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
During the ANF transform, we were generating a tree of the shape:
{
val temp: Unit = await(futureOfUnit)
temp
()
}
I tried to simplifiy this to avoid creating the temporary value,
but this proved difficult as it would have required changes to
the subsequent state machine transformation.
Even replacing `temp` with `()` made the state machine transform
harder.
So for now, I've just inserted `temp.asInstanceOf[Unit]` to hide
from the compiler warning.
Fixes #74
|
|\ \ \
| | | |
| | | | |
Avoid masking real errors with NotImplemented awaiting Future[Nothing]
|
|/ / /
| | |
| | |
| | |
| | |
| | | |
This commit disabled live variable analysis for intermediate values of type Nothing.
Fixes #104
|
|\ \ \
| | | |
| | | | |
(noop) Merge 2.10.x to master
|
|/| | |
| |/ /
| | |
| | | |
merge/2.10.x-to-master-20150706
|
| |\ \
| | | |
| | | | |
Fix compiler crash with value class in result position
|