1
Fork 0

Avoid producing NoDelim values in MacArgs::delim().

This commit is contained in:
Nicholas Nethercote 2022-04-26 15:21:15 +10:00
parent f0bbc782ac
commit 6b367a0532
4 changed files with 44 additions and 38 deletions

View file

@ -1542,10 +1542,10 @@ pub enum MacArgs {
} }
impl MacArgs { impl MacArgs {
pub fn delim(&self) -> DelimToken { pub fn delim(&self) -> Option<DelimToken> {
match self { match self {
MacArgs::Delimited(_, delim, _) => delim.to_token(), MacArgs::Delimited(_, delim, _) => Some(delim.to_token()),
MacArgs::Empty | MacArgs::Eq(..) => token::NoDelim, MacArgs::Empty | MacArgs::Eq(..) => None,
} }
} }

View file

@ -464,7 +464,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
Some(MacHeader::Path(&item.path)), Some(MacHeader::Path(&item.path)),
false, false,
None, None,
delim.to_token(), Some(delim.to_token()),
tokens, tokens,
true, true,
span, span,
@ -530,7 +530,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
None, None,
false, false,
None, None,
*delim, Some(*delim),
tts, tts,
convert_dollar_crate, convert_dollar_crate,
dspan.entire(), dspan.entire(),
@ -556,12 +556,12 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
header: Option<MacHeader<'_>>, header: Option<MacHeader<'_>>,
has_bang: bool, has_bang: bool,
ident: Option<Ident>, ident: Option<Ident>,
delim: DelimToken, delim: Option<DelimToken>,
tts: &TokenStream, tts: &TokenStream,
convert_dollar_crate: bool, convert_dollar_crate: bool,
span: Span, span: Span,
) { ) {
if delim == DelimToken::Brace { if delim == Some(DelimToken::Brace) {
self.cbox(INDENT_UNIT); self.cbox(INDENT_UNIT);
} }
match header { match header {
@ -577,7 +577,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
self.print_ident(ident); self.print_ident(ident);
} }
match delim { match delim {
DelimToken::Brace => { Some(DelimToken::Brace) => {
if header.is_some() || has_bang || ident.is_some() { if header.is_some() || has_bang || ident.is_some() {
self.nbsp(); self.nbsp();
} }
@ -585,23 +585,25 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
if !tts.is_empty() { if !tts.is_empty() {
self.space(); self.space();
} }
}
_ => {
let token_str = self.token_kind_to_string(&token::OpenDelim(delim));
self.word(token_str)
}
}
self.ibox(0); self.ibox(0);
self.print_tts(tts, convert_dollar_crate); self.print_tts(tts, convert_dollar_crate);
self.end(); self.end();
match delim {
DelimToken::Brace => {
let empty = tts.is_empty(); let empty = tts.is_empty();
self.bclose(span, empty); self.bclose(span, empty);
} }
_ => { Some(delim) => {
let token_str = self.token_kind_to_string(&token::OpenDelim(delim));
self.word(token_str);
self.ibox(0);
self.print_tts(tts, convert_dollar_crate);
self.end();
let token_str = self.token_kind_to_string(&token::CloseDelim(delim)); let token_str = self.token_kind_to_string(&token::CloseDelim(delim));
self.word(token_str) self.word(token_str);
}
None => {
self.ibox(0);
self.print_tts(tts, convert_dollar_crate);
self.end();
} }
} }
} }

View file

@ -164,13 +164,17 @@ impl<'a> Parser<'a> {
let delim = args.delim(); let delim = args.delim();
let hi = self.prev_token.span; let hi = self.prev_token.span;
let style = let style = match delim {
if delim == token::Brace { MacStmtStyle::Braces } else { MacStmtStyle::NoBraces }; Some(token::Brace) => MacStmtStyle::Braces,
Some(_) => MacStmtStyle::NoBraces,
None => unreachable!(),
};
let mac = MacCall { path, args, prior_type_ascription: self.last_type_ascription }; let mac = MacCall { path, args, prior_type_ascription: self.last_type_ascription };
let kind = let kind = if (style == MacStmtStyle::Braces
if (delim == token::Brace && self.token != token::Dot && self.token != token::Question) && self.token != token::Dot
&& self.token != token::Question)
|| self.token == token::Semi || self.token == token::Semi
|| self.token == token::Eof || self.token == token::Eof
{ {

View file

@ -1325,7 +1325,7 @@ pub(crate) fn can_be_overflowed_expr(
} }
ast::ExprKind::MacCall(ref mac) => { ast::ExprKind::MacCall(ref mac) => {
match ( match (
rustc_ast::ast::MacDelimiter::from_token(mac.args.delim()), rustc_ast::ast::MacDelimiter::from_token(mac.args.delim().unwrap()),
context.config.overflow_delimited_expr(), context.config.overflow_delimited_expr(),
) { ) {
(Some(ast::MacDelimiter::Bracket), true) (Some(ast::MacDelimiter::Bracket), true)