public sealed override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { if (node.Expression.Kind == BoundKind.AwaitExpression) { return(VisitAwaitExpression( (BoundAwaitExpression)node.Expression, resultPlace: null )); } else if (node.Expression.Kind == BoundKind.AssignmentOperator) { var expression = (BoundAssignmentOperator)node.Expression; if (expression.Right.Kind == BoundKind.AwaitExpression) { return(VisitAwaitExpression( (BoundAwaitExpression)expression.Right, resultPlace: expression.Left )); } } BoundExpression expr = (BoundExpression)this.Visit(node.Expression); return((expr != null) ? node.Update(expr) : (BoundStatement)F.StatementList()); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { // ref assignments might be translated away (into nothing). If so just // return no statement. The enclosing statement list will just omit it. BoundExpression expression = (BoundExpression)this.Visit(node.Expression); return((expression == null) ? null : node.Update(expression)); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { BoundSpillSequenceBuilder builder = null; BoundExpression expr = VisitExpression(ref builder, node.Expression); Debug.Assert(expr != null); Debug.Assert(builder == null || builder.Value == null); return(UpdateStatement(builder, node.Update(expr))); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { if (node.Expression.Kind == BoundKind.AwaitExpression) { var awaitExpression = VisitAwaitExpression((BoundAwaitExpression)node.Expression, resultsDiscarded: true); return(node.Update(awaitExpression)); } return(base.VisitExpressionStatement(node)); }
// All nodes with a single child expression are rewritten in the same manner. // // If the node is an expression and the child contains an await expression, then the rewriting transforms: // Expression(Spill(sideEffects, Value)) // to: // Spill(sideEffects, Expression(Value)) // // If the node is a statement and the child contains an await expression, then the rewriting transforms: // ExpressionStatement(Spill(sideEffects, Value)) // to: // Block(sideEffects, ExpressionStatement(Value)) // // If the child expression does not contain an await expression then no rewriting is performed. public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { BoundExpression expression = (BoundExpression)this.Visit(node.Expression); if (expression.Kind != BoundKind.SpillSequence) { return(node.Update(expression)); } return(RewriteSpillSequenceAsBlock((BoundSpillSequence)expression)); }
// All nodes with a single child expression are rewritten in the same manner. // // If the node is an expression and the child contains an await expression, then the rewriting transforms: // Expression(Spill(sideEffects, Value)) // to: // Spill(sideEffects, Expression(Value)) // // If the node is a statement and the child contains an await expression, then the rewriting transforms: // ExpressionStatement(Spill(sideEffects, Value)) // to: // Block(sideEffects, ExpressionStatement(Value)) // // If the child expression does not contain an await expression then no rewriting is performed. public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { BoundExpression expression = (BoundExpression)this.Visit(node.Expression); if (expression.Kind != BoundKind.SpillSequence) { return node.Update(expression); } return RewriteSpillSequenceAsBlock((BoundSpillSequence)expression); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { var syntax = node.Syntax; var loweredExpression = VisitUnusedExpression(node.Expression); if (loweredExpression == null) { // NOTE: not using a BoundNoOpStatement, since we don't want a nop to be emitted. // CONSIDER: could use a BoundNoOpStatement (DevDiv #12943). return(BoundStatementList.Synthesized(syntax)); } else { return(AddSequencePoint(node.Update(loweredExpression))); } }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { var syntax = node.Syntax; var loweredExpression = VisitUnusedExpression(node.Expression); if (loweredExpression == null) { // NOTE: not using a BoundNoOpStatement, since we don't want a nop to be emitted. // CONSIDER: could use a BoundNoOpStatement (DevDiv #12943). return BoundStatementList.Synthesized(syntax); } else { return AddSequencePoint(node.Update(loweredExpression)); } }
private BoundStatement RewriteExpressionStatement(BoundExpressionStatement node, bool suppressInstrumentation = false) { var loweredExpression = VisitUnusedExpression(node.Expression); if (loweredExpression == null) { return(null); } else { BoundStatement result = node.Update(loweredExpression); if (!suppressInstrumentation && this.Instrument && !node.WasCompilerGenerated) { result = _instrumenter.InstrumentExpressionStatement(node, result); } return(result); } }
private BoundStatement RewriteExpressionStatement(BoundExpressionStatement node, bool suppressInstrumentation = false) { var loweredExpression = VisitUnusedExpression(node.Expression); if (loweredExpression == null) { return null; } else { BoundStatement result = node.Update(loweredExpression); if (!suppressInstrumentation && this.Instrument && !node.WasCompilerGenerated) { result = _instrumenter.InstrumentExpressionStatement(node, result); } return result; } }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { EnterStatement(node); BoundSpillSequenceBuilder builder = null; BoundExpression expr; if (node.Expression.Kind == BoundKind.AwaitExpression) { // await expression with result discarded var awaitExpression = (BoundAwaitExpression)node.Expression; var expression = VisitExpression(ref builder, awaitExpression.Expression); expr = awaitExpression.Update(expression, awaitExpression.GetAwaiter, awaitExpression.IsCompleted, awaitExpression.GetResult, awaitExpression.Type); } else { expr = VisitExpression(ref builder, node.Expression); } Debug.Assert(expr != null); Debug.Assert(builder == null || builder.Value == null); return(UpdateStatement(builder, node.Update(expr), substituteTemps: true)); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { BoundSpillSequence2 ss = null; BoundExpression expr; if (node.Expression.Kind == BoundKind.AwaitExpression) { // await expression with result discarded var awaitExpression = (BoundAwaitExpression)node.Expression; var expression = VisitExpression(ref ss, awaitExpression.Expression); expr = awaitExpression.Update(expression, awaitExpression.GetAwaiter, awaitExpression.IsCompleted, awaitExpression.GetResult, awaitExpression.Type); } else { expr = VisitExpression(ref ss, node.Expression); } Debug.Assert(expr != null); Debug.Assert(ss == null || ss.Value == null); BoundStatement replacement = UpdateStatement(ss, node.Update(expr)); return(replacement); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { BoundSpillSequence2 ss = null; BoundExpression expr; if (node.Expression.Kind == BoundKind.AwaitExpression) { // await expression with result discarded var awaitExpression = (BoundAwaitExpression)node.Expression; var expression = VisitExpression(ref ss, awaitExpression.Expression); expr = awaitExpression.Update(expression, awaitExpression.GetAwaiter, awaitExpression.IsCompleted, awaitExpression.GetResult, awaitExpression.Type); } else { expr = VisitExpression(ref ss, node.Expression); } Debug.Assert(expr != null); Debug.Assert(ss == null || ss.Value == null); BoundStatement replacement = UpdateStatement(ss, node.Update(expr)); return replacement; }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { // ref assignments might be translated away (into nothing). If so just // return no statement. The enclosing statement list will just omit it. BoundExpression expression = (BoundExpression)this.Visit(node.Expression); return (expression == null) ? null : node.Update(expression); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { if (node.Expression.Kind == BoundKind.AwaitExpression) { var awaitExpression = VisitAwaitExpression((BoundAwaitExpression)node.Expression, resultsDiscarded: true); return node.Update(awaitExpression); } return base.VisitExpressionStatement(node); }
public override BoundNode VisitExpressionStatement(BoundExpressionStatement node) { if (node.Expression.Kind == BoundKind.AwaitExpression) { return VisitAwaitExpression((BoundAwaitExpression)node.Expression, resultPlace: null); } else if (node.Expression.Kind == BoundKind.AssignmentOperator) { var expression = (BoundAssignmentOperator)node.Expression; if (expression.Right.Kind == BoundKind.AwaitExpression) { return VisitAwaitExpression((BoundAwaitExpression)expression.Right, resultPlace: expression.Left); } } BoundExpression expr = (BoundExpression)this.Visit(node.Expression); return (expr != null) ? node.Update(expr) : (BoundStatement)F.Block(); }