sS gazelle_deepReplaceVars(SS map, S s, O... _) { SS map2 = mapValues roundIfMultipleTokensUnlessCurlyBracketed(map); ret gazelle_deepReplaceVars_impl(map2, s, _); } sS gazelle_deepReplaceVars_impl(SS map, S s, O... _) { LS tok = javaTokWithBrackets(s); ret join(mapCodeTokens(tok, t -> { //bool round = tok_isRoundBracketed(t); //bool curly = tok_isCurlyBracketed(t); S t2 = tok_deRoundOrCurlyBracket(t); S t3 = map.get(t2); ifdef gazelle_deepReplaceVars_debug print("sub lookup: " + quote(t2) + " => " + quote(t3)); endifdef if (t3 != null) ret t3; if (l(tok) == 3) ret t; S t4 = gazelle_deepReplaceVars_impl(map, t2, _); if (eq(t4, t2)) ret t; //ret round ? roundBracket(t4) : curlyBracket(t4); ret roundBracketOptIfMoreThanOneToken(t4); })); }