scope tok_conditionals // returns number of changes static int tok_conditionals(LS tok, S keyword, S keywordEnd, IPred pred, bool reTokImmediately, bool noReTok) { int changes = 0; if (tok instanceof IContentsIndexedList) { int[] l = tok/IContentsIndexedList.indicesOf(keyword); for (int j = l(l)-1; j >= 0; j--) { int i = l[j]; if (isIdentifier(get(tok, i+2))) { processConditional(tok, i, keyword, keywordEnd, pred, reTokImmediately && !noReTok); ++changes; } } } else { if (!tok.contains(keyword)) ret changes; int i = l(tok); while ((i = rjfind(tok, 1, i-1, keyword + " ")) >= 0) { ++changes; processConditional(tok, i, keyword, keywordEnd, pred, reTokImmediately && !noReTok); } } if (changes != 0 && !reTokImmediately && !noReTok) reTok(tok); //print(keyword + ": " + nChanges(changes)); ret changes; } svoid #processConditional(LS tok, int i, S keyword, S keywordEnd, IPred pred, bool reTokImmediately) { int j = jfind(tok, i+4, keywordEnd); if (j < 0) j = l(tok)-1; S name = tok.get(i+2); bool has = pred.get(name); //print(keyword + " " + name + " => " + has); if (has) { clearTokens_maybeReTok(tok, j, j+1, reTokImmediately); clearTokens_maybeReTok(tok, i, i+3, reTokImmediately); } else clearTokens_maybeReTok(tok, i, j+1, reTokImmediately); // safer than before }