Beispiel #1
0
 public virtual void Visit(JsVariableDeclaration node)
 {
     DefaultVisit(node);
     foreach (var declaration in node.Declarations)
     {
         declaration.Accept(this);
     }
 }
Beispiel #2
0
 public virtual void Visit(JsVariableDeclaration node)
 {
     if (node != null)
     {
         if (node.Initializer != null)
         {
             node.Initializer.Accept(this);
         }
     }
 }
Beispiel #3
0
 public virtual JsNode Visit(JsVariableDeclaration node)
 {
     return(DefaultVisit(node, x =>
     {
         for (var i = 0; i < x.Declarations.Count; i++)
         {
             x.Declarations[i] = (JsVariableDeclarator)x.Declarations[i].Accept(this);
         }
         return x;
     }));
 }
Beispiel #4
0
 public override void VisitVariableDeclaration(JsVariableDeclaration node)
 {
     output.Append("var ");
     for (var i = 0; i < node.Declarations.Count; i++)
     {
         var declaration = node.Declarations[i];
         declaration.Accept(this);
         if (i < node.Declarations.Count - 1)
         {
             output.Append(", ");
         }
     }
 }
            public override JsVariableDeclaration VisitVariableDeclaration(JsVariableDeclaration declaration, Tuple <Dictionary <string, string>, HashSet <string> > data)
            {
                string newName;

                if (data.Item1.TryGetValue(declaration.Name, out newName))
                {
                    return(JsStatement.Declaration(newName, declaration.Initializer != null ? VisitExpression(declaration.Initializer, data) : null));
                }
                else
                {
                    return(base.VisitVariableDeclaration(declaration, data));
                }
            }
        public static JsBlockStatement RewriteAsyncMethod(JsBlockStatement block, Func <JsExpression, bool> isExpressionComplexEnoughForATemporaryVariable, Func <string> allocateTempVariable, Func <string> allocateStateVariable, Func <string> allocateLoopLabel, string stateMachineVariableName, string doFinallyBlocksVariableName, JsVariableDeclaration taskCompletionSource, Func <JsExpression, JsExpression> makeSetResult, Func <JsExpression, JsExpression> makeSetException, Func <JsExpression> getTask, Func <JsExpression, JsExpression, JsExpression> bindToContext)
        {
            var obj = new StateMachineRewriter(isExpressionComplexEnoughForATemporaryVariable, allocateTempVariable, allocateStateVariable, allocateLoopLabel);

            return(obj.ProcessAsyncMethod(block, stateMachineVariableName, doFinallyBlocksVariableName, taskCompletionSource, makeSetResult, makeSetException, getTask, bindToContext));
        }
        private JsBlockStatement ProcessAsyncMethod(JsBlockStatement statement, string stateMachineMethodName, string doFinallyBlocksVariableName, JsVariableDeclaration taskCompletionSource, Func <JsExpression, JsExpression> makeSetResult, Func <JsExpression, JsExpression> makeSetException, Func <JsExpression> getTask, Func <JsExpression, JsExpression, JsExpression> bindToContext)
        {
            _stateMachineMethodName      = stateMachineMethodName;
            _doFinallyBlocksVariableName = doFinallyBlocksVariableName;
            _makeSetResult = taskCompletionSource != null ? makeSetResult : null;
            _needDoFinallyBlocksVariable = new HasAwaitInsideTryWithFinallyVisitor().Analyze(statement);

            var result      = Process(statement, isIteratorBlock: false, isAsync: true);
            var hoistResult = VariableHoistingVisitor.Process(result);

            string catchVariable = _allocateTempVariable();

            JsStatement body;

            if (taskCompletionSource != null && (statement.Statements.Count == 0 || IsNextStatementReachable(statement.Statements[statement.Statements.Count - 1])))                    // If we return the task, and if we risk falling out of the original method, we need to add a setResult call.
            {
                body = JsStatement.Block(hoistResult.Item1.Statements.Concat(new JsStatement[] { makeSetResult(null) }));
            }
            else
            {
                body = hoistResult.Item1;
            }

            if (taskCompletionSource != null)
            {
                body = JsStatement.Try(body, JsStatement.Catch(catchVariable, JsStatement.Block(makeSetException(JsExpression.Identifier(catchVariable)))), null);
            }

            IEnumerable <JsVariableDeclaration> declarations = new[] { JsStatement.Declaration(_stateVariableName, JsExpression.Number(0)) };

            if (taskCompletionSource != null)
            {
                declarations = declarations.Concat(new[] { taskCompletionSource });
            }
            declarations = declarations.Concat(hoistResult.Item2.Select(v => JsStatement.Declaration(v, null)));

            if (_needDoFinallyBlocksVariable)
            {
                body = JsStatement.Block(new[] { JsStatement.Var(_doFinallyBlocksVariableName, JsExpression.True) }.Concat(body is JsBlockStatement ? ((JsBlockStatement)body).Statements : (IEnumerable <JsStatement>) new[] { body }));
            }

            var stateMachine      = JsExpression.FunctionDefinition(new string[0], body);
            var boundStateMachine = UsesThisVisitor.Analyze(stateMachine.Body) ? bindToContext(stateMachine, JsExpression.This) : stateMachine;

            IEnumerable <JsStatement> stmts = new JsStatement[] { JsStatement.Var(declarations),
                                                                  JsStatement.Var(stateMachineMethodName, boundStateMachine),
                                                                  JsExpression.Invocation(JsExpression.Identifier(stateMachineMethodName)) };

            if (taskCompletionSource != null)
            {
                stmts = stmts.Concat(new[] { JsStatement.Return(getTask()) });
            }

            return(JsStatement.Block(stmts));
        }
 public virtual void Visit(JsVariableDeclaration node)
 {
     if (node != null)
     {
         if (node.Initializer != null)
         {
             node.Initializer.Accept(this);
         }
     }
 }
