Skip to content

Commit e5273d3

Browse files
committed
G: const item
1 parent 5e7504b commit e5273d3

File tree

8 files changed

+114
-14
lines changed

8 files changed

+114
-14
lines changed

grammar.ron

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Grammar(
2525
"const",
2626
"static",
2727
"mut",
28+
"unsafe",
2829
],
2930
tokens: [
3031
"ERROR",
@@ -89,6 +90,7 @@ Grammar(
8990
"MOD_ITEM",
9091
"USE_ITEM",
9192
"STATIC_ITEM",
93+
"CONST_ITEM",
9294

9395
"EXTERN_BLOCK",
9496
"ENUM_VARIANT",
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
use super::*;
2+
3+
pub(super) fn static_item(p: &mut Parser) {
4+
const_or_static(p, STATIC_KW)
5+
}
6+
7+
pub(super) fn const_item(p: &mut Parser) {
8+
const_or_static(p, CONST_KW)
9+
}
10+
11+
fn const_or_static(p: &mut Parser, kw: SyntaxKind) {
12+
assert!(p.at(kw));
13+
p.bump();
14+
p.eat(MUT_KW); // TODO: validator to forbid const mut
15+
p.expect(IDENT);
16+
p.expect(COLON);
17+
types::type_ref(p);
18+
p.expect(EQ);
19+
expressions::expr(p);
20+
p.expect(SEMI);
21+
}

src/parser/event_parser/grammar/items/mod.rs

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::*;
22

33
mod structs;
44
mod use_item;
5+
mod consts;
56

67
pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) {
78
attributes::inner_attributes(p);
@@ -47,9 +48,26 @@ fn item(p: &mut Parser) {
4748
}
4849
}
4950
STATIC_KW => {
50-
static_item(p);
51+
consts::static_item(p);
5152
STATIC_ITEM
5253
}
54+
CONST_KW => match p.nth(1) {
55+
FN_KW => {
56+
p.bump();
57+
fn_item(p);
58+
FN_ITEM
59+
}
60+
UNSAFE_KW if p.nth(2) == FN_KW => {
61+
p.bump();
62+
p.bump();
63+
fn_item(p);
64+
FN_ITEM
65+
}
66+
_ => {
67+
consts::const_item(p);
68+
CONST_ITEM
69+
}
70+
},
5371
MOD_KW => {
5472
mod_item(p);
5573
MOD_ITEM
@@ -101,19 +119,6 @@ fn extern_block(p: &mut Parser) {
101119
p.bump();
102120
p.expect(R_CURLY);
103121
}
104-
105-
fn 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-
117122
fn mod_item(p: &mut Parser) {
118123
assert!(p.at(MOD_KW));
119124
p.bump();

src/syntax_kinds.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ pub enum SyntaxKind {
3131
CONST_KW,
3232
STATIC_KW,
3333
MUT_KW,
34+
UNSAFE_KW,
3435
ERROR,
3536
IDENT,
3637
UNDERSCORE,
@@ -90,6 +91,7 @@ pub enum SyntaxKind {
9091
MOD_ITEM,
9192
USE_ITEM,
9293
STATIC_ITEM,
94+
CONST_ITEM,
9395
EXTERN_BLOCK,
9496
ENUM_VARIANT,
9597
NAMED_FIELD,
@@ -144,6 +146,7 @@ impl SyntaxKind {
144146
CONST_KW => &SyntaxInfo { name: "CONST_KW" },
145147
STATIC_KW => &SyntaxInfo { name: "STATIC_KW" },
146148
MUT_KW => &SyntaxInfo { name: "MUT_KW" },
149+
UNSAFE_KW => &SyntaxInfo { name: "UNSAFE_KW" },
147150
ERROR => &SyntaxInfo { name: "ERROR" },
148151
IDENT => &SyntaxInfo { name: "IDENT" },
149152
UNDERSCORE => &SyntaxInfo { name: "UNDERSCORE" },
@@ -203,6 +206,7 @@ impl SyntaxKind {
203206
MOD_ITEM => &SyntaxInfo { name: "MOD_ITEM" },
204207
USE_ITEM => &SyntaxInfo { name: "USE_ITEM" },
205208
STATIC_ITEM => &SyntaxInfo { name: "STATIC_ITEM" },
209+
CONST_ITEM => &SyntaxInfo { name: "CONST_ITEM" },
206210
EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
207211
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
208212
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
@@ -253,6 +257,7 @@ pub(crate) fn ident_to_keyword(ident: &str) -> Option<SyntaxKind> {
253257
"const" => Some(CONST_KW),
254258
"static" => Some(STATIC_KW),
255259
"mut" => Some(MUT_KW),
260+
"unsafe" => Some(UNSAFE_KW),
256261
_ => None,
257262
}
258263
}

tests/data/parser/ok/0024_const_fn.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
const fn foo() {
2+
}
3+
4+
const unsafe fn foo() {
5+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
FILE@[0; 46)
2+
FN_ITEM@[0; 20)
3+
CONST_KW@[0; 5)
4+
WHITESPACE@[5; 6)
5+
FN_KW@[6; 8)
6+
WHITESPACE@[8; 9)
7+
IDENT@[9; 12) "foo"
8+
L_PAREN@[12; 13)
9+
R_PAREN@[13; 14)
10+
WHITESPACE@[14; 15)
11+
L_CURLY@[15; 16)
12+
WHITESPACE@[16; 17)
13+
R_CURLY@[17; 18)
14+
WHITESPACE@[18; 20)
15+
FN_ITEM@[20; 46)
16+
CONST_KW@[20; 25)
17+
WHITESPACE@[25; 26)
18+
UNSAFE_KW@[26; 32)
19+
WHITESPACE@[32; 33)
20+
FN_KW@[33; 35)
21+
WHITESPACE@[35; 36)
22+
IDENT@[36; 39) "foo"
23+
L_PAREN@[39; 40)
24+
R_PAREN@[40; 41)
25+
WHITESPACE@[41; 42)
26+
L_CURLY@[42; 43)
27+
WHITESPACE@[43; 44)
28+
R_CURLY@[44; 45)
29+
WHITESPACE@[45; 46)
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
const FOO: u32 = 92;
2+
const mut BAR: u32 = 62;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
FILE@[0; 46)
2+
CONST_ITEM@[0; 21)
3+
CONST_KW@[0; 5)
4+
WHITESPACE@[5; 6)
5+
IDENT@[6; 9) "FOO"
6+
COLON@[9; 10)
7+
WHITESPACE@[10; 11)
8+
IDENT@[11; 14) "u32"
9+
WHITESPACE@[14; 15)
10+
EQ@[15; 16)
11+
LITERAL@[16; 19)
12+
WHITESPACE@[16; 17)
13+
INT_NUMBER@[17; 19)
14+
SEMI@[19; 20)
15+
WHITESPACE@[20; 21)
16+
CONST_ITEM@[21; 46)
17+
CONST_KW@[21; 26)
18+
WHITESPACE@[26; 27)
19+
MUT_KW@[27; 30)
20+
WHITESPACE@[30; 31)
21+
IDENT@[31; 34) "BAR"
22+
COLON@[34; 35)
23+
WHITESPACE@[35; 36)
24+
IDENT@[36; 39) "u32"
25+
WHITESPACE@[39; 40)
26+
EQ@[40; 41)
27+
LITERAL@[41; 44)
28+
WHITESPACE@[41; 42)
29+
INT_NUMBER@[42; 44)
30+
SEMI@[44; 45)
31+
WHITESPACE@[45; 46)

0 commit comments

Comments
 (0)