Statement (Statement from, Statement to, HashMap<Statement, Statement> mapAltToCopies) { if (to == null) { // first outer invocation to = from.getSimpleCopy(); mapAltToCopies.put(from, to); } // copy statements for (Statement st : from.getStats()) { Statement stcopy = st.getSimpleCopy(); to.getStats().addWithKey(stcopy, stcopy.id); mapAltToCopies.put(st, stcopy); } // copy edges for (int i = 0; i < from.getStats().size(); i++) { Statement stold = from.getStats().get(i); Statement stnew = to.getStats().get(i); for (StatEdge edgeold : stold.getSuccessorEdges(EdgeType.DIRECT_ALL)) { // type cannot be TYPE_EXCEPTION (checked in isIrreducibleTriangle) StatEdge edgenew = new StatEdge(edgeold.getType(), stnew, mapAltToCopies.containsKey(edgeold.getDestination()) ? mapAltToCopies.get(edgeold.getDestination()) : edgeold.getDestination(), mapAltToCopies.containsKey(edgeold.closure) ? mapAltToCopies.get(edgeold.closure) : edgeold.closure); stnew.addSuccessor(edgenew); } } // recurse statements for (int i = 0; i < from.getStats().size(); i++) { Statement stold = from.getStats().get(i); Statement stnew = to.getStats().get(i); copyStatement(stold, stnew, mapAltToCopies); } return to; }