Support interpolated block for try and async
This commit is contained in:
parent
8164cdb9ee
commit
7b962d7543
@ -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()
|
||||
})
|
||||
))
|
||||
}
|
||||
|
||||
|
16
tests/ui/parser/async-with-nonterminal-block.rs
Normal file
16
tests/ui/parser/async-with-nonterminal-block.rs
Normal 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;
|
||||
}};
|
||||
}
|
19
tests/ui/parser/try-with-nonterminal-block.rs
Normal file
19
tests/ui/parser/try-with-nonterminal-block.rs
Normal 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:?}");
|
||||
}
|
Loading…
Reference in New Issue
Block a user