static void tok_simplyCachedFunctions(L tok) { pcall { int i = -1; while ((i = jfind(tok, i+1, "simplyCached ")) >= 0) { Cl modifiers = tok_modifiersLeftOf(tok, i); int iMod = tok_leftScanModifiers(tok, i); int bracket = indexOf(tok, "(", i); S fName; try { fName = assertIdentifier(tok.get(bracket-2)); } on fail { printTokenContext(tok, iMod, bracket-2); } int iMod2 = tok_rightScanModifiers(tok, i+2); modifiers.addAll(codeTokensFromSubList(tok, i+2, iMod2)); S type = joinSubList(tok, iMod2, bracket-3); S boxedType = tok_toNonPrimitiveTypes(type); S fieldMods = joinWithSpace(listMinus(modifiers, "final", "abstract")); S functionMods = joinWithSpace(listMinus(modifiers, "transient", "abstract")); S loadFunctionMods = joinWithSpace(listMinus(modifiers, "transient")); bool isVoid = eq(type, "void"); S var = isVoid ? "ran_" + fName : fName + "_cache"; S implFunc = isVoid ? fName + "_impl" : fName + "_load"; S varType = isVoid ? "bool" : boxedType; S replacement = // variable declaration "\*fieldMods*/ \*varType*/ \*var*/;\n" + "\*functionMods*/ \*type*/ \*fName*/() { " // function body + (isVoid ? "if (\*var*/) ret; set \*var*/; \*implFunc*/();" : "if (\*var*/ == null) \*var*/ = \*fName*/_load(); ret \*var*/;") + "}\n\n" // beginning of impl function + "\*loadFunctionMods*/ \*type*/ \*implFunc*/"; replaceTokens_reTok(tok, iMod, bracket-1, replacement); } }}