Introduce can_begin_string_literal.

We currently use `can_begin_literal_maybe_minus` in a couple of places
where only string literals are allowed. This commit introduces a
more specific function, which makes things clearer. It doesn't change
behaviour because the two functions affected (`is_unsafe_foreign_mod`
and `check_keyword_case`) are always followed by a call to `parse_abi`,
which checks again for a string literal.
This commit is contained in:
Nicholas Nethercote 2024-06-13 13:52:20 +10:00
parent 7d9a92ba31
commit c6f78270b6
2 changed files with 17 additions and 2 deletions

View File

@ -621,6 +621,21 @@ pub fn can_begin_literal_maybe_minus(&self) -> bool {
} }
} }
pub fn can_begin_string_literal(&self) -> bool {
match self.uninterpolate().kind {
Literal(..) => true,
Interpolated(ref nt) => match &**nt {
NtLiteral(_) => true,
NtExpr(e) => match &e.kind {
ast::ExprKind::Lit(_) => true,
_ => false,
},
_ => false,
},
_ => false,
}
}
/// A convenience function for matching on identifiers during parsing. /// A convenience function for matching on identifiers during parsing.
/// Turns interpolated identifier (`$i: ident`) or lifetime (`$l: lifetime`) token /// Turns interpolated identifier (`$i: ident`) or lifetime (`$l: lifetime`) token
/// into the regular identifier or lifetime token it refers to, /// into the regular identifier or lifetime token it refers to,

View File

@ -1259,7 +1259,7 @@ fn is_unsafe_foreign_mod(&self) -> bool {
self.token.is_keyword(kw::Unsafe) self.token.is_keyword(kw::Unsafe)
&& self.is_keyword_ahead(1, &[kw::Extern]) && self.is_keyword_ahead(1, &[kw::Extern])
&& self.look_ahead( && self.look_ahead(
2 + self.look_ahead(2, |t| t.can_begin_literal_maybe_minus() as usize), 2 + self.look_ahead(2, |t| t.can_begin_string_literal() as usize),
|t| t.kind == token::OpenDelim(Delimiter::Brace), |t| t.kind == token::OpenDelim(Delimiter::Brace),
) )
} }
@ -2448,7 +2448,7 @@ pub(super) fn check_fn_front_matter(&mut self, check_pub: bool, case: Case) -> b
}) })
// `extern ABI fn` // `extern ABI fn`
|| self.check_keyword_case(kw::Extern, case) || self.check_keyword_case(kw::Extern, case)
&& self.look_ahead(1, |t| t.can_begin_literal_maybe_minus()) && self.look_ahead(1, |t| t.can_begin_string_literal())
&& (self.look_ahead(2, |t| t.is_keyword_case(kw::Fn, case)) || && (self.look_ahead(2, |t| t.is_keyword_case(kw::Fn, case)) ||
// this branch is only for better diagnostic in later, `pub` is not allowed here // this branch is only for better diagnostic in later, `pub` is not allowed here
(self.may_recover() (self.may_recover()