in src/org/jetbrains/java/decompiler/modules/decompiler/DecHelper.java [61:187]
public static boolean isChoiceStatement(Statement head, List<? super Statement> lst) {
Statement post = null;
Set<Statement> setDest = head.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.FORWARD);
if (setDest.contains(head)) {
return false;
}
while (true) {
lst.clear();
boolean repeat = false;
setDest.remove(post);
for (Statement stat : setDest) {
if (stat.getLastBasicType() != StatementType.GENERAL) {
if (post == null) {
post = stat;
repeat = true;
break;
}
else {
return false;
}
}
// preds
Set<Statement> setPred = stat.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.BACKWARD);
setPred.remove(head);
if (setPred.contains(stat)) {
return false;
}
if (!setDest.containsAll(setPred) || setPred.size() > 1) {
if (post == null) {
post = stat;
repeat = true;
break;
}
else {
return false;
}
}
else if (setPred.size() == 1) {
Statement pred = setPred.iterator().next();
while (lst.contains(pred)) {
Set<Statement> setPredTemp = pred.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.BACKWARD);
setPredTemp.remove(head);
if (!setPredTemp.isEmpty()) { // at most 1 predecessor
pred = setPredTemp.iterator().next();
if (pred == stat) {
return false; // loop found
}
}
else {
break;
}
}
}
// succs
List<StatEdge> lstEdges = stat.getSuccessorEdges(EdgeType.DIRECT_ALL);
if (lstEdges.size() > 1) {
Set<Statement> setSucc = stat.getNeighboursSet(EdgeType.DIRECT_ALL, EdgeDirection.FORWARD);
setSucc.retainAll(setDest);
if (!setSucc.isEmpty()) {
return false;
}
else {
if (post == null) {
post = stat;
repeat = true;
break;
}
else {
return false;
}
}
}
else if (lstEdges.size() == 1) {
StatEdge edge = lstEdges.get(0);
if (edge.getType() == EdgeType.REGULAR) {
Statement statd = edge.getDestination();
if (head == statd) {
return false;
}
if (post != statd && !setDest.contains(statd)) {
if (post != null) {
return false;
}
else {
Set<Statement> set = statd.getNeighboursSet(EdgeType.REGULAR, EdgeDirection.BACKWARD);
if (set.size() > 1) {
post = statd;
repeat = true;
break;
}
else {
return false;
}
}
}
}
}
lst.add(stat);
}
if (!repeat) {
break;
}
}
lst.add(head);
lst.remove(post);
lst.add(0, post);
return true;
}