protected virtual IEnumerable <Syntax> TranslateIfElseStatement(IfElseStatement ifElseStatement, ILTranslationContext data) { var ib = new S.IfStatement(); ib.Condition = GetExpression(ifElseStatement.Condition, data); ib.TruePart = GetStatements(ifElseStatement.TrueStatement, data); ib.FalsePart = GetStatements(ifElseStatement.FalseStatement, data); yield return(ib); }
protected virtual Expression TranslateAssignmentExpression(E.AssignmentExpression expression) { if (expression.CompoundOperator == E.BinaryOperator.Add) { var array = expression.Target.LogicalOrWith(expression.Target.AssignedBy(new E.ArrayExpression())); return(new E.ConditionalExpression() { Condition = expression.Value, TruePart = expression.Target.AssignedBy(array.Property("concat").Call(expression.Target)), FalsePart = ExpressionBuilder.Undefined() }); } else { var f = new E.FunctionExpression(); var ifb = new S.IfStatement(); ifb.Condition = expression.Target.LogicalAndWith(expression.Value); var inner = new S.IfStatement(); inner.Condition = expression.Value.IsArray(); inner.TruePart.Add( expression.Target.AssignedBy(expression.Target.Property("filter").Call( new E.ArrowFunctionExpression( new D.Parameter("e"), expression.Value.Property("indexOf").Call(new E.IdentifierExpression("e")).IsLessThan(new E.NumberExpression(0))) ) ) ); inner.FalsePart.Add( expression.Target.Property("filter").Call( new E.ArrowFunctionExpression( new D.Parameter("e"), new E.IdentifierExpression("e").IsStrictNotEqualTo(expression.Value) ) ) ); ifb.TruePart.Add(inner); f.Statements.Add(ifb); return(f.Call()); } }
protected virtual Expression TranslateInvocationExpression(E.CallExpression callExpression) { var f = new E.FunctionExpression(); var l = new S.VariableDeclaration(); l.Type = S.VariableDeclarationType.Let; l.Bindings.Add(new S.VariableBinding() { Variable = new E.IdentifierExpression("h") }); f.Statements.Add(l); var ifb = new S.IfStatement(); ifb.Condition = callExpression.Target; var inner = new S.IfStatement(); inner.Condition = callExpression.Target.IsArray(); inner.TruePart.Add( callExpression.Target.Property("forEach").Call( new E.ArrowFunctionExpression( new D.Parameter("e"), new E.IdentifierExpression("h").AssignedBy(new E.IdentifierExpression("e").Call(callExpression.Parameters)) ) ) ); inner.TruePart.Add(new E.IdentifierExpression("h").ToReturn()); inner.FalsePart.Add(callExpression.ToReturn()); ifb.TruePart.Add(inner); f.Statements.Add(ifb); return(f.Call()); }
protected virtual IEnumerable <Syntax> TranslateUsingStatement(UsingStatement usingStatement, ILTranslationContext data) { var b = new S.BlockStatement(); var rvd = usingStatement.ResourceAcquisition as VariableDeclarationStatement; var vds = new S.VariableDeclaration(); vds.Type = S.VariableDeclarationType.Let; if (rvd != null) { foreach (var v in rvd.Variables) { vds.Bindings.Add(new S.VariableBinding() { Variable = new E.IdentifierExpression() { Name = v.Name }, Type = ResolveType(v, rvd.Type), Initializer = GetExpression(v.Initializer, data) }); } } else { var ex = (ICSharpCode.NRefactory.CSharp.Expression)usingStatement.ResourceAcquisition; vds.Bindings.Add(new S.VariableBinding() { Variable = new E.IdentifierExpression() { Name = "__usingResource" }, Initializer = GetExpression(ex, data) }); } b.Statements.Add(vds); var tf = new S.TryStatement(); tf.TryBlock = GetStatements(usingStatement.EmbeddedStatement, data); foreach (var bd in vds.Bindings) { var ib = new S.IfStatement(); ib.Condition = bd.Variable; ib.TruePart.Add(new S.ExpressionStatement() { Expression = new E.CallExpression() { Target = new E.PropertyExpression() { Object = bd.Variable, Property = "Dispose" } } }); tf.FinallyBlock.Add(ib); } b.Statements.Add(tf); yield return(b); }