public override Node Visit(ExpressionStatement expressionStatement) { base.Visit(expressionStatement); if (appendMethodsList.Contains(expressionStatement.Expression)) { var appendMethodCall = expressionStatement.Expression as MethodInvocationExpression; var blockStatement = new BlockStatement(); blockStatement.Statements.AddRange(outputStatements); appendMethodCall.Arguments[0] = outputVre; blockStatement.Statements.Add(expressionStatement); return blockStatement; } return expressionStatement; }
public virtual void Visit(BlockStatement blockStatement) { OpenBrace(); foreach (var statement in blockStatement.Statements) { VisitDynamic(statement); } CloseBrace(); }
/// <summary> /// Initializes a new instance of the <see cref="ParametersBlock" /> class. /// </summary> /// <param name="name">The name.</param> /// <param name="statements">The statements.</param> public ParametersBlock(Identifier name, BlockStatement statements) { Name = name; Body = statements; }
/// <summary> /// Creates a ForStatement with the same behavior /// </summary> /// <param name="forEachStatement">the ForEachStatement</param> /// <returns>the ForStatement</returns> private static ForStatement ExpandForEachStatement(ForEachStatement forEachStatement) { if (forEachStatement != null) { var collec = forEachStatement.Collection.TypeInference.Declaration as Variable; LiteralExpression dimLit = null; if (collec.Type is ArrayType) { if ((collec.Type as ArrayType).Dimensions.Count == 1) { dimLit = (collec.Type as ArrayType).Dimensions[0] as LiteralExpression; } } if (dimLit != null) { var initializer = new Variable(ScalarType.Int, forEachStatement.Variable.Name.Text + "Iter", new LiteralExpression(0)); var vre = new VariableReferenceExpression(initializer.Name); var condition = new BinaryExpression(BinaryOperator.Less, vre, dimLit); var next = new UnaryExpression(UnaryOperator.PreIncrement, vre); ForStatement forStatement = new ForStatement(new DeclarationStatement(initializer), condition, next); var body = new BlockStatement(); var variable = forEachStatement.Variable; variable.InitialValue = new IndexerExpression(forEachStatement.Collection, new VariableReferenceExpression(initializer)); body.Statements.Add(new DeclarationStatement(variable)); if (forEachStatement.Body is BlockStatement) body.Statements.AddRange((forEachStatement.Body as BlockStatement).Statements); else body.Statements.Add(forEachStatement.Body); forStatement.Body = body; return forStatement; } // TODO: multidimension-array? // TODO: unroll? // TODO: multiple foreach? } return null; }
private void AddPushPopParameters(BlockStatement blockStatement, Identifier parameterType, Identifier parameterMember, Expression paramValue, SourceSpan span) { var pushStatement = new ExpressionStatement(new MethodInvocationExpression(new MemberReferenceExpression(new VariableReferenceExpression("context"), "PushParameters"), paramValue)) {Span = span}; var popStatement = new ExpressionStatement(new MethodInvocationExpression(new MemberReferenceExpression(new VariableReferenceExpression("context"), "PopParameters"))) {Span = span}; blockStatement.Statements.Insert(0, pushStatement); ; blockStatement.Statements.Add(popStatement); }
protected virtual void Visit(ForEachStatement forEachStatement) { WriteLinkLine(forEachStatement); if (forEachStatement.Variable == null) { localVariableCount++; Identifier parameterType; Identifier parameterMember; if (!TryParameters(forEachStatement.Collection, out parameterType, out parameterMember)) { Write(@"#error ""Unexpected parameter for 'foreach params' ["); VisitDynamic(forEachStatement.Collection); WriteLine(@"]. Expecting single property access"""); return; } string variable = "____" + localVariableCount; Write("foreach(").Write("var ").Write(variable).Write(" in "); VisitDynamic(forEachStatement.Collection); WriteLine(")"); var statement = forEachStatement.Body as BlockStatement; if (statement == null) { statement = new BlockStatement {Span = forEachStatement.Body.Span}; statement.Statements.Add(forEachStatement.Body); } AddPushPopParameters(statement, parameterType, parameterMember, new VariableReferenceExpression(variable), forEachStatement.Span); VisitDynamic(statement); localVariableCount--; } else { Write("foreach("); IsVisitingVariableInlines = true; VisitDynamic(forEachStatement.Variable); IsVisitingVariableInlines = false; Write(" in "); VisitDynamic(forEachStatement.Collection); Write(")"); WriteLine(); VisitDynamic(forEachStatement.Body); } }
protected void Visit(BlockStatement blockStatement) { containerStack.Push(blockStatement); Visit((Node)blockStatement); containerStack.Pop(); }
public override void Visit(BlockStatement blockStatement) { containerStack.Push(blockStatement); base.Visit(blockStatement); containerStack.Pop(); }