diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-06-04 18:51:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-04 18:51:03 +0100 |
commit | e66c7b3a453e7b7385f103ae7f1f3f7438bdb31b (patch) | |
tree | 4a71b164a5b2e97cf219d7cfcd926b9119b6f646 | |
parent | c19496f845a4adcd7e0f48f5dcb5b405bbc63dfc (diff) | |
parent | c4fd46398132a409d7947141094d7301c0f0af73 (diff) |
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>
8 files changed, 143 insertions, 15 deletions
diff --git a/crates/ra_parser/src/grammar/items.rs b/crates/ra_parser/src/grammar/items.rs index 67a924de5..9c14b954a 100644 --- a/crates/ra_parser/src/grammar/items.rs +++ b/crates/ra_parser/src/grammar/items.rs | |||
@@ -118,7 +118,17 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul | |||
118 | && p.at_contextual_kw("default") | 118 | && p.at_contextual_kw("default") |
119 | && (match p.nth(1) { | 119 | && (match p.nth(1) { |
120 | T![impl] => true, | 120 | 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] => { | ||
122 | if let ItemFlavor::Mod = flavor { | 132 | if let ItemFlavor::Mod = flavor { |
123 | true | 133 | true |
124 | } else { | 134 | } else { |
@@ -198,6 +208,9 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker, flavor: ItemFlavor) -> Resul | |||
198 | // default type T = Bar; | 208 | // default type T = Bar; |
199 | // default fn foo() {} | 209 | // default fn foo() {} |
200 | // } | 210 | // } |
211 | T![const] => { | ||
212 | consts::const_def(p, m); | ||
213 | } | ||
201 | 214 | ||
202 | // test unsafe_default_impl | 215 | // test unsafe_default_impl |
203 | // unsafe default impl Foo {} | 216 | // unsafe default impl Foo {} |
diff --git a/crates/ra_syntax/test_data/parser/err/0043_default_const.rast b/crates/ra_syntax/test_data/parser/err/0043_default_const.rast new file mode 100644 index 000000000..8eb583ef8 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/err/0043_default_const.rast | |||
@@ -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 | ||
diff --git a/crates/ra_syntax/test_data/parser/err/0043_default_const.rs b/crates/ra_syntax/test_data/parser/err/0043_default_const.rs new file mode 100644 index 000000000..80f15474a --- /dev/null +++ b/crates/ra_syntax/test_data/parser/err/0043_default_const.rs | |||
@@ -0,0 +1,3 @@ | |||
1 | trait T { | ||
2 | default const f: u8 = 0; | ||
3 | } | ||
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast b/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast index 9be441110..53f7ebaf9 100644 --- a/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast +++ b/crates/ra_syntax/test_data/parser/inline/err/0010_wrong_order_fns.rast | |||
@@ -17,23 +17,29 @@ SOURCE_FILE@0..50 | |||
17 | L_CURLY@22..23 "{" | 17 | L_CURLY@22..23 "{" |
18 | R_CURLY@23..24 "}" | 18 | R_CURLY@23..24 "}" |
19 | WHITESPACE@24..25 "\n" | 19 | WHITESPACE@24..25 "\n" |
20 | ERROR@25..31 | 20 | CONST_DEF@25..46 |
21 | UNSAFE_KW@25..31 "unsafe" | 21 | UNSAFE_KW@25..31 "unsafe" |
22 | WHITESPACE@31..32 " " | 22 | WHITESPACE@31..32 " " |
23 | FN_DEF@32..49 | ||
24 | CONST_KW@32..37 "const" | 23 | CONST_KW@32..37 "const" |
25 | WHITESPACE@37..38 " " | 24 | WHITESPACE@37..38 " " |
26 | FN_KW@38..40 "fn" | 25 | ERROR@38..40 |
26 | FN_KW@38..40 "fn" | ||
27 | WHITESPACE@40..41 " " | 27 | WHITESPACE@40..41 " " |
28 | NAME@41..44 | 28 | PATH_TYPE@41..46 |
29 | IDENT@41..44 "bar" | 29 | PATH@41..46 |
30 | PARAM_LIST@44..46 | 30 | PATH_SEGMENT@41..46 |
31 | L_PAREN@44..45 "(" | 31 | NAME_REF@41..44 |
32 | R_PAREN@45..46 ")" | 32 | IDENT@41..44 "bar" |
33 | WHITESPACE@46..47 " " | 33 | PARAM_LIST@44..46 |
34 | BLOCK_EXPR@47..49 | 34 | L_PAREN@44..45 "(" |
35 | L_CURLY@47..48 "{" | 35 | R_PAREN@45..46 ")" |
36 | R_CURLY@48..49 "}" | 36 | WHITESPACE@46..47 " " |
37 | ERROR@47..49 | ||
38 | L_CURLY@47..48 "{" | ||
39 | R_CURLY@48..49 "}" | ||
37 | WHITESPACE@49..50 "\n" | 40 | WHITESPACE@49..50 "\n" |
38 | error 6..6: expected existential, fn, trait or impl | 41 | 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 | ||
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast new file mode 100644 index 000000000..a9eda5668 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rast | |||
@@ -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" | ||
diff --git a/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rs b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rs new file mode 100644 index 000000000..ba0998ff4 --- /dev/null +++ b/crates/ra_syntax/test_data/parser/inline/ok/0163_default_unsafe_impl.rs | |||
@@ -0,0 +1 @@ | |||
default unsafe impl Foo {} | |||
diff --git a/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast new file mode 100644 index 000000000..dab0247ee --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rast | |||
@@ -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" | ||
diff --git a/crates/ra_syntax/test_data/parser/ok/0066_default_const.rs b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rs new file mode 100644 index 000000000..dfb3b92dc --- /dev/null +++ b/crates/ra_syntax/test_data/parser/ok/0066_default_const.rs | |||
@@ -0,0 +1,3 @@ | |||
1 | impl T for Foo { | ||
2 | default const f: u8 = 0; | ||
3 | } | ||