diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-02-16 14:16:47 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2021-02-16 14:16:47 +0000 |
commit | b7a6d830beaa2669f6ddff3167eb94b941e73339 (patch) | |
tree | 623696cb6b985de75ddcf3809feba421a19128c6 /crates/parser/src/grammar | |
parent | 88e8b0a5fa17075475c75941932056f7289c5bcf (diff) | |
parent | 95d239da99cb1b7ba60f5f20f6df54e1397a1bca (diff) |
Merge #7687
7687: Specialization for async traits r=matklad a=arnaudgolfouse
Fixes #7669.
Adapting the parser seemed to be all that was needed, but I am not very experienced with the codebase. Is this enough ?
Co-authored-by: Arnaud <[email protected]>
Diffstat (limited to 'crates/parser/src/grammar')
-rw-r--r-- | crates/parser/src/grammar/items.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/crates/parser/src/grammar/items.rs b/crates/parser/src/grammar/items.rs index 1d894e907..adec74ef3 100644 --- a/crates/parser/src/grammar/items.rs +++ b/crates/parser/src/grammar/items.rs | |||
@@ -83,6 +83,7 @@ pub(super) fn item_or_macro(p: &mut Parser, stop_on_r_curly: bool) { | |||
83 | } | 83 | } |
84 | } | 84 | } |
85 | 85 | ||
86 | /// Try to parse an item, completing `m` in case of success. | ||
86 | pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> { | 87 | pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> { |
87 | // test_err pub_expr | 88 | // test_err pub_expr |
88 | // fn foo() { pub 92; } | 89 | // fn foo() { pub 92; } |
@@ -143,6 +144,33 @@ pub(super) fn maybe_item(p: &mut Parser, m: Marker) -> Result<(), Marker> { | |||
143 | has_mods = true; | 144 | has_mods = true; |
144 | } | 145 | } |
145 | } | 146 | } |
147 | T![async] => { | ||
148 | // test default_async_fn | ||
149 | // impl T for Foo { | ||
150 | // default async fn foo() {} | ||
151 | // } | ||
152 | |||
153 | // test default_async_unsafe_fn | ||
154 | // impl T for Foo { | ||
155 | // default async unsafe fn foo() {} | ||
156 | // } | ||
157 | let mut maybe_fn = p.nth(2); | ||
158 | let is_unsafe = if matches!(maybe_fn, T![unsafe]) { | ||
159 | maybe_fn = p.nth(3); | ||
160 | true | ||
161 | } else { | ||
162 | false | ||
163 | }; | ||
164 | |||
165 | if matches!(maybe_fn, T![fn]) { | ||
166 | p.bump_remap(T![default]); | ||
167 | p.bump(T![async]); | ||
168 | if is_unsafe { | ||
169 | p.bump(T![unsafe]) | ||
170 | } | ||
171 | has_mods = true; | ||
172 | } | ||
173 | } | ||
146 | _ => (), | 174 | _ => (), |
147 | } | 175 | } |
148 | } | 176 | } |