4
4
5
5
package scala .async .internal
6
6
7
+ import scala .collection .mutable .ListBuffer
7
8
import scala .reflect .macros .Context
8
9
import scala .collection .mutable
9
10
@@ -53,14 +54,13 @@ trait AsyncAnalysis {
53
54
}
54
55
55
56
override def traverse (tree : Tree ) {
56
- def containsAwait = tree exists isAwait
57
57
tree match {
58
- case Try (_, _, _) if containsAwait =>
58
+ case Try (_, _, _) if containsAwait(tree) =>
59
59
reportUnsupportedAwait(tree, " try/catch" )
60
60
super .traverse(tree)
61
61
case Return (_) =>
62
62
c.abort(tree.pos, " return is illegal within a async block" )
63
- case DefDef (mods, _, _, _, _, _) if mods.hasFlag(Flag .LAZY ) && containsAwait =>
63
+ case DefDef (mods, _, _, _, _, _) if mods.hasFlag(Flag .LAZY ) && containsAwait(tree) =>
64
64
reportUnsupportedAwait(tree, " lazy val initializer" )
65
65
case CaseDef (_, guard, _) if guard exists isAwait =>
66
66
// TODO lift this restriction
@@ -74,9 +74,19 @@ trait AsyncAnalysis {
74
74
* @return true, if the tree contained an unsupported await.
75
75
*/
76
76
private def reportUnsupportedAwait (tree : Tree , whyUnsupported : String ): Boolean = {
77
- val badAwaits : List [RefTree ] = tree collect {
78
- case rt : RefTree if isAwait(rt) => rt
77
+ val badAwaits = ListBuffer [Tree ]()
78
+ object traverser extends Traverser {
79
+ override def traverse (tree : Tree ): Unit = {
80
+ if (! isAsync(tree))
81
+ super .traverse(tree)
82
+ tree match {
83
+ case rt : RefTree if isAwait(rt) =>
84
+ badAwaits += rt
85
+ case _ =>
86
+ }
87
+ }
79
88
}
89
+ traverser(tree)
80
90
badAwaits foreach {
81
91
tree =>
82
92
reportError(tree.pos, s " await must not be used under a $whyUnsupported. " )
0 commit comments