aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grammar.ron2
-rw-r--r--src/parser/event_parser/grammar/items.rs21
-rw-r--r--src/parser/event_parser/grammar/mod.rs3
-rw-r--r--src/syntax_kinds.rs127
-rw-r--r--tests/data/lexer/0011_keywords.rs2
-rw-r--r--tests/data/lexer/0011_keywords.txt2
-rw-r--r--tests/data/parser/ok/0008_mod_item.rs17
-rw-r--r--tests/data/parser/ok/0008_mod_item.txt75
8 files changed, 180 insertions, 69 deletions
diff --git a/grammar.ron b/grammar.ron
index c475826e4..8871a1996 100644
--- a/grammar.ron
+++ b/grammar.ron
@@ -11,6 +11,7 @@ Grammar(
11 "as", 11 "as",
12 "extern", 12 "extern",
13 "crate", 13 "crate",
14 "mod",
14 ], 15 ],
15 tokens: [ 16 tokens: [
16 "ERROR", 17 "ERROR",
@@ -73,6 +74,7 @@ Grammar(
73 "EXTERN_CRATE_ITEM", 74 "EXTERN_CRATE_ITEM",
74 "ATTR", 75 "ATTR",
75 "META_ITEM", 76 "META_ITEM",
77 "MOD_ITEM",
76 "LITERAL", 78 "LITERAL",
77 "ALIAS", 79 "ALIAS",
78 ] 80 ]
diff --git a/src/parser/event_parser/grammar/items.rs b/src/parser/event_parser/grammar/items.rs
index 9b174679c..e775db14b 100644
--- a/src/parser/event_parser/grammar/items.rs
+++ b/src/parser/event_parser/grammar/items.rs
@@ -1,9 +1,10 @@
1use super::*; 1use super::*;
2 2
3pub(super) fn mod_items(p: &mut Parser) { 3pub(super) fn mod_contents(p: &mut Parser) {
4 attributes::inner_attributes(p);
4 many(p, |p| { 5 many(p, |p| {
5 skip_to_first( 6 skip_to_first(
6 p, item_first, mod_item, 7 p, item_first, mod_contents_item,
7 "expected item", 8 "expected item",
8 ) 9 )
9 }); 10 });
@@ -11,12 +12,12 @@ pub(super) fn mod_items(p: &mut Parser) {
11 12
12fn item_first(p: &Parser) -> bool { 13fn item_first(p: &Parser) -> bool {
13 match p.current() { 14 match p.current() {
14 STRUCT_KW | FN_KW | EXTERN_KW => true, 15 STRUCT_KW | FN_KW | EXTERN_KW | MOD_KW => true,
15 _ => false, 16 _ => false,
16 } 17 }
17} 18}
18 19
19fn mod_item(p: &mut Parser) { 20fn mod_contents_item(p: &mut Parser) {
20 if item(p) { 21 if item(p) {
21 if p.current() == SEMI { 22 if p.current() == SEMI {
22 node(p, ERROR, |p| { 23 node(p, ERROR, |p| {
@@ -39,9 +40,9 @@ fn item(p: &mut Parser) -> bool {
39 // || node_if(p, CONST_KW, CONST_ITEM, const_item) or const FN! 40 // || node_if(p, CONST_KW, CONST_ITEM, const_item) or const FN!
40 // || unsafe trait, impl 41 // || unsafe trait, impl
41 // || node_if(p, FN_KW, FN_ITEM, fn_item) 42 // || node_if(p, FN_KW, FN_ITEM, fn_item)
42 // || node_if(p, MOD_KW, MOD_ITEM, mod_item)
43 // || node_if(p, TYPE_KW, TYPE_ITEM, type_item) 43 // || node_if(p, TYPE_KW, TYPE_ITEM, type_item)
44 node_if(p, [EXTERN_KW, CRATE_KW], EXTERN_CRATE_ITEM, extern_crate_item) 44 node_if(p, [EXTERN_KW, CRATE_KW], EXTERN_CRATE_ITEM, extern_crate_item)
45 || node_if(p, MOD_KW, MOD_ITEM, mod_item)
45 || node_if(p, STRUCT_KW, STRUCT_ITEM, struct_item) 46 || node_if(p, STRUCT_KW, STRUCT_ITEM, struct_item)
46 || node_if(p, FN_KW, FN_ITEM, fn_item) 47 || node_if(p, FN_KW, FN_ITEM, fn_item)
47} 48}
@@ -55,6 +56,16 @@ fn extern_crate_item(p: &mut Parser) {
55 p.expect(IDENT) && alias(p) && p.expect(SEMI); 56 p.expect(IDENT) && alias(p) && p.expect(SEMI);
56} 57}
57 58
59fn mod_item(p: &mut Parser) {
60 if !p.expect(IDENT) {
61 return;
62 }
63 if p.eat(SEMI) {
64 return;
65 }
66 p.curly_block(mod_contents);
67}
68
58fn struct_field(p: &mut Parser) -> bool { 69fn struct_field(p: &mut Parser) -> bool {
59 node_if(p, IDENT, STRUCT_FIELD, |p| { 70 node_if(p, IDENT, STRUCT_FIELD, |p| {
60 p.expect(COLON) && p.expect(IDENT); 71 p.expect(COLON) && p.expect(IDENT);
diff --git a/src/parser/event_parser/grammar/mod.rs b/src/parser/event_parser/grammar/mod.rs
index dd1270eae..6d1cd7ec3 100644
--- a/src/parser/event_parser/grammar/mod.rs
+++ b/src/parser/event_parser/grammar/mod.rs
@@ -10,8 +10,7 @@ mod expressions;
10pub(crate) fn file(p: &mut Parser) { 10pub(crate) fn file(p: &mut Parser) {
11 node(p, FILE, |p| { 11 node(p, FILE, |p| {
12 p.optional(SHEBANG); 12 p.optional(SHEBANG);
13 attributes::inner_attributes(p); 13 items::mod_contents(p);
14 items::mod_items(p);
15 }) 14 })
16} 15}
17 16
diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs
index 6db82051e..26838d2d8 100644
--- a/src/syntax_kinds.rs
+++ b/src/syntax_kinds.rs
@@ -12,68 +12,70 @@ pub const FALSE_KW: SyntaxKind = SyntaxKind(7);
12pub const AS_KW: SyntaxKind = SyntaxKind(8); 12pub const AS_KW: SyntaxKind = SyntaxKind(8);
13pub const EXTERN_KW: SyntaxKind = SyntaxKind(9); 13pub const EXTERN_KW: SyntaxKind = SyntaxKind(9);
14pub const CRATE_KW: SyntaxKind = SyntaxKind(10); 14pub const CRATE_KW: SyntaxKind = SyntaxKind(10);
15pub const ERROR: SyntaxKind = SyntaxKind(11); 15pub const MOD_KW: SyntaxKind = SyntaxKind(11);
16pub const IDENT: SyntaxKind = SyntaxKind(12); 16pub const ERROR: SyntaxKind = SyntaxKind(12);
17pub const UNDERSCORE: SyntaxKind = SyntaxKind(13); 17pub const IDENT: SyntaxKind = SyntaxKind(13);
18pub const WHITESPACE: SyntaxKind = SyntaxKind(14); 18pub const UNDERSCORE: SyntaxKind = SyntaxKind(14);
19pub const INT_NUMBER: SyntaxKind = SyntaxKind(15); 19pub const WHITESPACE: SyntaxKind = SyntaxKind(15);
20pub const FLOAT_NUMBER: SyntaxKind = SyntaxKind(16); 20pub const INT_NUMBER: SyntaxKind = SyntaxKind(16);
21pub const SEMI: SyntaxKind = SyntaxKind(17); 21pub const FLOAT_NUMBER: SyntaxKind = SyntaxKind(17);
22pub const COMMA: SyntaxKind = SyntaxKind(18); 22pub const SEMI: SyntaxKind = SyntaxKind(18);
23pub const DOT: SyntaxKind = SyntaxKind(19); 23pub const COMMA: SyntaxKind = SyntaxKind(19);
24pub const DOTDOT: SyntaxKind = SyntaxKind(20); 24pub const DOT: SyntaxKind = SyntaxKind(20);
25pub const DOTDOTDOT: SyntaxKind = SyntaxKind(21); 25pub const DOTDOT: SyntaxKind = SyntaxKind(21);
26pub const DOTDOTEQ: SyntaxKind = SyntaxKind(22); 26pub const DOTDOTDOT: SyntaxKind = SyntaxKind(22);
27pub const L_PAREN: SyntaxKind = SyntaxKind(23); 27pub const DOTDOTEQ: SyntaxKind = SyntaxKind(23);
28pub const R_PAREN: SyntaxKind = SyntaxKind(24); 28pub const L_PAREN: SyntaxKind = SyntaxKind(24);
29pub const L_CURLY: SyntaxKind = SyntaxKind(25); 29pub const R_PAREN: SyntaxKind = SyntaxKind(25);
30pub const R_CURLY: SyntaxKind = SyntaxKind(26); 30pub const L_CURLY: SyntaxKind = SyntaxKind(26);
31pub const L_BRACK: SyntaxKind = SyntaxKind(27); 31pub const R_CURLY: SyntaxKind = SyntaxKind(27);
32pub const R_BRACK: SyntaxKind = SyntaxKind(28); 32pub const L_BRACK: SyntaxKind = SyntaxKind(28);
33pub const L_ANGLE: SyntaxKind = SyntaxKind(29); 33pub const R_BRACK: SyntaxKind = SyntaxKind(29);
34pub const R_ANGLE: SyntaxKind = SyntaxKind(30); 34pub const L_ANGLE: SyntaxKind = SyntaxKind(30);
35pub const AT: SyntaxKind = SyntaxKind(31); 35pub const R_ANGLE: SyntaxKind = SyntaxKind(31);
36pub const POUND: SyntaxKind = SyntaxKind(32); 36pub const AT: SyntaxKind = SyntaxKind(32);
37pub const TILDE: SyntaxKind = SyntaxKind(33); 37pub const POUND: SyntaxKind = SyntaxKind(33);
38pub const QUESTION: SyntaxKind = SyntaxKind(34); 38pub const TILDE: SyntaxKind = SyntaxKind(34);
39pub const COLON: SyntaxKind = SyntaxKind(35); 39pub const QUESTION: SyntaxKind = SyntaxKind(35);
40pub const COLONCOLON: SyntaxKind = SyntaxKind(36); 40pub const COLON: SyntaxKind = SyntaxKind(36);
41pub const DOLLAR: SyntaxKind = SyntaxKind(37); 41pub const COLONCOLON: SyntaxKind = SyntaxKind(37);
42pub const EQ: SyntaxKind = SyntaxKind(38); 42pub const DOLLAR: SyntaxKind = SyntaxKind(38);
43pub const EQEQ: SyntaxKind = SyntaxKind(39); 43pub const EQ: SyntaxKind = SyntaxKind(39);
44pub const FAT_ARROW: SyntaxKind = SyntaxKind(40); 44pub const EQEQ: SyntaxKind = SyntaxKind(40);
45pub const NEQ: SyntaxKind = SyntaxKind(41); 45pub const FAT_ARROW: SyntaxKind = SyntaxKind(41);
46pub const EXCL: SyntaxKind = SyntaxKind(42); 46pub const NEQ: SyntaxKind = SyntaxKind(42);
47pub const LIFETIME: SyntaxKind = SyntaxKind(43); 47pub const EXCL: SyntaxKind = SyntaxKind(43);
48pub const CHAR: SyntaxKind = SyntaxKind(44); 48pub const LIFETIME: SyntaxKind = SyntaxKind(44);
49pub const BYTE: SyntaxKind = SyntaxKind(45); 49pub const CHAR: SyntaxKind = SyntaxKind(45);
50pub const STRING: SyntaxKind = SyntaxKind(46); 50pub const BYTE: SyntaxKind = SyntaxKind(46);
51pub const RAW_STRING: SyntaxKind = SyntaxKind(47); 51pub const STRING: SyntaxKind = SyntaxKind(47);
52pub const BYTE_STRING: SyntaxKind = SyntaxKind(48); 52pub const RAW_STRING: SyntaxKind = SyntaxKind(48);
53pub const RAW_BYTE_STRING: SyntaxKind = SyntaxKind(49); 53pub const BYTE_STRING: SyntaxKind = SyntaxKind(49);
54pub const PLUS: SyntaxKind = SyntaxKind(50); 54pub const RAW_BYTE_STRING: SyntaxKind = SyntaxKind(50);
55pub const MINUS: SyntaxKind = SyntaxKind(51); 55pub const PLUS: SyntaxKind = SyntaxKind(51);
56pub const STAR: SyntaxKind = SyntaxKind(52); 56pub const MINUS: SyntaxKind = SyntaxKind(52);
57pub const SLASH: SyntaxKind = SyntaxKind(53); 57pub const STAR: SyntaxKind = SyntaxKind(53);
58pub const CARET: SyntaxKind = SyntaxKind(54); 58pub const SLASH: SyntaxKind = SyntaxKind(54);
59pub const PERCENT: SyntaxKind = SyntaxKind(55); 59pub const CARET: SyntaxKind = SyntaxKind(55);
60pub const AMPERSAND: SyntaxKind = SyntaxKind(56); 60pub const PERCENT: SyntaxKind = SyntaxKind(56);
61pub const PIPE: SyntaxKind = SyntaxKind(57); 61pub const AMPERSAND: SyntaxKind = SyntaxKind(57);
62pub const THIN_ARROW: SyntaxKind = SyntaxKind(58); 62pub const PIPE: SyntaxKind = SyntaxKind(58);
63pub const COMMENT: SyntaxKind = SyntaxKind(59); 63pub const THIN_ARROW: SyntaxKind = SyntaxKind(59);
64pub const DOC_COMMENT: SyntaxKind = SyntaxKind(60); 64pub const COMMENT: SyntaxKind = SyntaxKind(60);
65pub const SHEBANG: SyntaxKind = SyntaxKind(61); 65pub const DOC_COMMENT: SyntaxKind = SyntaxKind(61);
66pub const FILE: SyntaxKind = SyntaxKind(62); 66pub const SHEBANG: SyntaxKind = SyntaxKind(62);
67pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(63); 67pub const FILE: SyntaxKind = SyntaxKind(63);
68pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(64); 68pub const STRUCT_ITEM: SyntaxKind = SyntaxKind(64);
69pub const FN_ITEM: SyntaxKind = SyntaxKind(65); 69pub const STRUCT_FIELD: SyntaxKind = SyntaxKind(65);
70pub const EXTERN_CRATE_ITEM: SyntaxKind = SyntaxKind(66); 70pub const FN_ITEM: SyntaxKind = SyntaxKind(66);
71pub const ATTR: SyntaxKind = SyntaxKind(67); 71pub const EXTERN_CRATE_ITEM: SyntaxKind = SyntaxKind(67);
72pub const META_ITEM: SyntaxKind = SyntaxKind(68); 72pub const ATTR: SyntaxKind = SyntaxKind(68);
73pub const LITERAL: SyntaxKind = SyntaxKind(69); 73pub const META_ITEM: SyntaxKind = SyntaxKind(69);
74pub const ALIAS: SyntaxKind = SyntaxKind(70); 74pub const MOD_ITEM: SyntaxKind = SyntaxKind(70);
75pub const LITERAL: SyntaxKind = SyntaxKind(71);
76pub const ALIAS: SyntaxKind = SyntaxKind(72);
75 77
76static INFOS: [SyntaxInfo; 71] = [ 78static INFOS: [SyntaxInfo; 73] = [
77 SyntaxInfo { name: "USE_KW" }, 79 SyntaxInfo { name: "USE_KW" },
78 SyntaxInfo { name: "FN_KW" }, 80 SyntaxInfo { name: "FN_KW" },
79 SyntaxInfo { name: "STRUCT_KW" }, 81 SyntaxInfo { name: "STRUCT_KW" },
@@ -85,6 +87,7 @@ static INFOS: [SyntaxInfo; 71] = [
85 SyntaxInfo { name: "AS_KW" }, 87 SyntaxInfo { name: "AS_KW" },
86 SyntaxInfo { name: "EXTERN_KW" }, 88 SyntaxInfo { name: "EXTERN_KW" },
87 SyntaxInfo { name: "CRATE_KW" }, 89 SyntaxInfo { name: "CRATE_KW" },
90 SyntaxInfo { name: "MOD_KW" },
88 SyntaxInfo { name: "ERROR" }, 91 SyntaxInfo { name: "ERROR" },
89 SyntaxInfo { name: "IDENT" }, 92 SyntaxInfo { name: "IDENT" },
90 SyntaxInfo { name: "UNDERSCORE" }, 93 SyntaxInfo { name: "UNDERSCORE" },
@@ -143,6 +146,7 @@ static INFOS: [SyntaxInfo; 71] = [
143 SyntaxInfo { name: "EXTERN_CRATE_ITEM" }, 146 SyntaxInfo { name: "EXTERN_CRATE_ITEM" },
144 SyntaxInfo { name: "ATTR" }, 147 SyntaxInfo { name: "ATTR" },
145 SyntaxInfo { name: "META_ITEM" }, 148 SyntaxInfo { name: "META_ITEM" },
149 SyntaxInfo { name: "MOD_ITEM" },
146 SyntaxInfo { name: "LITERAL" }, 150 SyntaxInfo { name: "LITERAL" },
147 SyntaxInfo { name: "ALIAS" }, 151 SyntaxInfo { name: "ALIAS" },
148]; 152];
@@ -164,6 +168,7 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {
164 "as" => Some(AS_KW), 168 "as" => Some(AS_KW),
165 "extern" => Some(EXTERN_KW), 169 "extern" => Some(EXTERN_KW),
166 "crate" => Some(CRATE_KW), 170 "crate" => Some(CRATE_KW),
171 "mod" => Some(MOD_KW),
167 _ => None, 172 _ => None,
168 } 173 }
169} 174}
diff --git a/tests/data/lexer/0011_keywords.rs b/tests/data/lexer/0011_keywords.rs
index 4adb1587e..58568b20d 100644
--- a/tests/data/lexer/0011_keywords.rs
+++ b/tests/data/lexer/0011_keywords.rs
@@ -1 +1 @@
fn use struct trait enum impl true false as extern crate fn use struct trait enum impl true false as extern crate mod
diff --git a/tests/data/lexer/0011_keywords.txt b/tests/data/lexer/0011_keywords.txt
index bf8ceffd4..35d9a3871 100644
--- a/tests/data/lexer/0011_keywords.txt
+++ b/tests/data/lexer/0011_keywords.txt
@@ -19,4 +19,6 @@ WHITESPACE 1 " "
19EXTERN_KW 6 "extern" 19EXTERN_KW 6 "extern"
20WHITESPACE 1 " " 20WHITESPACE 1 " "
21CRATE_KW 5 "crate" 21CRATE_KW 5 "crate"
22WHITESPACE 1 " "
23MOD_KW 3 "mod"
22WHITESPACE 1 "\n" 24WHITESPACE 1 "\n"
diff --git a/tests/data/parser/ok/0008_mod_item.rs b/tests/data/parser/ok/0008_mod_item.rs
new file mode 100644
index 000000000..d22993bc1
--- /dev/null
+++ b/tests/data/parser/ok/0008_mod_item.rs
@@ -0,0 +1,17 @@
1mod a;
2
3mod b {
4}
5
6mod c {
7 fn foo() {
8 }
9 struct S {}
10}
11
12mod d {
13 #![attr]
14 mod e;
15 mod f {
16 }
17} \ No newline at end of file
diff --git a/tests/data/parser/ok/0008_mod_item.txt b/tests/data/parser/ok/0008_mod_item.txt
new file mode 100644
index 000000000..425e3344c
--- /dev/null
+++ b/tests/data/parser/ok/0008_mod_item.txt
@@ -0,0 +1,75 @@
1FILE@[0; 118)
2 MOD_ITEM@[0; 8)
3 MOD_KW@[0; 3)
4 WHITESPACE@[3; 4)
5 IDENT@[4; 5)
6 SEMI@[5; 6)
7 WHITESPACE@[6; 8)
8 MOD_ITEM@[8; 19)
9 MOD_KW@[8; 11)
10 WHITESPACE@[11; 12)
11 IDENT@[12; 13)
12 WHITESPACE@[13; 14)
13 L_CURLY@[14; 15)
14 WHITESPACE@[15; 16)
15 R_CURLY@[16; 17)
16 WHITESPACE@[17; 19)
17 MOD_ITEM@[19; 67)
18 MOD_KW@[19; 22)
19 WHITESPACE@[22; 23)
20 IDENT@[23; 24)
21 WHITESPACE@[24; 25)
22 L_CURLY@[25; 26)
23 FN_ITEM@[26; 52)
24 WHITESPACE@[26; 31)
25 FN_KW@[31; 33)
26 WHITESPACE@[33; 34)
27 IDENT@[34; 37)
28 L_PAREN@[37; 38)
29 R_PAREN@[38; 39)
30 WHITESPACE@[39; 40)
31 L_CURLY@[40; 41)
32 WHITESPACE@[41; 46)
33 R_CURLY@[46; 47)
34 WHITESPACE@[47; 52)
35 STRUCT_ITEM@[52; 64)
36 STRUCT_KW@[52; 58)
37 WHITESPACE@[58; 59)
38 IDENT@[59; 60)
39 WHITESPACE@[60; 61)
40 L_CURLY@[61; 62)
41 R_CURLY@[62; 63)
42 WHITESPACE@[63; 64)
43 R_CURLY@[64; 65)
44 WHITESPACE@[65; 67)
45 MOD_ITEM@[67; 118)
46 MOD_KW@[67; 70)
47 WHITESPACE@[70; 71)
48 IDENT@[71; 72)
49 WHITESPACE@[72; 73)
50 L_CURLY@[73; 74)
51 ATTR@[74; 92)
52 WHITESPACE@[74; 79)
53 POUND@[79; 80)
54 EXCL@[80; 81)
55 L_BRACK@[81; 82)
56 META_ITEM@[82; 86)
57 IDENT@[82; 86)
58 R_BRACK@[86; 87)
59 WHITESPACE@[87; 92)
60 MOD_ITEM@[92; 103)
61 MOD_KW@[92; 95)
62 WHITESPACE@[95; 96)
63 IDENT@[96; 97)
64 SEMI@[97; 98)
65 WHITESPACE@[98; 103)
66 MOD_ITEM@[103; 117)
67 MOD_KW@[103; 106)
68 WHITESPACE@[106; 107)
69 IDENT@[107; 108)
70 WHITESPACE@[108; 109)
71 L_CURLY@[109; 110)
72 WHITESPACE@[110; 115)
73 R_CURLY@[115; 116)
74 WHITESPACE@[116; 117)
75 R_CURLY@[117; 118)