Skip to content

Commit c9318e0

Browse files
committed
G: extern functions
1 parent 3c6ccfe commit c9318e0

File tree

7 files changed

+139
-17
lines changed

7 files changed

+139
-17
lines changed

grammar.ron

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,20 @@ Grammar(
7878
],
7979
nodes: [
8080
"FILE",
81+
8182
"STRUCT_ITEM",
8283
"ENUM_ITEM",
83-
"ENUM_VARIANT",
84-
"NAMED_FIELD",
85-
"POS_FIELD",
8684
"FN_ITEM",
8785
"EXTERN_CRATE_ITEM",
88-
"ATTR",
89-
"META_ITEM",
9086
"MOD_ITEM",
9187
"USE_ITEM",
88+
89+
"EXTERN_BLOCK",
90+
"ENUM_VARIANT",
91+
"NAMED_FIELD",
92+
"POS_FIELD",
93+
"ATTR",
94+
"META_ITEM", // not an item actually
9295
"USE_TREE",
9396
"PATH",
9497
"PATH_SEGMENT",
@@ -98,5 +101,6 @@ Grammar(
98101
"TYPE_PARAM_LIST",
99102
"LIFETIME_PARAM",
100103
"TYPE_PARAM",
104+
"ABI",
101105
]
102106
)

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

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,36 @@ fn item(p: &mut Parser) {
1919
visibility(p);
2020
let la = p.nth(1);
2121
let item_kind = match p.current() {
22+
USE_KW => {
23+
use_item(p);
24+
USE_ITEM
25+
}
2226
EXTERN_KW if la == CRATE_KW => {
2327
extern_crate_item(p);
2428
EXTERN_CRATE_ITEM
2529
}
30+
EXTERN_KW => {
31+
abi(p);
32+
match p.current() {
33+
FN_KW => {
34+
fn_item(p);
35+
FN_ITEM
36+
}
37+
L_CURLY => {
38+
extern_block(p);
39+
EXTERN_BLOCK
40+
}
41+
_ => {
42+
item.abandon(p);
43+
p.error().message("expected `fn` or `{`").emit();
44+
return;
45+
}
46+
}
47+
}
2648
MOD_KW => {
2749
mod_item(p);
2850
MOD_ITEM
2951
}
30-
USE_KW => {
31-
use_item(p);
32-
USE_ITEM
33-
}
3452
STRUCT_KW => {
3553
structs::struct_item(p);
3654
STRUCT_ITEM
@@ -155,6 +173,12 @@ fn mod_item(p: &mut Parser) {
155173
}
156174
}
157175

176+
fn extern_block(p: &mut Parser) {
177+
assert!(p.at(L_CURLY));
178+
p.bump();
179+
p.expect(R_CURLY);
180+
}
181+
158182
pub(super) fn is_use_tree_start(kind: SyntaxKind) -> bool {
159183
kind == STAR || kind == L_CURLY
160184
}
@@ -225,6 +249,17 @@ fn use_item(p: &mut Parser) {
225249
}
226250
}
227251

252+
fn abi(p: &mut Parser) {
253+
assert!(p.at(EXTERN_KW));
254+
let abi = p.start();
255+
p.bump();
256+
match p.current() {
257+
STRING | RAW_STRING => p.bump(),
258+
_ => (),
259+
}
260+
abi.complete(p, ABI);
261+
}
262+
228263
fn fn_item(p: &mut Parser) {
229264
assert!(p.at(FN_KW));
230265
p.bump();

src/syntax_kinds.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,16 @@ pub enum SyntaxKind {
8282
FILE,
8383
STRUCT_ITEM,
8484
ENUM_ITEM,
85+
FN_ITEM,
86+
EXTERN_CRATE_ITEM,
87+
MOD_ITEM,
88+
USE_ITEM,
89+
EXTERN_BLOCK,
8590
ENUM_VARIANT,
8691
NAMED_FIELD,
8792
POS_FIELD,
88-
FN_ITEM,
89-
EXTERN_CRATE_ITEM,
9093
ATTR,
9194
META_ITEM,
92-
MOD_ITEM,
93-
USE_ITEM,
9495
USE_TREE,
9596
PATH,
9697
PATH_SEGMENT,
@@ -100,6 +101,7 @@ pub enum SyntaxKind {
100101
TYPE_PARAM_LIST,
101102
LIFETIME_PARAM,
102103
TYPE_PARAM,
104+
ABI,
103105

104106
// Technical SyntaxKinds: they appear temporally during parsing,
105107
// but never end up in the final tree
@@ -189,15 +191,16 @@ impl SyntaxKind {
189191
FILE => &SyntaxInfo { name: "FILE" },
190192
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
191193
ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
194+
FN_ITEM => &SyntaxInfo { name: "FN_ITEM" },
195+
EXTERN_CRATE_ITEM => &SyntaxInfo { name: "EXTERN_CRATE_ITEM" },
196+
MOD_ITEM => &SyntaxInfo { name: "MOD_ITEM" },
197+
USE_ITEM => &SyntaxInfo { name: "USE_ITEM" },
198+
EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
192199
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
193200
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
194201
POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
195-
FN_ITEM => &SyntaxInfo { name: "FN_ITEM" },
196-
EXTERN_CRATE_ITEM => &SyntaxInfo { name: "EXTERN_CRATE_ITEM" },
197202
ATTR => &SyntaxInfo { name: "ATTR" },
198203
META_ITEM => &SyntaxInfo { name: "META_ITEM" },
199-
MOD_ITEM => &SyntaxInfo { name: "MOD_ITEM" },
200-
USE_ITEM => &SyntaxInfo { name: "USE_ITEM" },
201204
USE_TREE => &SyntaxInfo { name: "USE_TREE" },
202205
PATH => &SyntaxInfo { name: "PATH" },
203206
PATH_SEGMENT => &SyntaxInfo { name: "PATH_SEGMENT" },
@@ -207,6 +210,7 @@ impl SyntaxKind {
207210
TYPE_PARAM_LIST => &SyntaxInfo { name: "TYPE_PARAM_LIST" },
208211
LIFETIME_PARAM => &SyntaxInfo { name: "LIFETIME_PARAM" },
209212
TYPE_PARAM => &SyntaxInfo { name: "TYPE_PARAM" },
213+
ABI => &SyntaxInfo { name: "ABI" },
210214

211215
TOMBSTONE => &SyntaxInfo { name: "TOMBSTONE" },
212216
EOF => &SyntaxInfo { name: "EOF" },
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
extern fn foo() {
2+
}
3+
4+
extern "C" fn bar() {
5+
}
6+
7+
extern r"D" fn baz() {
8+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
FILE@[0; 71)
2+
FN_ITEM@[0; 21)
3+
ABI@[0; 7)
4+
EXTERN_KW@[0; 6)
5+
WHITESPACE@[6; 7)
6+
FN_KW@[7; 9)
7+
WHITESPACE@[9; 10)
8+
IDENT@[10; 13) "foo"
9+
L_PAREN@[13; 14)
10+
R_PAREN@[14; 15)
11+
WHITESPACE@[15; 16)
12+
L_CURLY@[16; 17)
13+
WHITESPACE@[17; 18)
14+
R_CURLY@[18; 19)
15+
WHITESPACE@[19; 21)
16+
FN_ITEM@[21; 46)
17+
ABI@[21; 32)
18+
EXTERN_KW@[21; 27)
19+
WHITESPACE@[27; 28)
20+
STRING@[28; 31)
21+
WHITESPACE@[31; 32)
22+
FN_KW@[32; 34)
23+
WHITESPACE@[34; 35)
24+
IDENT@[35; 38) "bar"
25+
L_PAREN@[38; 39)
26+
R_PAREN@[39; 40)
27+
WHITESPACE@[40; 41)
28+
L_CURLY@[41; 42)
29+
WHITESPACE@[42; 43)
30+
R_CURLY@[43; 44)
31+
WHITESPACE@[44; 46)
32+
FN_ITEM@[46; 71)
33+
ABI@[46; 58)
34+
EXTERN_KW@[46; 52)
35+
WHITESPACE@[52; 53)
36+
RAW_STRING@[53; 57)
37+
WHITESPACE@[57; 58)
38+
FN_KW@[58; 60)
39+
WHITESPACE@[60; 61)
40+
IDENT@[61; 64) "baz"
41+
L_PAREN@[64; 65)
42+
R_PAREN@[65; 66)
43+
WHITESPACE@[66; 67)
44+
L_CURLY@[67; 68)
45+
WHITESPACE@[68; 69)
46+
R_CURLY@[69; 70)
47+
WHITESPACE@[70; 71)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
extern {
2+
}
3+
4+
extern "C" {
5+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
FILE@[0; 27)
2+
EXTERN_BLOCK@[0; 12)
3+
ABI@[0; 7)
4+
EXTERN_KW@[0; 6)
5+
WHITESPACE@[6; 7)
6+
L_CURLY@[7; 8)
7+
WHITESPACE@[8; 9)
8+
R_CURLY@[9; 10)
9+
WHITESPACE@[10; 12)
10+
EXTERN_BLOCK@[12; 27)
11+
ABI@[12; 23)
12+
EXTERN_KW@[12; 18)
13+
WHITESPACE@[18; 19)
14+
STRING@[19; 22)
15+
WHITESPACE@[22; 23)
16+
L_CURLY@[23; 24)
17+
WHITESPACE@[24; 25)
18+
R_CURLY@[25; 26)
19+
WHITESPACE@[26; 27)

0 commit comments

Comments
 (0)