Skip to content

Commit 9ae541d

Browse files
committed
feat(parser): update impl blocks with new syntax.
1 parent 8c11c89 commit 9ae541d

File tree

15 files changed

+649
-576
lines changed

15 files changed

+649
-576
lines changed

crates/fuse-ast/src/ast.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ pub enum ConstructionField {
423423
pub struct ImplStatement {
424424
pub span: Span,
425425
pub target: TypeAnnotation,
426-
pub r#trait: Option<TypeAnnotation>,
426+
pub r#trait: TypeAnnotation,
427427
pub methods: Vec<ImplMethod>,
428428
}
429429

crates/fuse-parser/src/parsers/statements.rs

+4-7
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,10 @@ impl<'a> Parser<'a> {
9696
// Consume the struct keyword.
9797
self.consume();
9898

99-
let (target, r#trait) = {
100-
let first_type = self.parse_type_annotation()?;
101-
match self.consume_if(TokenKind::For) {
102-
Some(_) => (self.parse_type_annotation()?, Some(first_type)),
103-
None => (first_type, None),
104-
}
105-
};
99+
let r#trait = self.parse_type_annotation()?;
100+
self.consume_expect(TokenKind::For)?;
101+
let target = self.parse_type_annotation()?;
102+
106103
let mut methods: Vec<ImplMethod> = Vec::new();
107104
while !self.at(TokenKind::End) {
108105
let modifier = self.try_parse_visibility_modifier();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
---
2+
source: crates/fuse-parser/tests/cases/mod.rs
3+
description: "impl Test\nend\n"
4+
expression: parsed.chunk
5+
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
6+
---
7+
Some(Chunk(
8+
span: Span(
9+
start: 0,
10+
end: 14,
11+
),
12+
body: Block(
13+
statements: [
14+
ImplStatement(ImplStatement(
15+
span: Span(
16+
start: 0,
17+
end: 13,
18+
),
19+
target: TypeAnnotation(
20+
identifier: Identifier(
21+
span: Span(
22+
start: 5,
23+
end: 9,
24+
),
25+
name: Atom("Test"),
26+
),
27+
),
28+
trait: None,
29+
methods: [],
30+
)),
31+
],
32+
),
33+
))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
impl Test
2+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
source: crates/fuse-parser/tests/cases/mod.rs
3+
description: "impl Test\nend\n"
4+
expression: parsed.errors
5+
input_file: crates/fuse-parser/tests/cases/panic/impl-statement-01/case.fuse
6+
---
7+
[
8+
UnexpectedTokenKindError(
9+
token: TokenReference(
10+
token: Token(
11+
span: Span(
12+
start: 10,
13+
end: 13,
14+
),
15+
kind: End,
16+
),
17+
leading_trivia: [],
18+
trailing_trivia: [
19+
Token(
20+
span: Span(
21+
start: 13,
22+
end: 14,
23+
),
24+
kind: Whitespace,
25+
),
26+
],
27+
),
28+
expected: For,
29+
),
30+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
---
2+
source: crates/fuse-parser/tests/cases/mod.rs
3+
description: "impl Test\nend\n"
4+
expression: tokens
5+
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
6+
---
7+
[
8+
TokenReference(
9+
token: Token(
10+
span: Span(
11+
start: 0,
12+
end: 4,
13+
),
14+
kind: Impl,
15+
),
16+
leading_trivia: [],
17+
trailing_trivia: [
18+
Token(
19+
span: Span(
20+
start: 4,
21+
end: 5,
22+
),
23+
kind: Whitespace,
24+
),
25+
],
26+
),
27+
TokenReference(
28+
token: Token(
29+
span: Span(
30+
start: 5,
31+
end: 9,
32+
),
33+
kind: Identifier,
34+
),
35+
leading_trivia: [],
36+
trailing_trivia: [
37+
Token(
38+
span: Span(
39+
start: 9,
40+
end: 10,
41+
),
42+
kind: Whitespace,
43+
),
44+
],
45+
),
46+
TokenReference(
47+
token: Token(
48+
span: Span(
49+
start: 10,
50+
end: 13,
51+
),
52+
kind: End,
53+
),
54+
leading_trivia: [],
55+
trailing_trivia: [
56+
Token(
57+
span: Span(
58+
start: 13,
59+
end: 14,
60+
),
61+
kind: Whitespace,
62+
),
63+
],
64+
),
65+
]

crates/fuse-parser/tests/cases/pass/impl-statement-01/ast.snap

+14-6
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,39 @@
11
---
22
source: crates/fuse-parser/tests/cases/mod.rs
3-
description: "impl Test\nend\n"
3+
description: "impl Trait for Test\nend\n"
44
expression: parsed.chunk
55
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
66
---
77
Some(Chunk(
88
span: Span(
99
start: 0,
10-
end: 14,
10+
end: 24,
1111
),
1212
body: Block(
1313
statements: [
1414
ImplStatement(ImplStatement(
1515
span: Span(
1616
start: 0,
17-
end: 13,
17+
end: 23,
1818
),
1919
target: TypeAnnotation(
2020
identifier: Identifier(
2121
span: Span(
22-
start: 5,
23-
end: 9,
22+
start: 15,
23+
end: 19,
2424
),
2525
name: Atom("Test"),
2626
),
2727
),
28-
trait: None,
28+
trait: TypeAnnotation(
29+
identifier: Identifier(
30+
span: Span(
31+
start: 5,
32+
end: 10,
33+
),
34+
name: Atom("Trait"),
35+
),
36+
),
2937
methods: [],
3038
)),
3139
],
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
impl Test
1+
impl Trait for Test
22
end

crates/fuse-parser/tests/cases/pass/impl-statement-01/tokens.snap

+47-9
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
---
22
source: crates/fuse-parser/tests/cases/mod.rs
3-
description: "impl Test\nend\n"
3+
description: "impl Trait for Test\nend\n"
44
expression: tokens
5-
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
5+
input_file: crates/fuse-parser/tests/cases/pass/impl-statement-02/case.fuse
66
---
77
[
88
TokenReference(
@@ -28,16 +28,16 @@ input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
2828
token: Token(
2929
span: Span(
3030
start: 5,
31-
end: 9,
31+
end: 10,
3232
),
3333
kind: Identifier,
3434
),
3535
leading_trivia: [],
3636
trailing_trivia: [
3737
Token(
3838
span: Span(
39-
start: 9,
40-
end: 10,
39+
start: 10,
40+
end: 11,
4141
),
4242
kind: Whitespace,
4343
),
@@ -46,17 +46,55 @@ input_file: crates/fuse-parser/tests/cases/pass/impl-statement-01/case.fuse
4646
TokenReference(
4747
token: Token(
4848
span: Span(
49-
start: 10,
50-
end: 13,
49+
start: 11,
50+
end: 14,
51+
),
52+
kind: For,
53+
),
54+
leading_trivia: [],
55+
trailing_trivia: [
56+
Token(
57+
span: Span(
58+
start: 14,
59+
end: 15,
60+
),
61+
kind: Whitespace,
62+
),
63+
],
64+
),
65+
TokenReference(
66+
token: Token(
67+
span: Span(
68+
start: 15,
69+
end: 19,
70+
),
71+
kind: Identifier,
72+
),
73+
leading_trivia: [],
74+
trailing_trivia: [
75+
Token(
76+
span: Span(
77+
start: 19,
78+
end: 20,
79+
),
80+
kind: Whitespace,
81+
),
82+
],
83+
),
84+
TokenReference(
85+
token: Token(
86+
span: Span(
87+
start: 20,
88+
end: 23,
5189
),
5290
kind: End,
5391
),
5492
leading_trivia: [],
5593
trailing_trivia: [
5694
Token(
5795
span: Span(
58-
start: 13,
59-
end: 14,
96+
start: 23,
97+
end: 24,
6098
),
6199
kind: Whitespace,
62100
),

0 commit comments

Comments
 (0)