private LambdaExpression ParseLambdaBody(int startPosition, params Parameter[] parameters) { Expression exp; LambdaExpression ret; Statement st; if (PeekToken(TokenKind.LeftBrace)) { var inFinally = _inFinally; var inLoop = _inLoop; var return_ = _return; var isGenerator = _isGenerator; var isAsync = _isAsync; _inLoop = false; _inFinally = false; _return = false; _isGenerator = false; _isAsync = false; FunctionDefinition fnDef = new FunctionDefinition(null, parameters); PushFunction(fnDef); st = ParseBlock(); FunctionDefinition fnDef2 = PopFunction(); Debug.Assert(fnDef == fnDef2); fnDef.Body = st; ret = new LambdaExpression(fnDef); _inLoop = inLoop; _inFinally = inFinally; _return = return_; _isGenerator = isGenerator; _isAsync = isAsync; } else { exp = ParseExpression(); st = new ReturnStatement(exp); st.SetLoc(_globalParent, exp.IndexSpan); ret = new LambdaExpression(parameters, st); } ret.SetLoc(_globalParent, startPosition, GetEnd()); return ret; }
private void PushFunction(FunctionDefinition function) { if (_functions == null) { _functions = new Stack<FunctionDefinition>(); } _functions.Push(function); }
private Statement ParseFunctionStatement() { Eat(TokenKind.KeywordFunction); var start = GetStart(); var globalStart = start; var name = (NameToken)NextToken(TokenKind.Name); List<Parameter> parameters = new List<Parameter>(); Eat(TokenKind.LeftParenthesis); int lStart = GetStart(), lEnd = GetEnd(); int grouping = _tokenizer.GroupingLevel; if (!MaybeEat(TokenKind.RightParenthesis)) { do { NameToken nt = (NameToken)NextToken(TokenKind.Name); start = GetStart(); Expression defaultVal = MaybeEat(TokenKind.Assign) ? ParseExpression() : null; var param = new Parameter(nt.Name, defaultVal); param.SetLoc(_globalParent, start, GetEnd()); parameters.Add(param); } while (MaybeEat(TokenKind.Comma)); Eat(TokenKind.RightParenthesis); } int rStart = GetStart(), rEnd = GetEnd(); var inFinally = _inFinally; var inLoop = _inLoop; var return_ = _return; var isGenerator = _isGenerator; var isAsync = _isAsync; _inLoop = false; _inFinally = false; _return = false; _isGenerator = false; var ret = new FunctionDefinition(name.Name, parameters.ToArray()); PushFunction(ret); var body = ParseBlock(); FunctionDefinition ret2 = PopFunction(); Debug.Assert(ret == ret2); _inLoop = inLoop; _inFinally = inFinally; _return = return_; _isGenerator = isGenerator; _isAsync = isAsync; ret.Body = body; 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, globalStart, GetEnd()); return ret; }
public override bool Walk(FunctionDefinition node) { if (!node.IsLambda) node.TotemVariable = DefineName(node.Name); //node.ArgumentsVariable = DefineName("arguments"); // process the default arg values in the outer context foreach (Parameter p in node.Parameters) if (p.DefaultValue != null) p.DefaultValue.Walk(this); PushScope(node); foreach (Parameter p in node.Parameters) p.Walk(_parameter); node.Body.Walk(this); return false; }
public override void PostWalk(FunctionDefinition node) { Debug.Assert(_currentScope == node); PopScope(); }
internal LambdaExpression(FunctionDefinition function) { _function = function; }
public LambdaExpression(Parameter[] parameters, Statement body) { _function = new FunctionDefinition(null, parameters, body); }