diff options
author | Aleksey Kladov <[email protected]> | 2018-01-07 13:01:30 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-01-07 13:01:30 +0000 |
commit | b5034410c8e5aabf809d2665e38017ef79d05601 (patch) | |
tree | e38af66118447b1834acf6d25630c294ea622176 | |
parent | 7c6f0f9128665c1a605caaa552347b936578f952 (diff) |
G: function item
-rw-r--r-- | grammar.ron | 1 | ||||
-rw-r--r-- | src/parser/event_parser/grammar.rs | 17 | ||||
-rw-r--r-- | src/syntax_kinds.rs | 4 | ||||
-rw-r--r-- | tests/data/parser/ok/0005_fn_item.rs | 2 | ||||
-rw-r--r-- | tests/data/parser/ok/0005_fn_item.txt | 12 |
5 files changed, 32 insertions, 4 deletions
diff --git a/grammar.ron b/grammar.ron index 18af8d123..9beb7f7aa 100644 --- a/grammar.ron +++ b/grammar.ron | |||
@@ -64,5 +64,6 @@ Grammar( | |||
64 | "FILE", | 64 | "FILE", |
65 | "STRUCT_ITEM", | 65 | "STRUCT_ITEM", |
66 | "STRUCT_FIELD", | 66 | "STRUCT_FIELD", |
67 | "FN_ITEM", | ||
67 | ] | 68 | ] |
68 | ) \ No newline at end of file | 69 | ) \ No newline at end of file |
diff --git a/src/parser/event_parser/grammar.rs b/src/parser/event_parser/grammar.rs index f26cbc4f6..09b2f02b2 100644 --- a/src/parser/event_parser/grammar.rs +++ b/src/parser/event_parser/grammar.rs | |||
@@ -22,8 +22,12 @@ fn inner_attributes(_: &mut Parser) { | |||
22 | } | 22 | } |
23 | 23 | ||
24 | fn item_first(p: &Parser) -> bool { | 24 | fn item_first(p: &Parser) -> bool { |
25 | match p.current() { | 25 | let current = match p.current() { |
26 | Some(STRUCT_KW) => true, | 26 | Some(c) => c, |
27 | None => return false, | ||
28 | }; | ||
29 | match current { | ||
30 | STRUCT_KW | FN_KW => true, | ||
27 | _ => false, | 31 | _ => false, |
28 | } | 32 | } |
29 | } | 33 | } |
@@ -31,7 +35,8 @@ fn item_first(p: &Parser) -> bool { | |||
31 | fn item(p: &mut Parser) { | 35 | fn item(p: &mut Parser) { |
32 | outer_attributes(p); | 36 | outer_attributes(p); |
33 | visibility(p); | 37 | visibility(p); |
34 | node_if(p, STRUCT_KW, STRUCT_ITEM, struct_item); | 38 | node_if(p, STRUCT_KW, STRUCT_ITEM, struct_item) |
39 | || node_if(p, FN_KW, FN_ITEM, fn_item); | ||
35 | } | 40 | } |
36 | 41 | ||
37 | fn struct_item(p: &mut Parser) { | 42 | fn struct_item(p: &mut Parser) { |
@@ -45,6 +50,12 @@ fn struct_field(p: &mut Parser) -> bool { | |||
45 | }) | 50 | }) |
46 | } | 51 | } |
47 | 52 | ||
53 | fn fn_item(p: &mut Parser) { | ||
54 | p.expect(IDENT) && p.expect(L_PAREN) && p.expect(R_PAREN) | ||
55 | && p.curly_block(|p| ()); | ||
56 | } | ||
57 | |||
58 | |||
48 | // Paths, types, attributes, and stuff // | 59 | // Paths, types, attributes, and stuff // |
49 | 60 | ||
50 | fn outer_attributes(_: &mut Parser) { | 61 | fn outer_attributes(_: &mut Parser) { |
diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs index 4a27b0eae..6099cd6e0 100644 --- a/src/syntax_kinds.rs +++ b/src/syntax_kinds.rs | |||
@@ -61,8 +61,9 @@ pub const SHEBANG: SyntaxKind = SyntaxKind(56); | |||
61 | pub const FILE: SyntaxKind = SyntaxKind(57); | 61 | pub const FILE: SyntaxKind = SyntaxKind(57); |
62 | pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(58); | 62 | pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(58); |
63 | pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(59); | 63 | pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(59); |
64 | pub const FN_ITEM: SyntaxKind = SyntaxKind(60); | ||
64 | 65 | ||
65 | static INFOS: [SyntaxInfo; 60] = [ | 66 | static INFOS: [SyntaxInfo; 61] = [ |
66 | SyntaxInfo { name: "USE_KW" }, | 67 | SyntaxInfo { name: "USE_KW" }, |
67 | SyntaxInfo { name: "FN_KW" }, | 68 | SyntaxInfo { name: "FN_KW" }, |
68 | SyntaxInfo { name: "STRUCT_KW" }, | 69 | SyntaxInfo { name: "STRUCT_KW" }, |
@@ -123,6 +124,7 @@ static INFOS: [SyntaxInfo; 60] = [ | |||
123 | SyntaxInfo { name: "FILE" }, | 124 | SyntaxInfo { name: "FILE" }, |
124 | SyntaxInfo { name: "STRUCT_ITEM" }, | 125 | SyntaxInfo { name: "STRUCT_ITEM" }, |
125 | SyntaxInfo { name: "STRUCT_FIELD" }, | 126 | SyntaxInfo { name: "STRUCT_FIELD" }, |
127 | SyntaxInfo { name: "FN_ITEM" }, | ||
126 | ]; | 128 | ]; |
127 | 129 | ||
128 | pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo { | 130 | pub(crate) fn syntax_info(kind: SyntaxKind) -> &'static SyntaxInfo { |
diff --git a/tests/data/parser/ok/0005_fn_item.rs b/tests/data/parser/ok/0005_fn_item.rs new file mode 100644 index 000000000..03210551c --- /dev/null +++ b/tests/data/parser/ok/0005_fn_item.rs | |||
@@ -0,0 +1,2 @@ | |||
1 | fn foo() { | ||
2 | } | ||
diff --git a/tests/data/parser/ok/0005_fn_item.txt b/tests/data/parser/ok/0005_fn_item.txt new file mode 100644 index 000000000..e37129ff1 --- /dev/null +++ b/tests/data/parser/ok/0005_fn_item.txt | |||
@@ -0,0 +1,12 @@ | |||
1 | FILE@[0; 13) | ||
2 | FN_ITEM@[0; 13) | ||
3 | FN_KW@[0; 2) | ||
4 | WHITESPACE@[2; 3) | ||
5 | IDENT@[3; 6) | ||
6 | L_PAREN@[6; 7) | ||
7 | R_PAREN@[7; 8) | ||
8 | WHITESPACE@[8; 9) | ||
9 | L_CURLY@[9; 10) | ||
10 | WHITESPACE@[10; 11) | ||
11 | R_CURLY@[11; 12) | ||
12 | WHITESPACE@[12; 13) | ||