Support interpolated block for try and async

This commit is contained in:
Michael Goulet 2023-06-23 05:31:14 +00:00
parent 8164cdb9ee
commit 7b962d7543
3 changed files with 45 additions and 4 deletions

View File

@ -3003,7 +3003,8 @@ fn parse_try_block(&mut self, span_lo: Span) -> PResult<'a, P<Expr>> {
fn is_do_catch_block(&self) -> bool {
self.token.is_keyword(kw::Do)
&& self.is_keyword_ahead(1, &[kw::Catch])
&& self.look_ahead(2, |t| *t == token::OpenDelim(Delimiter::Brace))
&& self
.look_ahead(2, |t| *t == token::OpenDelim(Delimiter::Brace) || t.is_whole_block())
&& !self.restrictions.contains(Restrictions::NO_STRUCT_LITERAL)
}
@ -3013,7 +3014,8 @@ fn is_do_yeet(&self) -> bool {
fn is_try_block(&self) -> bool {
self.token.is_keyword(kw::Try)
&& self.look_ahead(1, |t| *t == token::OpenDelim(Delimiter::Brace))
&& self
.look_ahead(1, |t| *t == token::OpenDelim(Delimiter::Brace) || t.is_whole_block())
&& self.token.uninterpolated_span().at_least_rust_2018()
}
@ -3032,10 +3034,14 @@ fn is_async_block(&self) -> bool {
&& ((
// `async move {`
self.is_keyword_ahead(1, &[kw::Move])
&& self.look_ahead(2, |t| *t == token::OpenDelim(Delimiter::Brace))
&& self.look_ahead(2, |t| {
*t == token::OpenDelim(Delimiter::Brace) || t.is_whole_block()
})
) || (
// `async {`
self.look_ahead(1, |t| *t == token::OpenDelim(Delimiter::Brace))
self.look_ahead(1, |t| {
*t == token::OpenDelim(Delimiter::Brace) || t.is_whole_block()
})
))
}

View File

@ -0,0 +1,16 @@
// check-pass
// edition:2021
macro_rules! create_async {
($body:block) => {
async $body
};
}
async fn other() {}
fn main() {
let y = create_async! {{
other().await;
}};
}

View File

@ -0,0 +1,19 @@
// check-pass
// edition:2021
#![feature(try_blocks)]
macro_rules! create_try {
($body:block) => {
try $body
};
}
fn main() {
let x: Option<&str> = create_try! {{
None?;
"Hello world"
}};
println!("{x:?}");
}