[fine] Parse alternate types
This commit is contained in:
parent
f7acfd588d
commit
afa4812074
10 changed files with 73 additions and 26 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue