/* swap method o.add(a, b) to { ret super + " (added)"; } or: swap method o.add(a, b) { ret super + " (added)"; } => var add_old = cc.add; o.add = (a, b) -> { ret o.add_fallback(add_old, a, b) + " (added)"; }; */ svoid tok_swapFunctions(LS tok) { int i; while ((i = jfind(tok, "swap method .(")) >= 0) { S obj = tok.get(i+4); S methodName = tok.get(i+8); int iOpening = i+10; int iClosing = indexOf(tok, i, ")"); S args = joinSubList(tok, iOpening+2, iClosing-1); int iOpeningCurly = iClosing+2; if (eqGet(tok, iOpeningCurly, "to")) iOpeningCurly += 2; assertEquals(get(tok, iOpeningCurly), "{"); int iClosingCurly = tok_findEndOfBlock(tok, iOpeningCurly)-1; S add_old = makeVar(); LS tokBody = cloneList(cncSubList(tok, iOpeningCurly+1, iClosingCurly)); bool needsSuper = jreplace_dyn(tokBody, "super", (_tok, nIdx) -> !eqGet(_tok, nIdx+3, "."), -> "\*obj*/.\*methodName*/_fallback(\*add_old*/, \*args*/)"); S assignment = "\*obj*/.\*methodName*/ = (\*args*/) -> { " + join(tokBody) + "};"; S src = needsSuper ? "{ var \*add_old*/ = \*obj*/.\*methodName*/; \n" + assignment + "\n}" : assignment; replaceTokens_reTok(tok, i, iClosingCurly+1, src); } }