Skip to content

Commit

Permalink
feat(parser): add impl statement.
Browse files Browse the repository at this point in the history
  • Loading branch information
rzvxa committed Mar 9, 2024
1 parent 6614827 commit d6397c4
Show file tree
Hide file tree
Showing 12 changed files with 795 additions and 5 deletions.
2 changes: 1 addition & 1 deletion crates/fuse-ast/src/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -423,7 +423,7 @@ pub enum ConstructionField {
pub struct ImplStatement {
pub span: Span,
pub target: TypeAnnotation,
pub r#trait: Option<()>,
pub r#trait: Option<TypeAnnotation>,
pub methods: Vec<ImplMethod>,
}

Expand Down
10 changes: 9 additions & 1 deletion crates/fuse-parser/src/parsers/binding.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,15 @@ impl<'a> Parser<'a> {
}

let identifier = self.parse_binding_identifier();
Ok(self.ast.binding_identifier_pattern(identifier, None, false))
let type_annotation = if self.consume_if(TokenKind::Colon).is_some() {
Some(self.parse_type_annotation()?)
} else {
None
};

Ok(self
.ast
.binding_identifier_pattern(identifier, type_annotation, false))
}

pub(crate) fn parse_binding_identifier(&mut self) -> BindingIdentifier {
Expand Down
12 changes: 9 additions & 3 deletions crates/fuse-parser/src/parsers/statements.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,18 @@ impl<'a> Parser<'a> {
}

fn parse_impl_statement(&mut self) -> ParserResult<Statement> {
debug_assert!(self.at(TokenKind::Trait));
debug_assert!(self.at(TokenKind::Impl));
let start = self.start_span();
// Consume the struct keyword.
self.consume();

let target = self.parse_type_annotation()?;
let (target, r#trait) = {
let first_type = self.parse_type_annotation()?;
match self.consume_if(TokenKind::For) {
Some(_) => (self.parse_type_annotation()?, Some(first_type)),
None => (first_type, None),
}
};
let mut methods: Vec<ImplMethod> = Vec::new();
while !self.at(TokenKind::End) {
let modifier = self.try_parse_visibility_modifier();
Expand All @@ -108,7 +114,7 @@ impl<'a> Parser<'a> {
Ok(self.ast.impl_statement(ImplStatement {
span: self.end_span(start),
target,
r#trait: None,
r#trait,
methods,
}))
}
Expand Down
33 changes: 33 additions & 0 deletions crates/fuse-parser/tests/cases/pass/impl-statement-01/ast.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
---
source: crates/fuse-parser/tests/cases/mod.rs
description: "impl Test\nend\n"
expression: parsed.chunk
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
---
Some(Chunk(
span: Span(
start: 0,
end: 14,
),
body: Block(
statements: [
ImplStatement(ImplStatement(
span: Span(
start: 0,
end: 13,
),
target: TypeAnnotation(
identifier: Identifier(
span: Span(
start: 5,
end: 9,
),
name: Atom("Test"),
),
),
trait: None,
methods: [],
)),
],
),
))
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
impl Test
end
65 changes: 65 additions & 0 deletions crates/fuse-parser/tests/cases/pass/impl-statement-01/tokens.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
source: crates/fuse-parser/tests/cases/mod.rs
description: "impl Test\nend\n"
expression: tokens
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
---
[
TokenReference(
token: Token(
span: Span(
start: 0,
end: 4,
),
kind: Impl,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 4,
end: 5,
),
kind: Whitespace,
),
],
),
TokenReference(
token: Token(
span: Span(
start: 5,
end: 9,
),
kind: Identifier,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 9,
end: 10,
),
kind: Whitespace,
),
],
),
TokenReference(
token: Token(
span: Span(
start: 10,
end: 13,
),
kind: End,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 13,
end: 14,
),
kind: Whitespace,
),
],
),
]
41 changes: 41 additions & 0 deletions crates/fuse-parser/tests/cases/pass/impl-statement-02/ast.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
---
source: crates/fuse-parser/tests/cases/mod.rs
description: "impl Trait for Test\nend\n"
expression: parsed.chunk
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-02/case.fuse
---
Some(Chunk(
span: Span(
start: 0,
end: 24,
),
body: Block(
statements: [
ImplStatement(ImplStatement(
span: Span(
start: 0,
end: 23,
),
target: TypeAnnotation(
identifier: Identifier(
span: Span(
start: 15,
end: 19,
),
name: Atom("Test"),
),
),
trait: Some(TypeAnnotation(
identifier: Identifier(
span: Span(
start: 5,
end: 10,
),
name: Atom("Trait"),
),
)),
methods: [],
)),
],
),
))
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
impl Trait for Test
end
103 changes: 103 additions & 0 deletions crates/fuse-parser/tests/cases/pass/impl-statement-02/tokens.snap
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
---
source: crates/fuse-parser/tests/cases/mod.rs
description: "impl Trait for Test\nend\n"
expression: tokens
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-02/case.fuse
---
[
TokenReference(
token: Token(
span: Span(
start: 0,
end: 4,
),
kind: Impl,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 4,
end: 5,
),
kind: Whitespace,
),
],
),
TokenReference(
token: Token(
span: Span(
start: 5,
end: 10,
),
kind: Identifier,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 10,
end: 11,
),
kind: Whitespace,
),
],
),
TokenReference(
token: Token(
span: Span(
start: 11,
end: 14,
),
kind: For,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 14,
end: 15,
),
kind: Whitespace,
),
],
),
TokenReference(
token: Token(
span: Span(
start: 15,
end: 19,
),
kind: Identifier,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 19,
end: 20,
),
kind: Whitespace,
),
],
),
TokenReference(
token: Token(
span: Span(
start: 20,
end: 23,
),
kind: End,
),
leading_trivia: [],
trailing_trivia: [
Token(
span: Span(
start: 23,
end: 24,
),
kind: Whitespace,
),
],
),
]
Loading

0 comments on commit d6397c4

Please sign in to comment.