private void InsertStatementBeforeImpl()

in Sources/SolToBoogie/SolidityDesugaring.cs [263:330]


        private void InsertStatementBeforeImpl(Block block, Statement beforeThis, Statement stmt)
        {
            for (int i = 0; i < block.Statements.Count; ++i)
            {
                Statement currentStmt = block.Statements[i];
                if (currentStmt == beforeThis)
                {
                    block.Statements.Insert(i, stmt);
                }
                else if (currentStmt is Block subBlock)
                {
                    InsertStatementBeforeImpl(subBlock, beforeThis, stmt);
                }
                else if (currentStmt is IfStatement ifStmt)
                {
                    if (ifStmt.TrueBody is Block)
                    {
                        InsertStatementBeforeImpl(ifStmt.TrueBody as Block, beforeThis, stmt);
                    }
                    else if (ifStmt.TrueBody == beforeThis)
                    {
                        ifStmt.TrueBody = CreateBlockFromTwoStatements(stmt, beforeThis);
                    }

                    if (ifStmt.FalseBody is Block)
                    {
                        InsertStatementBeforeImpl(ifStmt.FalseBody as Block, beforeThis, stmt);
                    }
                    else if (ifStmt.FalseBody == beforeThis)
                    {
                        ifStmt.FalseBody = CreateBlockFromTwoStatements(stmt, beforeThis);
                    }
                }
                else if (currentStmt is WhileStatement whileStmt)
                {
                    if (whileStmt.Body is Block)
                    {
                        InsertStatementBeforeImpl(whileStmt.Body as Block, beforeThis, stmt);
                    }
                    else if (whileStmt.Body == beforeThis)
                    {
                        whileStmt.Body = CreateBlockFromTwoStatements(stmt, beforeThis);
                    }
                }
                else if (currentStmt is ForStatement forStmt)
                {
                    if (forStmt.Body is Block)
                    {
                        InsertStatementBeforeImpl(forStmt.Body as Block, beforeThis, stmt);
                    }
                    else if (forStmt.Body == beforeThis)
                    {
                        forStmt.Body = CreateBlockFromTwoStatements(stmt, beforeThis);
                    }
                }
                else if (currentStmt is DoWhileStatement doStmt)
                {
                    if (doStmt.Body is Block)
                    {
                        InsertStatementBeforeImpl(doStmt.Body as Block, beforeThis, stmt);
                    }
                    else if (doStmt.Body == beforeThis)
                    {
                        doStmt.Body = CreateBlockFromTwoStatements(stmt, beforeThis);
                    }
                }
            }
        }