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);
}
}
}
}