in jvm-agent/src/main/org/jetbrains/lincheck/jvm/agent/analysis/controlflow/LoopInformation.kt [388:416]
fun toFormattedString(): String {
val sb = StringBuilder()
if (loopInfo.loops.isEmpty()) {
sb.appendLine("NO LOOPS")
}
for ((index, loop) in loopInfo.loops.withIndex()) {
sb.appendLine("LOOP ${index + 1}")
sb.appendLine(" HEADER: B${loop.header}")
sb.appendLine(" BODY: ${loop.body.sorted().joinToString(", ") { "B$it" }}")
sb.appendLine(" BACK EDGES:")
sb.appendLine(loop.backEdges.toFormattedString().prependIndent(" "))
sb.appendLine(" NORMAL EXITS:")
loop.normalExits.let {
if (it.isEmpty()) sb.appendLine(" NONE")
else sb.appendLine(it.toFormattedString().prependIndent(" "))
}
sb.appendLine(" EXCEPTION EXIT HANDLERS:")
loop.exceptionalExitHandlers.let {
if (it.isEmpty()) sb.appendLine(" NONE")
else sb.appendLine(it.sorted().joinToString(", ") { block -> "B$block" }.prependIndent(" "))
}
sb.appendLine(" EXCLUSIVE EXITS:")
loop.exclusiveExits.let {
if (it.isEmpty()) sb.appendLine(" NONE")
else sb.appendLine(it.sorted().joinToString(", ") { block -> "B$block" }.prependIndent(" "))
}
}
return sb.toString()
}