Beispiel #9
0
 public JsLocalVariableDeclaration(JsVariableDeclaration declaration)
 {
     Declaration = declaration;
 }
Beispiel #10
0
        private JsBlockStatement ProcessAsyncMethod(JsBlockStatement statement, string stateMachineMethodName, string doFinallyBlocksVariableName, JsVariableDeclaration taskCompletionSource, Func <JsExpression, JsExpression> makeSetResult, Func <JsExpression, JsExpression> makeSetException, Func <JsExpression> getTask)
        {
            _stateMachineMethodName      = stateMachineMethodName;
            _doFinallyBlocksVariableName = doFinallyBlocksVariableName;
            _makeSetResult = taskCompletionSource != null ? makeSetResult : null;
            _needDoFinallyBlocksVariable = new HasAwaitInsideTryWithFinallyVisitor().Analyze(statement);

            var result      = Process(statement, isIteratorBlock: false, isAsync: true);
            var hoistResult = VariableHoistingVisitor.Process(result);

            string catchVariable = _allocateTempVariable();

            JsBlockStatement tryBody;

            if (taskCompletionSource != null && (statement.Statements.Count == 0 || IsNextStatementReachable(statement.Statements[statement.Statements.Count - 1])))                    // If we return the task, and if we risk falling out of the original method, we need to add a setResult call.
            {
                tryBody = new JsBlockStatement(hoistResult.Item1.Statements.Concat(new[] { new JsExpressionStatement(makeSetResult(null)) }));
            }
            else
            {
                tryBody = hoistResult.Item1;
            }

            JsStatement body = new JsTryStatement(tryBody, new JsCatchClause(catchVariable,
                                                                             taskCompletionSource != null
                                                                                             ? new JsBlockStatement(new JsExpressionStatement(makeSetException(JsExpression.Identifier(catchVariable))))
                                                                                             : JsBlockStatement.EmptyStatement), null);

            IEnumerable <JsVariableDeclaration> declarations = new[] { new JsVariableDeclaration(_stateVariableName, JsExpression.Number(0)) };

            if (taskCompletionSource != null)
            {
                declarations = declarations.Concat(new[] { taskCompletionSource });
            }
            declarations = declarations.Concat(hoistResult.Item2.Select(v => new JsVariableDeclaration(v, null)));

            if (_needDoFinallyBlocksVariable)
            {
                body = new JsBlockStatement(new JsVariableDeclarationStatement(_doFinallyBlocksVariableName, JsExpression.True), body);
            }

            IEnumerable <JsStatement> stmts = new JsStatement[] { new JsVariableDeclarationStatement(declarations),
                                                                  new JsVariableDeclarationStatement(stateMachineMethodName, JsExpression.FunctionDefinition(new string[0], body)),
                                                                  new JsExpressionStatement(JsExpression.Invocation(JsExpression.Identifier(stateMachineMethodName))) };

            if (taskCompletionSource != null)
            {
                stmts = stmts.Concat(new[] { new JsReturnStatement(getTask()) });
            }

            return(new JsBlockStatement(stmts));
        }
Beispiel #11
0
 public void Visit(JsVariableDeclaration node)
 {
     BeforeVisit(node);
     DefaultVisit(node, VisitVariableDeclaration);
     AfterVisit(node);
 }
 public override JsVariableDeclaration VisitVariableDeclaration(JsVariableDeclaration declaration, HashSet <string> data)
 {
     data.Add(declaration.Name);
     return(base.VisitVariableDeclaration(declaration, data));
 }
Beispiel #13
0
 public JsForInStatement(JsVariableDeclaration declaration, JsExpression target)
 {
     Declaration = declaration;
     Target      = target;
 }
        public virtual JsVariableDeclaration VisitVariableDeclaration(JsVariableDeclaration declaration, TData data)
        {
            var after = (declaration.Initializer != null ? VisitExpression(declaration.Initializer, data) : null);

            return(ReferenceEquals(after, declaration.Initializer) ? declaration : new JsVariableDeclaration(declaration.Name, after));
        }
Beispiel #15
0
 public virtual void VisitVariableDeclaration(JsVariableDeclaration node)
 {
 }
Beispiel #16
0
 public override JsVariableDeclaration VisitVariableDeclaration(JsVariableDeclaration declaration, object data)
 {
     _result.Add(declaration.Name);
     return(base.VisitVariableDeclaration(declaration, data));
 }
Beispiel #17
0
 /// <summary>
 /// Equalses the specified other.
 /// </summary>
 /// <param name="other">The other.</param>
 /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
 protected bool Equals(JsVariableDeclaration other) =>
 Kind == other.Kind && Declarations.SequenceEqual(other.Declarations);