@@ -27,7 +27,7 @@ trait ExprBuilder {
27
27
28
28
def nextStates : List [Int ]
29
29
30
- def mkHandlerCaseForState : CaseDef
30
+ def mkHandlerCaseForState [ T : WeakTypeTag ] : CaseDef
31
31
32
32
def mkOnCompleteHandler [T : WeakTypeTag ]: Option [CaseDef ] = None
33
33
@@ -51,7 +51,7 @@ trait ExprBuilder {
51
51
def nextStates : List [Int ] =
52
52
List (nextState)
53
53
54
- def mkHandlerCaseForState : CaseDef =
54
+ def mkHandlerCaseForState [ T : WeakTypeTag ] : CaseDef =
55
55
mkHandlerCase(state, stats :+ mkStateTree(nextState, symLookup))
56
56
57
57
override val toString : String =
@@ -62,7 +62,7 @@ trait ExprBuilder {
62
62
* a branch of an `if` or a `match`.
63
63
*/
64
64
final class AsyncStateWithoutAwait (var stats : List [Tree ], val state : Int , val nextStates : List [Int ]) extends AsyncState {
65
- override def mkHandlerCaseForState : CaseDef =
65
+ override def mkHandlerCaseForState [ T : WeakTypeTag ] : CaseDef =
66
66
mkHandlerCase(state, stats)
67
67
68
68
override val toString : String =
@@ -79,39 +79,47 @@ trait ExprBuilder {
79
79
def nextStates : List [Int ] =
80
80
List (nextState)
81
81
82
- override def mkHandlerCaseForState : CaseDef = {
83
- val callOnComplete = futureSystemOps.onComplete(Expr (awaitable.expr),
84
- Expr (This (tpnme.EMPTY )), Expr (Ident (name.execContext))).tree
85
- mkHandlerCase(state, stats ++ List (mkStateTree(onCompleteState, symLookup), callOnComplete, Return (literalUnit)))
82
+ override def mkHandlerCaseForState [T : WeakTypeTag ]: CaseDef = {
83
+ val fun = This (tpnme.EMPTY )
84
+ val callOnComplete = futureSystemOps.onComplete[Any , Unit ](Expr [futureSystem.Fut [Any ]](awaitable.expr),
85
+ Expr [futureSystem.Tryy [Any ] => Unit ](fun), Expr [futureSystem.ExecContext ](Ident (name.execContext))).tree
86
+ val tryGetOrCallOnComplete =
87
+ if (futureSystemOps.continueCompletedFutureOnSameThread)
88
+ If (futureSystemOps.isCompleted(Expr [futureSystem.Fut [_]](awaitable.expr)).tree,
89
+ Block (ifIsFailureTree[T ](futureSystemOps.getCompleted[Any ](Expr [futureSystem.Fut [Any ]](awaitable.expr)).tree) :: Nil , literalUnit),
90
+ Block (callOnComplete :: Nil , Return (literalUnit)))
91
+ else
92
+ Block (callOnComplete :: Nil , Return (literalUnit))
93
+ mkHandlerCase(state, stats ++ List (mkStateTree(onCompleteState, symLookup), tryGetOrCallOnComplete))
86
94
}
87
95
96
+ private def tryGetTree (tryReference : => Tree ) =
97
+ Assign (
98
+ Ident (awaitable.resultName),
99
+ TypeApply (Select (futureSystemOps.tryyGet[Any ](Expr [futureSystem.Tryy [Any ]](tryReference)).tree, newTermName(" asInstanceOf" )), List (TypeTree (awaitable.resultType)))
100
+ )
101
+
102
+ /* if (tr.isFailure)
103
+ * result.complete(tr.asInstanceOf[Try[T]])
104
+ * else {
105
+ * <resultName> = tr.get.asInstanceOf[<resultType>]
106
+ * <nextState>
107
+ * <mkResumeApply>
108
+ * }
109
+ */
110
+ def ifIsFailureTree [T : WeakTypeTag ](tryReference : => Tree ) =
111
+ If (futureSystemOps.tryyIsFailure(Expr [futureSystem.Tryy [T ]](tryReference)).tree,
112
+ Block (futureSystemOps.completeProm[T ](
113
+ Expr [futureSystem.Prom [T ]](symLookup.memberRef(name.result)),
114
+ Expr [futureSystem.Tryy [T ]](
115
+ TypeApply (Select (tryReference, newTermName(" asInstanceOf" )),
116
+ List (TypeTree (futureSystemOps.tryType[T ]))))).tree :: Nil ,
117
+ Return (literalUnit)),
118
+ Block (List (tryGetTree(tryReference)), mkStateTree(nextState, symLookup))
119
+ )
120
+
88
121
override def mkOnCompleteHandler [T : WeakTypeTag ]: Option [CaseDef ] = {
89
- val tryGetTree =
90
- Assign (
91
- Ident (awaitable.resultName),
92
- TypeApply (Select (futureSystemOps.tryyGet[T ](Expr [futureSystem.Tryy [T ]](Ident (symLookup.applyTrParam))).tree, newTermName(" asInstanceOf" )), List (TypeTree (awaitable.resultType)))
93
- )
94
-
95
- /* if (tr.isFailure)
96
- * result.complete(tr.asInstanceOf[Try[T]])
97
- * else {
98
- * <resultName> = tr.get.asInstanceOf[<resultType>]
99
- * <nextState>
100
- * <mkResumeApply>
101
- * }
102
- */
103
- val ifIsFailureTree =
104
- If (futureSystemOps.tryyIsFailure(Expr [futureSystem.Tryy [T ]](Ident (symLookup.applyTrParam))).tree,
105
- Block (futureSystemOps.completeProm[T ](
106
- Expr [futureSystem.Prom [T ]](symLookup.memberRef(name.result)),
107
- Expr [futureSystem.Tryy [T ]](
108
- TypeApply (Select (Ident (symLookup.applyTrParam), newTermName(" asInstanceOf" )),
109
- List (TypeTree (futureSystemOps.tryType[T ]))))).tree :: Nil ,
110
- Return (literalUnit)),
111
- Block (List (tryGetTree), mkStateTree(nextState, symLookup))
112
- )
113
-
114
- Some (mkHandlerCase(onCompleteState, List (ifIsFailureTree)))
122
+ Some (mkHandlerCase(onCompleteState, List (ifIsFailureTree[T ](Ident (symLookup.applyTrParam)))))
115
123
}
116
124
117
125
override val toString : String =
@@ -337,7 +345,7 @@ trait ExprBuilder {
337
345
case s :: Nil =>
338
346
List (caseForLastState)
339
347
case _ =>
340
- val initCases = for (state <- asyncStates.toList.init) yield state.mkHandlerCaseForState
348
+ val initCases = for (state <- asyncStates.toList.init) yield state.mkHandlerCaseForState[ T ]
341
349
initCases :+ caseForLastState
342
350
}
343
351
}
0 commit comments