[fine] Parse alternate types

This commit is contained in:
John Doty 2024-02-01 07:56:30 -08:00
parent f7acfd588d
commit afa4812074
10 changed files with 73 additions and 26 deletions

View file

@ -120,6 +120,7 @@ impl<'a> std::ops::IndexMut<TreeRef> for SyntaxTree<'a> {
pub enum TreeKind {
Error,
AlternateType,
Argument,
ArgumentList,
BinaryExpression,
@ -150,6 +151,7 @@ pub enum TreeKind {
SelfParameter,
SelfReference,
TypeExpression,
TypeIdentifier,
TypeParameter,
TypeParameterList,
UnaryExpression,
@ -688,14 +690,27 @@ fn return_type(p: &mut CParser) {
fn type_expr(p: &mut CParser) {
let m = p.start();
// TODO: Other kinds of type expressions probably!
p.expect(TokenKind::Identifier, "expected the identifier of a type");
alternate_type(p);
p.end(m, TreeKind::TypeExpression);
}
fn alternate_type(p: &mut CParser) {
let mut result = type_identifier(p);
while p.eat(TokenKind::Or) {
let m = p.start_before(result);
type_identifier(p);
result = p.end(m, TreeKind::AlternateType);
}
}
fn type_identifier(p: &mut CParser) -> MarkClosed {
let m = p.start();
p.expect(TokenKind::Identifier, "expected the identifier of a type");
if p.at(TokenKind::Less) {
type_parameter_list(p);
}
p.end(m, TreeKind::TypeExpression);
p.end(m, TreeKind::TypeIdentifier)
}
fn type_parameter_list(p: &mut CParser) {
@ -1095,7 +1110,7 @@ fn object_constructor(p: &mut CParser) -> MarkClosed {
let m = p.start();
p.expect_start(TokenKind::New);
type_expr(p);
type_identifier(p);
if p.at(TokenKind::LeftBrace) {
field_list(p);
} else {