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 = getOrKeep(map, t2); if (t3 == t2) ret t; S t4 = gazelle_deepReplaceVars_impl(map, t2, _); if (t4 == t2) ret t; ret round ? roundBracket(t4) : curlyBracket(t4); })); }