Support for returned var and return var. (#3374)

Implement toolchain support for `returned var` and `return var`.

- Modeled `returned` in the parse tree as a `ReturnedSpecifier`
appearing after the `VariableIntroducer`.
- Modeled `return var` in the parse tree as a `ReturnVarSpecifier`
appearing after the `ReturnStatementStart`.
- Factored out the implementation of `return` statement and `returned
var` handling in check into a new `return.{h,cpp}`. The parse nodes
themselves are still handled in `handle_*.cpp`. This allows easy code
reuse between `return` and `returned var`.
This commit is contained in:
Richard Smith
2023-11-10 19:52:30 +00:00
committed by GitHub
parent 5020fdb3be
commit afd6d85610
34 changed files with 1077 additions and 146 deletions
+13 -2
View File
@@ -38,8 +38,12 @@ auto HandleStatement(Context& context) -> void {
context.PushState(State::StatementReturn);
break;
}
case Lex::TokenKind::Returned: {
context.PushState(State::VarAsReturned);
break;
}
case Lex::TokenKind::Var: {
context.PushState(State::VarAsSemicolon);
context.PushState(State::VarAsDecl);
break;
}
case Lex::TokenKind::While: {
@@ -179,8 +183,15 @@ auto HandleStatementReturn(Context& context) -> void {
context.PushState(state);
context.AddLeafNode(NodeKind::ReturnStatementStart, context.Consume());
if (!context.PositionIs(Lex::TokenKind::Semi)) {
if (auto var_token = context.ConsumeIf(Lex::TokenKind::Var)) {
// `return var;`
context.AddLeafNode(NodeKind::ReturnVarSpecifier, *var_token);
} else if (!context.PositionIs(Lex::TokenKind::Semi)) {
// `return <expression>;`
context.PushState(State::Expr);
} else {
// `return;`
}
}