/// <summary> /// Attempt to undo the if / do-while pattern that many compilers emit when /// compiling while loops. /// </summary> /// <remarks> /// </remarks> private AbsynWhile TryRewriteGuardedDoWhile(AbsynIf ifStm) { if (ifStm.Then.Count == 1 && ifStm.Then[0] is AbsynDoWhile doWhile) { var ifCond = ifStm.Condition; var doCond = doWhile.Condition; if (cmp.Equals(ifCond, doCond)) { // Pattern 1 return(new AbsynWhile(doCond, doWhile.Body)); } var ifCondBin = ifStm.Condition as BinaryExpression; var doCondBin = doWhile.Condition as BinaryExpression; if (ifCondBin == null || doCondBin == null) { return(null); } if (ifCondBin.Operator == Operator.Ne && ifCondBin.Right is Constant ifConst && ifConst.IsZero && doCondBin.Operator == Operator.Gt) { if (cmp.Equals(ifCondBin.Left, doCondBin.Left)) { // Flip the condition. var condNew = new BinaryExpression(Operator.Lt, PrimitiveType.Bool, doCondBin.Right, doCondBin.Left); return(new AbsynWhile(condNew, doWhile.Body)); } } } return(null); }
private void WriteIf(AbsynIf ifs) { writer.WriteKeyword("if"); writer.Write(" ("); WriteExpression(ifs.Condition); writer.Write(")"); writer.Terminate(); WriteIndentedStatements(ifs.Then, false); if (ifs.Else != null && ifs.Else.Count > 0) { writer.Indent(); writer.WriteKeyword("else"); if (IsSingleIfStatement(ifs.Else, out AbsynIf elseIf)) { writer.Write(" "); WriteIf(elseIf); } else { writer.Terminate(); WriteIndentedStatements(ifs.Else, false); } } }
private bool IsSingleIfStatement(List <AbsynStatement> stms, out AbsynIf elseIf) { elseIf = null; if (stms.Count != 1) { return(false); } elseIf = stms[0] as AbsynIf; return(elseIf != null); }
private AbsynIf EmitIfCondition(Expression exp, Conditional cond, AbsynStatementEmitter emitter) { if (cond is IfElse || cond is IfThenElse) { exp = exp.Invert(); } AbsynIf ifStm = new AbsynIf(); ifStm.Condition = exp; emitter.EmitStatement(ifStm); return(ifStm); }
private bool HasSingleIfThenElseStatement(List <AbsynStatement> stms) { if (stms.Count == 0) { return(false); } AbsynIf ifStm = stms[0] as AbsynIf; if (ifStm == null) { return(false); } return(ifStm.Then.Count > 0 && ifStm.Else.Count > 0); }
public AbsynStatement VisitIf(AbsynIf ifStm) { for (int i = 0; i < ifStm.Then.Count; ++i) { ifStm.Then[i] = ifStm.Then[i].Accept(this); } for (int i = 0; i < ifStm.Else.Count; ++i) { ifStm.Else[i] = ifStm.Else[i].Accept(this); } if (ifStm.Then.Count == 0 && ifStm.Else.Count > 0) { ifStm.Condition = ifStm.Condition.Invert(); ifStm.Then.AddRange(ifStm.Else); ifStm.Else.Clear(); } return(ifStm); }
public void VisitIf(AbsynIf ifs) { writer.Indent(); WriteIf(ifs); }
public void VisitIf(AbsynIf ifStm) { stms.Add(ifStm); }
public bool VisitIf(AbsynIf ifStm) { RemoveRedundantReturn(ifStm.Then); RemoveRedundantReturn(ifStm.Else); return(false); }
public void VisitIf(AbsynIf ifs) { InnerFormatter.Indent(); WriteIf(ifs); }
//$TODO: .NET 5 output parameter is non-null if the method returns true. private bool IsSingleIfStatement(List <AbsynStatement> stms, out AbsynIf elseIf) { elseIf = default !;