public virtual void Visit(JsVariableDeclaration node) { DefaultVisit(node); foreach (var declaration in node.Declarations) { declaration.Accept(this); } }
public virtual void Visit(JsVariableDeclaration node) { if (node != null) { if (node.Initializer != null) { node.Initializer.Accept(this); } } }
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; })); }
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); } } }
public JsLocalVariableDeclaration(JsVariableDeclaration declaration) { Declaration = declaration; }
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)); }
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)); }
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)); }
public virtual void VisitVariableDeclaration(JsVariableDeclaration node) { }
public override JsVariableDeclaration VisitVariableDeclaration(JsVariableDeclaration declaration, object data) { _result.Add(declaration.Name); return(base.VisitVariableDeclaration(declaration, data)); }
/// <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);