void (DoStatement stat) { Exprent lastDoExprent, initDoExprent; Statement lastData, preData = null; // get last exprent lastData = getLastDirectData(stat.getFirst()); if (lastData == null || lastData.getExprents().isEmpty()) { return; } List<Exprent> lstExpr = lastData.getExprents(); lastDoExprent = lstExpr.get(lstExpr.size() - 1); boolean issingle = false; if (lstExpr.size() == 1) { // single exprent if (lastData.getAllPredecessorEdges().size() > 1) { // break edges issingle = true; } } boolean haslast = issingle || lastDoExprent.type == Exprent.EXPRENT_ASSIGNMENT || lastDoExprent.type == Exprent.EXPRENT_FUNCTION; if (!haslast) { return; } boolean hasinit = false; // search for an initializing exprent Statement current = stat; while (true) { Statement parent = current.getParent(); if (parent == null) { break; } if (parent.type == StatementType.SEQUENCE) { if (current == parent.getFirst()) { current = parent; } else { preData = current.getNeighbours(EdgeType.REGULAR, EdgeDirection.BACKWARD).get(0); preData = getLastDirectData(preData); if (preData != null && !preData.getExprents().isEmpty()) { initDoExprent = preData.getExprents().get(preData.getExprents().size() - 1); if (initDoExprent.type == Exprent.EXPRENT_ASSIGNMENT) { hasinit = true; } } break; } } else { break; } } if (hasinit || issingle) { // FIXME: issingle sufficient? Set<Statement> set = stat.getNeighboursSet(EdgeType.CONTINUE, EdgeDirection.BACKWARD); set.remove(lastData); if (!set.isEmpty()) { return; } stat.setLoopType(LoopType.FOR); if (hasinit) { stat.setInitExprent(preData.getExprents().remove(preData.getExprents().size() - 1)); } stat.setIncExprent(lastData.getExprents().remove(lastData.getExprents().size() - 1)); } if (lastData.getExprents().isEmpty()) { List<StatEdge> lst = lastData.getAllSuccessorEdges(); if (!lst.isEmpty()) { lastData.removeSuccessor(lst.get(0)); } removeLastEmptyStatement(stat, lastData); } }