public override BoundNode VisitAwaitExpression(BoundAwaitExpression node) { BoundExpression expression = (BoundExpression)this.Visit(node.Expression); TypeSymbol type = this.VisitType(node.Type); return(node.Update(expression, VisitMethodSymbol(node.GetAwaiter), VisitPropertySymbol(node.IsCompleted), VisitMethodSymbol(node.GetResult), type)); }
public override BoundNode VisitAwaitExpression(BoundAwaitExpression node) { // An await expression has already been wrapped in a BoundSpillSequence if not at the top level, so // the spilling will occur in the enclosing node. BoundSpillSequenceBuilder builder = null; var expr = VisitExpression(ref builder, node.Expression); return(UpdateExpression(builder, node.Update(expr, node.AwaitableInfo, node.Type))); }
private BoundBlock VisitAwaitExpression(BoundAwaitExpression node, BoundExpression resultPlace) { var expression = (BoundExpression)Visit(node.Expression); resultPlace = (BoundExpression)Visit(resultPlace); MethodSymbol getAwaiter = VisitMethodSymbol(node.AwaitableInfo.GetAwaiter); MethodSymbol getResult = VisitMethodSymbol(node.AwaitableInfo.GetResult); MethodSymbol isCompletedMethod = ((object)node.AwaitableInfo.IsCompleted != null) ? VisitMethodSymbol(node.AwaitableInfo.IsCompleted.GetMethod) : null; TypeSymbol type = VisitType(node.Type); // The awaiter temp facilitates EnC method remapping and thus have to be long-lived. // It transfers the awaiter objects from the old version of the MoveNext method to the new one. Debug.Assert(node.Syntax.IsKind(SyntaxKind.AwaitExpression) || node.WasCompilerGenerated); TypeSymbol awaiterType = getAwaiter.ReturnType.TypeSymbol; var awaiterTemp = F.SynthesizedLocal(awaiterType, syntax: node.Syntax, kind: SynthesizedLocalKind.Awaiter); var awaitIfIncomplete = F.Block( // temp $awaiterTemp = <expr>.GetAwaiter(); F.Assignment( F.Local(awaiterTemp), MakeCallMaybeDynamic(expression, getAwaiter, WellKnownMemberNames.GetAwaiter)), // hidden sequence point facilitates EnC method remapping, see explanation on SynthesizedLocalKind.Awaiter: F.HiddenSequencePoint(), // if(!($awaiterTemp.IsCompleted)) { ... } F.If( condition: F.Not(GenerateGetIsCompleted(awaiterTemp, isCompletedMethod)), thenClause: GenerateAwaitForIncompleteTask(awaiterTemp))); BoundExpression getResultCall = MakeCallMaybeDynamic( F.Local(awaiterTemp), getResult, WellKnownMemberNames.GetResult, resultsDiscarded: resultPlace == null); // [$resultPlace = ] $awaiterTemp.GetResult(); BoundStatement getResultStatement = resultPlace != null && type.SpecialType != SpecialType.System_Void ? F.Assignment(resultPlace, getResultCall) : F.ExpressionStatement(getResultCall); return(F.Block( ImmutableArray.Create(awaiterTemp), awaitIfIncomplete, getResultStatement)); }
public override BoundNode VisitAwaitExpression(BoundAwaitExpression node) { BoundExpression expression = (BoundExpression)this.Visit(node.Expression); TypeSymbol type = this.VisitType(node.Type); return node.Update(expression, VisitMethodSymbol(node.GetAwaiter), VisitPropertySymbol(node.IsCompleted), VisitMethodSymbol(node.GetResult), type); }
public sealed override BoundNode VisitAwaitExpression(BoundAwaitExpression node) { // await expressions must, by now, have been moved to the top level. throw ExceptionUtilities.Unreachable; }
public override BoundNode VisitAwaitExpression(BoundAwaitExpression node) { _sawAwait = true; return(null); }
public override BoundNode VisitAwaitExpression(BoundAwaitExpression node) { _seenAwait = true; return(base.VisitAwaitExpression(node)); }
public BoundExpression VisitAwaitExpression(BoundAwaitExpression node, bool used) { return(RewriteAwaitExpression((BoundExpression)base.VisitAwaitExpression(node), used)); }
public override BoundNode VisitAwaitExpression(BoundAwaitExpression node) { return(VisitAwaitExpression(node, true)); }