aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--grammar.ron6
-rw-r--r--src/parser/event_parser/grammar/items/mod.rs28
-rw-r--r--src/syntax_kinds.rs11
-rw-r--r--tests/data/lexer/0011_keywords.rs4
-rw-r--r--tests/data/lexer/0011_keywords.txt8
-rw-r--r--tests/data/parser/ok/0023_static_items.rs2
-rw-r--r--tests/data/parser/ok/0023_static_items.txt31
7 files changed, 81 insertions, 9 deletions
diff --git a/grammar.ron b/grammar.ron
index 44826c779..53248519f 100644
--- a/grammar.ron
+++ b/grammar.ron
@@ -21,7 +21,10 @@ Grammar(
21 "loop", 21 "loop",
22 "while", 22 "while",
23 "if", 23 "if",
24 "match" 24 "match",
25 "const",
26 "static",
27 "mut",
25 ], 28 ],
26 tokens: [ 29 tokens: [
27 "ERROR", 30 "ERROR",
@@ -85,6 +88,7 @@ Grammar(
85 "EXTERN_CRATE_ITEM", 88 "EXTERN_CRATE_ITEM",
86 "MOD_ITEM", 89 "MOD_ITEM",
87 "USE_ITEM", 90 "USE_ITEM",
91 "STATIC_ITEM",
88 92
89 "EXTERN_BLOCK", 93 "EXTERN_BLOCK",
90 "ENUM_VARIANT", 94 "ENUM_VARIANT",
diff --git a/src/parser/event_parser/grammar/items/mod.rs b/src/parser/event_parser/grammar/items/mod.rs
index 35825e7c4..9930de347 100644
--- a/src/parser/event_parser/grammar/items/mod.rs
+++ b/src/parser/event_parser/grammar/items/mod.rs
@@ -46,6 +46,10 @@ fn item(p: &mut Parser) {
46 } 46 }
47 } 47 }
48 } 48 }
49 STATIC_KW => {
50 static_item(p);
51 STATIC_ITEM
52 }
49 MOD_KW => { 53 MOD_KW => {
50 mod_item(p); 54 mod_item(p);
51 MOD_ITEM 55 MOD_ITEM
@@ -92,6 +96,24 @@ fn extern_crate_item(p: &mut Parser) {
92 p.expect(IDENT) && alias(p) && p.expect(SEMI); 96 p.expect(IDENT) && alias(p) && p.expect(SEMI);
93} 97}
94 98
99fn extern_block(p: &mut Parser) {
100 assert!(p.at(L_CURLY));
101 p.bump();
102 p.expect(R_CURLY);
103}
104
105fn static_item(p: &mut Parser) {
106 assert!(p.at(STATIC_KW));
107 p.bump();
108 p.eat(MUT_KW);
109 p.expect(IDENT);
110 p.expect(COLON);
111 types::type_ref(p);
112 p.expect(EQ);
113 expressions::expr(p);
114 p.expect(SEMI);
115}
116
95fn mod_item(p: &mut Parser) { 117fn mod_item(p: &mut Parser) {
96 assert!(p.at(MOD_KW)); 118 assert!(p.at(MOD_KW));
97 p.bump(); 119 p.bump();
@@ -104,12 +126,6 @@ fn mod_item(p: &mut Parser) {
104 } 126 }
105} 127}
106 128
107fn extern_block(p: &mut Parser) {
108 assert!(p.at(L_CURLY));
109 p.bump();
110 p.expect(R_CURLY);
111}
112
113fn abi(p: &mut Parser) { 129fn abi(p: &mut Parser) {
114 assert!(p.at(EXTERN_KW)); 130 assert!(p.at(EXTERN_KW));
115 let abi = p.start(); 131 let abi = p.start();
diff --git a/src/syntax_kinds.rs b/src/syntax_kinds.rs
index 7577fa037..8d21d3fb7 100644
--- a/src/syntax_kinds.rs
+++ b/src/syntax_kinds.rs
@@ -28,6 +28,9 @@ pub enum SyntaxKind {
28 WHILE_KW, 28 WHILE_KW,
29 IF_KW, 29 IF_KW,
30 MATCH_KW, 30 MATCH_KW,
31 CONST_KW,
32 STATIC_KW,
33 MUT_KW,
31 ERROR, 34 ERROR,
32 IDENT, 35 IDENT,
33 UNDERSCORE, 36 UNDERSCORE,
@@ -86,6 +89,7 @@ pub enum SyntaxKind {
86 EXTERN_CRATE_ITEM, 89 EXTERN_CRATE_ITEM,
87 MOD_ITEM, 90 MOD_ITEM,
88 USE_ITEM, 91 USE_ITEM,
92 STATIC_ITEM,
89 EXTERN_BLOCK, 93 EXTERN_BLOCK,
90 ENUM_VARIANT, 94 ENUM_VARIANT,
91 NAMED_FIELD, 95 NAMED_FIELD,
@@ -137,6 +141,9 @@ impl SyntaxKind {
137 WHILE_KW => &SyntaxInfo { name: "WHILE_KW" }, 141 WHILE_KW => &SyntaxInfo { name: "WHILE_KW" },
138 IF_KW => &SyntaxInfo { name: "IF_KW" }, 142 IF_KW => &SyntaxInfo { name: "IF_KW" },
139 MATCH_KW => &SyntaxInfo { name: "MATCH_KW" }, 143 MATCH_KW => &SyntaxInfo { name: "MATCH_KW" },
144 CONST_KW => &SyntaxInfo { name: "CONST_KW" },
145 STATIC_KW => &SyntaxInfo { name: "STATIC_KW" },
146 MUT_KW => &SyntaxInfo { name: "MUT_KW" },
140 ERROR => &SyntaxInfo { name: "ERROR" }, 147 ERROR => &SyntaxInfo { name: "ERROR" },
141 IDENT => &SyntaxInfo { name: "IDENT" }, 148 IDENT => &SyntaxInfo { name: "IDENT" },
142 UNDERSCORE => &SyntaxInfo { name: "UNDERSCORE" }, 149 UNDERSCORE => &SyntaxInfo { name: "UNDERSCORE" },
@@ -195,6 +202,7 @@ impl SyntaxKind {
195 EXTERN_CRATE_ITEM => &SyntaxInfo { name: "EXTERN_CRATE_ITEM" }, 202 EXTERN_CRATE_ITEM => &SyntaxInfo { name: "EXTERN_CRATE_ITEM" },
196 MOD_ITEM => &SyntaxInfo { name: "MOD_ITEM" }, 203 MOD_ITEM => &SyntaxInfo { name: "MOD_ITEM" },
197 USE_ITEM => &SyntaxInfo { name: "USE_ITEM" }, 204 USE_ITEM => &SyntaxInfo { name: "USE_ITEM" },
205 STATIC_ITEM => &SyntaxInfo { name: "STATIC_ITEM" },
198 EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, 206 EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
199 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, 207 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
200 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, 208 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
@@ -242,6 +250,9 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {
242 "while" => Some(WHILE_KW), 250 "while" => Some(WHILE_KW),
243 "if" => Some(IF_KW), 251 "if" => Some(IF_KW),
244 "match" => Some(MATCH_KW), 252 "match" => Some(MATCH_KW),
253 "const" => Some(CONST_KW),
254 "static" => Some(STATIC_KW),
255 "mut" => Some(MUT_KW),
245 _ => None, 256 _ => None,
246 } 257 }
247} 258}
diff --git a/tests/data/lexer/0011_keywords.rs b/tests/data/lexer/0011_keywords.rs
index 02ca19089..b74fc606e 100644
--- a/tests/data/lexer/0011_keywords.rs
+++ b/tests/data/lexer/0011_keywords.rs
@@ -1 +1,3 @@
1fn use struct trait enum impl true false as extern crate mod pub self super in where for loop while if match 1fn use struct trait enum impl true false as extern crate
2mod pub self super in where for loop while if match const
3static mut
diff --git a/tests/data/lexer/0011_keywords.txt b/tests/data/lexer/0011_keywords.txt
index 964e3475a..05b1f0995 100644
--- a/tests/data/lexer/0011_keywords.txt
+++ b/tests/data/lexer/0011_keywords.txt
@@ -19,7 +19,7 @@ WHITESPACE 1 " "
19EXTERN_KW 6 "extern" 19EXTERN_KW 6 "extern"
20WHITESPACE 1 " " 20WHITESPACE 1 " "
21CRATE_KW 5 "crate" 21CRATE_KW 5 "crate"
22WHITESPACE 1 " " 22WHITESPACE 1 "\n"
23MOD_KW 3 "mod" 23MOD_KW 3 "mod"
24WHITESPACE 1 " " 24WHITESPACE 1 " "
25PUB_KW 3 "pub" 25PUB_KW 3 "pub"
@@ -41,4 +41,10 @@ WHITESPACE 1 " "
41IF_KW 2 "if" 41IF_KW 2 "if"
42WHITESPACE 1 " " 42WHITESPACE 1 " "
43MATCH_KW 5 "match" 43MATCH_KW 5 "match"
44WHITESPACE 1 " "
45CONST_KW 5 "const"
46WHITESPACE 1 "\n"
47STATIC_KW 6 "static"
48WHITESPACE 1 " "
49MUT_KW 3 "mut"
44WHITESPACE 1 "\n" 50WHITESPACE 1 "\n"
diff --git a/tests/data/parser/ok/0023_static_items.rs b/tests/data/parser/ok/0023_static_items.rs
new file mode 100644
index 000000000..5fb92ce33
--- /dev/null
+++ b/tests/data/parser/ok/0023_static_items.rs
@@ -0,0 +1,2 @@
1static FOO: u32 = 1;
2static mut BAR: i32 = 92;
diff --git a/tests/data/parser/ok/0023_static_items.txt b/tests/data/parser/ok/0023_static_items.txt
new file mode 100644
index 000000000..7cd2228fa
--- /dev/null
+++ b/tests/data/parser/ok/0023_static_items.txt
@@ -0,0 +1,31 @@
1FILE@[0; 47)
2 STATIC_ITEM@[0; 21)
3 STATIC_KW@[0; 6)
4 WHITESPACE@[6; 7)
5 IDENT@[7; 10) "FOO"
6 COLON@[10; 11)
7 WHITESPACE@[11; 12)
8 IDENT@[12; 15) "u32"
9 WHITESPACE@[15; 16)
10 EQ@[16; 17)
11 LITERAL@[17; 19)
12 WHITESPACE@[17; 18)
13 INT_NUMBER@[18; 19)
14 SEMI@[19; 20)
15 WHITESPACE@[20; 21)
16 STATIC_ITEM@[21; 47)
17 STATIC_KW@[21; 27)
18 WHITESPACE@[27; 28)
19 MUT_KW@[28; 31)
20 WHITESPACE@[31; 32)
21 IDENT@[32; 35) "BAR"
22 COLON@[35; 36)
23 WHITESPACE@[36; 37)
24 IDENT@[37; 40) "i32"
25 WHITESPACE@[40; 41)
26 EQ@[41; 42)
27 LITERAL@[42; 45)
28 WHITESPACE@[42; 43)
29 INT_NUMBER@[43; 45)
30 SEMI@[45; 46)
31 WHITESPACE@[46; 47)