private TotemAst ParseFileWorker(bool makeModule, bool returnValue) { _globalParent = new TotemAst(makeModule, false, _context); StartParsing(); List<Statement> l = new List<Statement>(); while (true) { if (MaybeEat(TokenKind.EndOfFile)) break; Statement s = ParseStatement(); l.Add(s); } Statement[] stmts = l.ToArray(); if (returnValue && stmts.Length > 0) { ExpressionStatement exprStmt = stmts[stmts.Length - 1] as ExpressionStatement; if (exprStmt != null) { var retStmt = new ReturnStatement(exprStmt.Expression); stmts[stmts.Length - 1] = retStmt; retStmt.SetLoc(_globalParent, exprStmt.Expression.IndexSpan); } } SuiteStatement ret = new SuiteStatement(stmts); ret.SetLoc(_globalParent, 0, GetEnd()); return FinishParsing(ret); }
public TotemAst ParseTopExpression() { try { _globalParent = new TotemAst(false, false, _context); StartParsing(); ReturnStatement ret = new ReturnStatement(ParseExpression()); ret.SetLoc(_globalParent, 0, 0); return FinishParsing(ret); } catch (BadSourceException bse) { throw; } }
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 Statement ParseReturnStatement() { Eat(TokenKind.KeywordReturn); var start = GetStart(); ReturnStatement stmt; if (CurrentFunction == null) { ReportSyntaxError(Resources.MisplacedReturn); return null; } _return = true; if (_isGenerator) { ReportSyntaxError(Resources.ReturnInGenerator); return null; } if (!MaybeEat(TokenKind.Semicolon)) { var expr = ParseExpression(); stmt = new ReturnStatement(expr); Eat(TokenKind.Semicolon); } else { stmt = new ReturnStatement(null); } stmt.SetLoc(_globalParent, start, GetEnd()); return stmt; }
public override bool Walk(ReturnStatement node) { node.Parent = _currentScope; FunctionDefinition funcDef = _currentScope as FunctionDefinition; if (funcDef != null) { funcDef._hasReturn = true; } return base.Walk(node); }