Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
 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);
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
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);
        }
Ejemplo n.º 7
0
 public void VisitIf(AbsynIf ifs)
 {
     writer.Indent();
     WriteIf(ifs);
 }
Ejemplo n.º 8
0
 public void VisitIf(AbsynIf ifStm)
 {
     stms.Add(ifStm);
 }
Ejemplo n.º 9
0
 public bool VisitIf(AbsynIf ifStm)
 {
     RemoveRedundantReturn(ifStm.Then);
     RemoveRedundantReturn(ifStm.Else);
     return(false);
 }
Ejemplo n.º 10
0
 public void VisitIf(AbsynIf ifs)
 {
     InnerFormatter.Indent();
     WriteIf(ifs);
 }
Ejemplo n.º 11
0
 //$TODO: .NET 5 output parameter is non-null if the method returns true.
 private bool IsSingleIfStatement(List <AbsynStatement> stms, out AbsynIf elseIf)
 {
     elseIf = default !;