| Commit message (Collapse) | Author | Age | Files | Lines |
... | |
| |
| |
| |
| | |
"There's a method for that!"
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Right now, the body of an async block suffers from diminished
IDE support: most notably hyperlinking doesn't work [1].
During the course of the blackbox/whitebox macro discussion,
we've often talked about how the former give us the latitude
to simply disable macro expansion in the IDE so we could get
these features working again, at the cost of losing domain
specific errors, such as "await must not be used under a
nested function".
But why not have our cake and eat too?
This commit detects if we are running the presentation compiler
and, after running our regular macro, returns the original macro
application. We need to annotate that tree to prevent the typechecker
from stubbornly calling our macro again.
EXPERIMENTAL NOTE: This logic shouldn't live in macros: this is
just a short term measure. If these experiments in async prove
successful, we'll roll something similar into the macro expansion
engine itself.
TODO: as a performance optimization, we could just run the
"unsupported await" checks, and avoid doing the more expensive
state machine transformation.
[1] https://www.assembla.com/spaces/scala-ide/tickets/1001449-code-navigation-fails-when-macros-are-used#/activity/ticket:
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
We were using a TypingTransformer and we called
`atOwner` before we had called `transform`. This
meant that `currTree` was null, which was observed
when that was passed to `Context#make`.
IDE ticket:
https://scala-ide-portfolio.assembla.com/spaces/scala-ide/tickets/1001971#/activity/ticket:
Stack trace:
exception during macro expansion: java.lang.NullPointerException
at scala.tools.nsc.interactive.ContextTrees$class.addContext(ContextTrees.scala:78)
at scala.tools.nsc.interactive.Global.addContext(Global.scala:28)
at scala.tools.nsc.interactive.Global.registerContext(Global.scala:268)
at scala.tools.nsc.typechecker.Contexts$Context.make(Contexts.scala:295)
at scala.tools.nsc.typechecker.Contexts$Context.make0(Contexts.scala:320)
at scala.tools.nsc.typechecker.Contexts$Context.make(Contexts.scala:327)
at scala.tools.nsc.typechecker.Typers$Typer.atOwner(Typers.scala:5662)
at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:33)
at scala.tools.nsc.transform.TypingTransformers$TypingTransformer.atOwner(TypingTransformers.scala:28)
at scala.async.internal.AsyncTransform$class.fixup$1(AsyncTransform.scala:191)
|
| | |
|
|/
|
|
|
|
|
|
|
| |
These stem from the handling of the internal/external view
or method type parameters by `thisMethodType` in `Namers`.
I've now preseversed the orginal ValDefs favoured the latter
when constructing the new DefDef, and made construction of
all liftables consistent in this regard.
|
|
|
|
|
| |
Once they escape, we leave the references in the state
machines fields untouched.
|
|
|
|
| |
Completes removal performed in #37.
|
|
|
|
|
|
| |
The generated code can simply extends Function1 and Function0.
This class was a hacky means to get the macro working a long
time ago.
|
|
|
|
|
|
|
|
|
|
| |
- Remove the CPS fallback version of async. That was not intended
to be part of 1.0.
- Lookup the await method beside the macro, rather than requiring
all calls to go to AsyncBase.await.
- Create a minimal version of Async that just contains await/async
and delegates to the macro implementation in internal._
- Add scaladoc.
|
|
|
|
| |
We were relying on an internal API that no longer exists.
|
| |
|
|
|
|
|
| |
- Zero out fields of type Any
- Zero out fields of value class type
|
|
|
|
|
|
|
| |
- Adds a hook that lets a derived macro insert additional code
when zero-ing out a lifted field.
- Adds a variant of the `AsyncId` macro that logs zeroed-out fields.
- Adds a test using this mechanism
|
|
|
|
|
| |
- A missing condition could cause an infinite loop
- Various clean-ups
|
|
|
|
|
|
|
|
| |
- Iterative, backwards data-flow analysis
- Make sure fields captured by nested defs are never zeroed out.
This is done elegantly by declaring such fields a being live
at the exit of the final state; thus, they will never be
zeroed out.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
OLD:
case (throwable @ _) if NonFatal.apply(throwable) => {
{
stateMachine$1.this.result.complete(Failure.apply[Nothing](throwable));
()
};
()
}
NEW:
case (throwable @ _) if NonFatal.apply(throwable) => {
stateMachine$1.this.result.complete(Failure.apply[Nothing](throwable));
()
}
|
| |
|
|
|
|
|
|
|
| |
Append a `()`, as we do for `Unit` returning `if`-s and `try-s`
We don't currently support `await` in try/catch, otherwise I'd
write tests for that case, too.
|
|\
| |
| | |
Use @uncheckedBounds to avoid introducing refchecks errors …
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
... in code that would otherwise have smuggled through these
slack LUBs in the types of trees but never in a TypeTree.
More details in SI-7694.
Fixes #29
|
|/
|
|
|
|
| |
- removed outdated comments in ANF transform
- added a few comments
- removed some unnecessary imports
|
|
|
|
| |
Tweak the way we set tpe = Unit in matches.
|
|
|
|
| |
Obsolete now that we carry all the types around.
|
| |
|
|
|
|
| |
Avoids runtime errors like: "java.lang.Double cannot be cast to scala.runtime.BoxedUnit"
|
| |
|
| |
|
| |
|
|
|
|
|
| |
Also support AsyncId.async[Nothing], which was triggering a NPE
in the generated `null.asInstanceOf[Nothing]`.
|
|
|
|
|
|
|
|
|
| |
- Make sure all trees are positioned
- Mark range positions for synthetic code as transparent to allow
some wiggle room for overlapping ranges.
Enables -Yrangepos for our test suite. We can't add it for
the entire build until the fix for SI-7649 lands in the compiler.
|
|
|
|
|
| |
When convering If and Match nodes to ANF, set the type to Unit.
Otherwise, erasure might end up casting BoxedUnit to a real type.
|
|
|
|
|
| |
If we intend to keep CPS fallback around for any length of time
it should probably move there too.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Avoid reset + retypecheck, instead hang onto the original types/symbols
- Eliminated duplication between AsyncDefinitionUseAnalyzer and ExprBuilder
- Instead, decide what do lift *after* running ExprBuilder
- Account for transitive references local classes/objects and lift them
as needed.
- Make the execution context an regular implicit parameter of the macro
- Fixes interaction with existential skolems and singleton types
Fixes #6, #13, #16, #17, #19, #21.
|
|
|
|
| |
fixes a typo in 5a0b1918
|
| |
|
|
|
|
|
|
| |
Rather than as @deprecated.
This commit means we can no longer build against 2.10.0.
|
|\
| |
| | |
Allow await in applications with multiple argument lists
|
| |
| |
| |
| | |
Addresses review comments
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
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
|
| |
| |
| |
| |
| |
| | |
- move all CPS-related code to `continuations` sub package
- fix CPS-based async implementation
- enable testing of CPS-based async implementation
|
|/
|
|
| |
We've got a perfectly good expression at hand.
|
|
|
|
| |
This time in the ANF/Inline transformation.
|
|
|
|
|
|
|
|
|
|
|
| |
Since SI-6187, the default case of a partial function is now included in the tree.
Before, it was a tree attachment, conditionally inserted in the pattern matcher.
I had hoped that that change would allow us to do away with
`RestorePatternMatchingFunctions` altogether, but it seems that
we aren't so lucky.
Instead, I've adapted that transformer to account for the new scheme.
|
| |
|
| |
|
|\ |
|
| |
| |
| |
| |
| |
| |
| | |
This is a re-implementation of a previous fix. It is more modular, since
it enables the definition of a CPS-based fall-back as a subclass of `AsyncBase`.
Thus, it's possible to define fall-back-enabled subclasses of `AsyncBase`
targetting not only Scala Futures.
|
|\ \
| |/
|/| |
Topic/patmat partial function
|