private FunctionDefinition ParseFuncDef() {
Eat(TokenKind.KeywordDef);
var start = GetStart();
string name = ReadName();
Eat(TokenKind.LeftParenthesis);
var lStart = GetStart();
var lEnd = GetEnd();
int grouping = _tokenizer.GroupingLevel;
Parameter[] parameters = ParseVarArgsList(TokenKind.RightParenthesis);
FunctionDefinition ret;
if (parameters == null) {
// error in parameters
ret = new FunctionDefinition(name, new Parameter[0]);
ret.SetLoc(_globalParent, start, lEnd);
return ret;
}
var rStart = GetStart();
var rEnd = GetEnd();
ret = new FunctionDefinition(name, parameters);
PushFunction(ret);
Statement body = ParseClassOrFuncBody();
FunctionDefinition ret2 = PopFunction();
System.Diagnostics.Debug.Assert(ret == ret2);
ret.Body = body;
ret.HeaderIndex = rEnd;
if (_sink != null) {
_sink.MatchPair(
new SourceSpan(_tokenizer.IndexToLocation(lStart), _tokenizer.IndexToLocation(lEnd)),
new SourceSpan(_tokenizer.IndexToLocation(rStart), _tokenizer.IndexToLocation(rEnd)),
grouping
);
}
ret.SetLoc(_globalParent, start, body.EndIndex);
return ret;
}