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;
        }
Example #2
0
        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;
 }
Example #4
0
        /// <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();
 }