private Statement ParseSuite() {
if (!EatNoEof(TokenKind.Colon)) {
// improve error handling...
return ErrorStmt();
}
TokenWithSpan cur = _lookahead;
List<Statement> l = new List<Statement>();
// we only read a real NewLine here because we need to adjust error reporting
// for the interpreter.
if (MaybeEat(TokenKind.NewLine)) {
CheckSuiteEofError(cur);
// for error reporting we track the NL tokens and report the error on
// the last one. This matches CPython.
cur = _lookahead;
while (PeekToken(TokenKind.NLToken)) {
cur = _lookahead;
NextToken();
}
if (!MaybeEat(TokenKind.Indent)) {
// no indent? report the indentation error.
if (cur.Token.Kind == TokenKind.Dedent) {
ReportSyntaxError(_lookahead.Span.Start, _lookahead.Span.End, "expected an indented block", ErrorCodes.SyntaxError | ErrorCodes.IncompleteStatement);
} else {
ReportSyntaxError(cur, ErrorCodes.IndentationError);
}
return ErrorStmt();
}
while (true) {
Statement s = ParseStmt();
l.Add(s);
if (MaybeEat(TokenKind.Dedent)) break;
if (PeekToken().Kind == TokenKind.EndOfFile) {
ReportSyntaxError("unexpected end of file");
break; // error handling
}
}
Statement[] stmts = l.ToArray();
SuiteStatement ret = new SuiteStatement(stmts);
ret.SetLoc(_globalParent, stmts[0].StartIndex, stmts[stmts.Length - 1].EndIndex);
return ret;
} else {
// simple_stmt NEWLINE
// ParseSimpleStmt takes care of the NEWLINE
Statement s = ParseSimpleStmt();
return s;
}
}