private bool ReadFunctionBody(StringReader p, bool reqName, out FunctionCode func) { var saved = p.Position; if (p.ThisWord("function")) { var jsfn = new FunctionCode(); // esse Reader pode ser chamado para declaracao de funcoes ou para expressoes de funcoes anonimas // reqName diferencia esses dois usos, um tem nome o outro nao // ex.: function X(){} ou function(){} if (reqName) Expect(p, ReadIdent(p, out jsfn.Name), "func name"); ReqText(p, "("); var plist = new List<string>(); string pn; while (ReadIdent(p, out pn)) { plist.Add(pn); if (!p.ThisText(",")) break; } jsfn.Params = plist.Count > 0 ? plist.ToArray() : null; ReqText(p, ")"); ReqText(p, "{"); ReadCodes(p, ref jsfn.Code); ReqText(p, "}"); func = jsfn; return true; } func = null; return false; }
private bool ReadClosure(StringReader p, out FunctionCode func) { var saved = p.Position; var plist = new List<string>(); string pn; if (p.ThisText("(")) { while (ReadIdent(p, out pn)) { plist.Add(pn); if (!p.ThisText(",")) break; } if (!p.ThisText(")")) goto Mistaken; } else if (ReadIdent(p, out pn)) plist.Add(pn); if (p.ThisText(":")) { var jsfn = new FunctionCode(); jsfn.Params = plist.Count > 0 ? plist.ToArray() : null; if (p.ThisText("{")) { ReadCodes(p, ref jsfn.Code); ReqText(p, "}"); } else { ExprPiece arg; ReqVal(p, out arg); AddCode(ref jsfn.Code, new ReturnCode { Arg = arg }); } func = jsfn; return true; } Mistaken: p.Position = saved; func = null; return false; }