Skip to content

Commit fb632c7

Browse files
committed
Parse default unsafe & default const
1 parent 65a3cc2 commit fb632c7

File tree

2 files changed

+45
-15
lines changed

2 files changed

+45
-15
lines changed

crates/ra_parser/src/grammar/items.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,15 @@ 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+
if T![impl] == p.nth(2) {
123+
p.bump_remap(T![default]);
124+
p.bump_remap(T![unsafe]);
125+
has_mods = true;
126+
}
127+
false
128+
}
129+
T![fn] | T![type] | T![const] => {
122130
if let ItemFlavor::Mod = flavor {
123131
true
124132
} else {
@@ -187,6 +195,9 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
187195
// test default_impl
188196
// default impl Foo {}
189197

198+
// test default_unsafe_impl
199+
// default unsafe impl Foo {}
200+
190201
// test_err default_fn_type
191202
// trait T {
192203
// default type T = Bar;
@@ -199,6 +210,19 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul
199210
// default fn foo() {}
200211
// }
201212

213+
// test_err default_const
214+
// trait T {
215+
// default const f: u8 = 0;
216+
// }
217+
218+
// test default_const
219+
// impl T for Foo {
220+
// default const f: u8 = 0;
221+
// }
222+
T![const] => {
223+
consts::const_def(p, m);
224+
}
225+
202226
// test unsafe_default_impl
203227
// unsafe default impl Foo {}
204228
T![impl] => {

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

0 commit comments

Comments
 (0)