Skip to content

Commit e66c7b3

Browse files
Merge #4737
4737: Parse default unsafe & default const r=matklad a=Avi-D-coder Closes: #4718 #4264 Co-authored-by: Avi Dessauer <avi.the.coder@gmail.com>
2 parents c19496f + c4fd463 commit e66c7b3

File tree

8 files changed

+143
-15
lines changed

8 files changed

+143
-15
lines changed

crates/ra_parser/src/grammar/items.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,17 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
118118
&& p.at_contextual_kw("default")
119119
&& (match p.nth(1) {
120120
T![impl] => true,
121-
T![fn] | T![type] => {
121+
T![unsafe] => {
122+
// test default_unsafe_impl
123+
// default unsafe impl Foo {}
124+
if p.nth(2) == T![impl] {
125+
p.bump_remap(T![default]);
126+
p.bump(T![unsafe]);
127+
has_mods = true;
128+
}
129+
false
130+
}
131+
T![fn] | T![type] | T![const] => {
122132
if let ItemFlavor::Mod = flavor {
123133
true
124134
} else {
@@ -198,6 +208,9 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
198208
// default type T = Bar;
199209
// default fn foo() {}
200210
// }
211+
T![const] => {
212+
consts::const_def(p, m);
213+
}
201214

202215
// test unsafe_default_impl
203216
// unsafe default impl Foo {}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
SOURCE_FILE@0..39
2+
TRAIT_DEF@0..38
3+
TRAIT_KW@0..5 "trait"
4+
WHITESPACE@5..6 " "
5+
NAME@6..7
6+
IDENT@6..7 "T"
7+
WHITESPACE@7..8 " "
8+
ITEM_LIST@8..38
9+
L_CURLY@8..9 "{"
10+
WHITESPACE@9..12 "\n "
11+
MACRO_CALL@12..19
12+
PATH@12..19
13+
PATH_SEGMENT@12..19
14+
NAME_REF@12..19
15+
IDENT@12..19 "default"
16+
WHITESPACE@19..20 " "
17+
CONST_DEF@20..36
18+
CONST_KW@20..25 "const"
19+
WHITESPACE@25..26 " "
20+
NAME@26..27
21+
IDENT@26..27 "f"
22+
COLON@27..28 ":"
23+
WHITESPACE@28..29 " "
24+
PATH_TYPE@29..31
25+
PATH@29..31
26+
PATH_SEGMENT@29..31
27+
NAME_REF@29..31
28+
IDENT@29..31 "u8"
29+
WHITESPACE@31..32 " "
30+
EQ@32..33 "="
31+
WHITESPACE@33..34 " "
32+
LITERAL@34..35
33+
INT_NUMBER@34..35 "0"
34+
SEMICOLON@35..36 ";"
35+
WHITESPACE@36..37 "\n"
36+
R_CURLY@37..38 "}"
37+
WHITESPACE@38..39 "\n"
38+
error 19..19: expected BANG
39+
error 19..19: expected `{`, `[`, `(`
40+
error 19..19: expected SEMICOLON
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
trait T {
2+
default const f: u8 = 0;
3+
}

crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,29 @@ SOURCE_FILE@0..50
1717
L_CURLY@22..23 "{"
1818
R_CURLY@23..24 "}"
1919
WHITESPACE@24..25 "\n"
20-
ERROR@25..31
20+
CONST_DEF@25..46
2121
UNSAFE_KW@25..31 "unsafe"
22-
WHITESPACE@31..32 " "
23-
FN_DEF@32..49
22+
WHITESPACE@31..32 " "
2423
CONST_KW@32..37 "const"
2524
WHITESPACE@37..38 " "
26-
FN_KW@38..40 "fn"
25+
ERROR@38..40
26+
FN_KW@38..40 "fn"
2727
WHITESPACE@40..41 " "
28-
NAME@41..44
29-
IDENT@41..44 "bar"
30-
PARAM_LIST@44..46
31-
L_PAREN@44..45 "("
32-
R_PAREN@45..46 ")"
33-
WHITESPACE@46..47 " "
34-
BLOCK_EXPR@47..49
35-
L_CURLY@47..48 "{"
36-
R_CURLY@48..49 "}"
28+
PATH_TYPE@41..46
29+
PATH@41..46
30+
PATH_SEGMENT@41..46
31+
NAME_REF@41..44
32+
IDENT@41..44 "bar"
33+
PARAM_LIST@44..46
34+
L_PAREN@44..45 "("
35+
R_PAREN@45..46 ")"
36+
WHITESPACE@46..47 " "
37+
ERROR@47..49
38+
L_CURLY@47..48 "{"
39+
R_CURLY@48..49 "}"
3740
WHITESPACE@49..50 "\n"
3841
error 6..6: expected existential, fn, trait or impl
39-
error 31..31: expected existential, fn, trait or impl
42+
error 38..38: expected a name
43+
error 40..40: expected COLON
44+
error 46..46: expected SEMICOLON
45+
error 47..47: expected an item
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
SOURCE_FILE@0..27
2+
IMPL_DEF@0..26
3+
DEFAULT_KW@0..7 "default"
4+
WHITESPACE@7..8 " "
5+
UNSAFE_KW@8..14 "unsafe"
6+
WHITESPACE@14..15 " "
7+
IMPL_KW@15..19 "impl"
8+
WHITESPACE@19..20 " "
9+
PATH_TYPE@20..23
10+
PATH@20..23
11+
PATH_SEGMENT@20..23
12+
NAME_REF@20..23
13+
IDENT@20..23 "Foo"
14+
WHITESPACE@23..24 " "
15+
ITEM_LIST@24..26
16+
L_CURLY@24..25 "{"
17+
R_CURLY@25..26 "}"
18+
WHITESPACE@26..27 "\n"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
default unsafe impl Foo {}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
SOURCE_FILE@0..46
2+
IMPL_DEF@0..45
3+
IMPL_KW@0..4 "impl"
4+
WHITESPACE@4..5 " "
5+
PATH_TYPE@5..6
6+
PATH@5..6
7+
PATH_SEGMENT@5..6
8+
NAME_REF@5..6
9+
IDENT@5..6 "T"
10+
WHITESPACE@6..7 " "
11+
FOR_KW@7..10 "for"
12+
WHITESPACE@10..11 " "
13+
PATH_TYPE@11..14
14+
PATH@11..14
15+
PATH_SEGMENT@11..14
16+
NAME_REF@11..14
17+
IDENT@11..14 "Foo"
18+
WHITESPACE@14..15 " "
19+
ITEM_LIST@15..45
20+
L_CURLY@15..16 "{"
21+
WHITESPACE@16..19 "\n "
22+
CONST_DEF@19..43
23+
DEFAULT_KW@19..26 "default"
24+
WHITESPACE@26..27 " "
25+
CONST_KW@27..32 "const"
26+
WHITESPACE@32..33 " "
27+
NAME@33..34
28+
IDENT@33..34 "f"
29+
COLON@34..35 ":"
30+
WHITESPACE@35..36 " "
31+
PATH_TYPE@36..38
32+
PATH@36..38
33+
PATH_SEGMENT@36..38
34+
NAME_REF@36..38
35+
IDENT@36..38 "u8"
36+
WHITESPACE@38..39 " "
37+
EQ@39..40 "="
38+
WHITESPACE@40..41 " "
39+
LITERAL@41..42
40+
INT_NUMBER@41..42 "0"
41+
SEMICOLON@42..43 ";"
42+
WHITESPACE@43..44 "\n"
43+
R_CURLY@44..45 "}"
44+
WHITESPACE@45..46 "\n"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
impl T for Foo {
2+
default const f: u8 = 0;
3+
}

0 commit comments

Comments
 (0)