Skip to content

Commit d86f9cd

Browse files
committed
Replace some bool params with an enum
1 parent 38b0865 commit d86f9cd

File tree

7 files changed

+63
-47
lines changed

7 files changed

+63
-47
lines changed

compiler/rustc_ast/src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ extern crate rustc_macros;
2929
extern crate tracing;
3030

3131
pub mod util {
32+
pub mod case;
3233
pub mod classify;
3334
pub mod comments;
3435
pub mod literal;

compiler/rustc_ast/src/token.rs

+4-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ pub use TokenKind::*;
55

66
use crate::ast;
77
use crate::ptr::P;
8+
use crate::util::case::Case;
89

910
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
1011
use rustc_data_structures::sync::Lrc;
@@ -618,10 +619,10 @@ impl Token {
618619
self.is_non_raw_ident_where(|id| id.name == kw)
619620
}
620621

621-
/// Returns `true` if the token is a given keyword, `kw` or if `case_insensitive` is true and this token is an identifier equal to `kw` ignoring the case.
622-
pub fn is_keyword_case(&self, kw: Symbol, case_insensitive: bool) -> bool {
622+
/// Returns `true` if the token is a given keyword, `kw` or if `case` is `Insensitive` and this token is an identifier equal to `kw` ignoring the case.
623+
pub fn is_keyword_case(&self, kw: Symbol, case: Case) -> bool {
623624
self.is_keyword(kw)
624-
|| (case_insensitive
625+
|| (case == Case::Insensitive
625626
&& self.is_non_raw_ident_where(|id| {
626627
id.name.as_str().to_lowercase() == kw.as_str().to_lowercase()
627628
}))

compiler/rustc_ast/src/util/case.rs

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/// Whatever to ignore case (`fn` vs `Fn` vs `FN`) or not. Used for recovering.
2+
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
3+
pub enum Case {
4+
Sensitive,
5+
Insensitive,
6+
}

compiler/rustc_parse/src/parser/expr.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use core::mem;
3333
use rustc_ast::ptr::P;
3434
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
3535
use rustc_ast::tokenstream::Spacing;
36+
use rustc_ast::util::case::Case;
3637
use rustc_ast::util::classify;
3738
use rustc_ast::util::literal::LitError;
3839
use rustc_ast::util::parser::{prec_let_scrutinee_needs_par, AssocOp, Fixity};
@@ -2024,7 +2025,7 @@ impl<'a> Parser<'a> {
20242025
if self.eat_keyword(kw::Static) { Movability::Static } else { Movability::Movable };
20252026

20262027
let asyncness = if self.token.uninterpolated_span().rust_2018() {
2027-
self.parse_asyncness(false)
2028+
self.parse_asyncness(Case::Sensitive)
20282029
} else {
20292030
Async::No
20302031
};

compiler/rustc_parse/src/parser/item.rs

+34-29
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rustc_ast::ast::*;
88
use rustc_ast::ptr::P;
99
use rustc_ast::token::{self, Delimiter, TokenKind};
1010
use rustc_ast::tokenstream::{DelimSpan, TokenStream, TokenTree};
11+
use rustc_ast::util::case::Case;
1112
use rustc_ast::{self as ast, AttrVec, Attribute, DUMMY_NODE_ID};
1213
use rustc_ast::{Async, Const, Defaultness, IsAuto, Mutability, Unsafe, UseTree, UseTreeKind};
1314
use rustc_ast::{BindingAnnotation, Block, FnDecl, FnSig, Param, SelfKind};
@@ -34,7 +35,7 @@ impl<'a> Parser<'a> {
3435

3536
/// Parses a `mod <foo> { ... }` or `mod <foo>;` item.
3637
fn parse_item_mod(&mut self, attrs: &mut AttrVec) -> PResult<'a, ItemInfo> {
37-
let unsafety = self.parse_unsafety(false);
38+
let unsafety = self.parse_unsafety(Case::Sensitive);
3839
self.expect_keyword(kw::Mod)?;
3940
let id = self.parse_ident()?;
4041
let mod_kind = if self.eat(&token::Semi) {
@@ -150,7 +151,7 @@ impl<'a> Parser<'a> {
150151
&vis,
151152
&mut def,
152153
fn_parse_mode,
153-
false,
154+
Case::Sensitive,
154155
)?;
155156
if let Some((ident, kind)) = kind {
156157
self.error_on_unconsumed_default(def, &kind);
@@ -212,14 +213,14 @@ impl<'a> Parser<'a> {
212213
vis: &Visibility,
213214
def: &mut Defaultness,
214215
fn_parse_mode: FnParseMode,
215-
kw_case_insensitive: bool,
216+
case: Case,
216217
) -> PResult<'a, Option<ItemInfo>> {
217218
let def_final = def == &Defaultness::Final;
218219
let mut def_ = || mem::replace(def, Defaultness::Final);
219220

220-
let info = if self.eat_keyword_case(kw::Use, kw_case_insensitive) {
221+
let info = if self.eat_keyword_case(kw::Use, case) {
221222
self.parse_use_item()?
222-
} else if self.check_fn_front_matter(def_final, kw_case_insensitive) {
223+
} else if self.check_fn_front_matter(def_final, case) {
223224
// FUNCTION ITEM
224225
let (ident, sig, generics, body) = self.parse_fn(attrs, fn_parse_mode, lo, vis)?;
225226
(ident, ItemKind::Fn(Box::new(Fn { defaultness: def_(), sig, generics, body })))
@@ -233,7 +234,7 @@ impl<'a> Parser<'a> {
233234
}
234235
} else if self.is_unsafe_foreign_mod() {
235236
// EXTERN BLOCK
236-
let unsafety = self.parse_unsafety(false);
237+
let unsafety = self.parse_unsafety(Case::Sensitive);
237238
self.expect_keyword(kw::Extern)?;
238239
self.parse_item_foreign_mod(attrs, unsafety)?
239240
} else if self.is_static_global() {
@@ -242,7 +243,7 @@ impl<'a> Parser<'a> {
242243
let m = self.parse_mutability();
243244
let (ident, ty, expr) = self.parse_item_global(Some(m))?;
244245
(ident, ItemKind::Static(ty, m, expr))
245-
} else if let Const::Yes(const_span) = self.parse_constness(false) {
246+
} else if let Const::Yes(const_span) = self.parse_constness(Case::Sensitive) {
246247
// CONST ITEM
247248
if self.token.is_keyword(kw::Impl) {
248249
// recover from `const impl`, suggest `impl const`
@@ -294,11 +295,19 @@ impl<'a> Parser<'a> {
294295
} else if self.isnt_macro_invocation() && vis.kind.is_pub() {
295296
self.recover_missing_kw_before_item()?;
296297
return Ok(None);
297-
} else if self.isnt_macro_invocation() && !kw_case_insensitive {
298+
} else if self.isnt_macro_invocation() && case == Case::Sensitive {
298299
_ = def_;
299300

300301
// Recover wrong cased keywords
301-
return self.parse_item_kind(attrs, macros_allowed, lo, vis, def, fn_parse_mode, true);
302+
return self.parse_item_kind(
303+
attrs,
304+
macros_allowed,
305+
lo,
306+
vis,
307+
def,
308+
fn_parse_mode,
309+
Case::Insensitive,
310+
);
302311
} else if macros_allowed && self.check_path() {
303312
// MACRO INVOCATION ITEM
304313
(Ident::empty(), ItemKind::MacCall(P(self.parse_item_macro(vis)?)))
@@ -551,7 +560,7 @@ impl<'a> Parser<'a> {
551560
attrs: &mut AttrVec,
552561
defaultness: Defaultness,
553562
) -> PResult<'a, ItemInfo> {
554-
let unsafety = self.parse_unsafety(false);
563+
let unsafety = self.parse_unsafety(Case::Sensitive);
555564
self.expect_keyword(kw::Impl)?;
556565

557566
// First, parse generic parameters if necessary.
@@ -565,7 +574,7 @@ impl<'a> Parser<'a> {
565574
generics
566575
};
567576

568-
let constness = self.parse_constness(false);
577+
let constness = self.parse_constness(Case::Sensitive);
569578
if let Const::Yes(span) = constness {
570579
self.sess.gated_spans.gate(sym::const_trait_impl, span);
571580
}
@@ -809,7 +818,7 @@ impl<'a> Parser<'a> {
809818

810819
/// Parses `unsafe? auto? trait Foo { ... }` or `trait Foo = Bar;`.
811820
fn parse_item_trait(&mut self, attrs: &mut AttrVec, lo: Span) -> PResult<'a, ItemInfo> {
812-
let unsafety = self.parse_unsafety(false);
821+
let unsafety = self.parse_unsafety(Case::Sensitive);
813822
// Parse optional `auto` prefix.
814823
let is_auto = if self.eat_keyword(kw::Auto) { IsAuto::Yes } else { IsAuto::No };
815824

@@ -1758,7 +1767,7 @@ impl<'a> Parser<'a> {
17581767
let (ident, is_raw) = self.ident_or_err()?;
17591768
if !is_raw && ident.is_reserved() {
17601769
let snapshot = self.create_snapshot_for_diagnostic();
1761-
let err = if self.check_fn_front_matter(false, false) {
1770+
let err = if self.check_fn_front_matter(false, Case::Sensitive) {
17621771
let inherited_vis = Visibility {
17631772
span: rustc_span::DUMMY_SP,
17641773
kind: VisibilityKind::Inherited,
@@ -2147,11 +2156,7 @@ impl<'a> Parser<'a> {
21472156
///
21482157
/// `check_pub` adds additional `pub` to the checks in case users place it
21492158
/// wrongly, can be used to ensure `pub` never comes after `default`.
2150-
pub(super) fn check_fn_front_matter(
2151-
&mut self,
2152-
check_pub: bool,
2153-
kw_case_insensitive: bool,
2154-
) -> bool {
2159+
pub(super) fn check_fn_front_matter(&mut self, check_pub: bool, case: Case) -> bool {
21552160
// We use an over-approximation here.
21562161
// `const const`, `fn const` won't parse, but we're not stepping over other syntax either.
21572162
// `pub` is added in case users got confused with the ordering like `async pub fn`,
@@ -2161,12 +2166,12 @@ impl<'a> Parser<'a> {
21612166
} else {
21622167
&[kw::Const, kw::Async, kw::Unsafe, kw::Extern]
21632168
};
2164-
self.check_keyword_case(kw::Fn, kw_case_insensitive) // Definitely an `fn`.
2169+
self.check_keyword_case(kw::Fn, case) // Definitely an `fn`.
21652170
// `$qual fn` or `$qual $qual`:
2166-
|| quals.iter().any(|&kw| self.check_keyword_case(kw, kw_case_insensitive))
2171+
|| quals.iter().any(|&kw| self.check_keyword_case(kw, case))
21672172
&& self.look_ahead(1, |t| {
21682173
// `$qual fn`, e.g. `const fn` or `async fn`.
2169-
t.is_keyword_case(kw::Fn, kw_case_insensitive)
2174+
t.is_keyword_case(kw::Fn, case)
21702175
// Two qualifiers `$qual $qual` is enough, e.g. `async unsafe`.
21712176
|| (
21722177
(
@@ -2175,16 +2180,16 @@ impl<'a> Parser<'a> {
21752180
// Rule out 2015 `const async: T = val`.
21762181
&& i.is_reserved()
21772182
)
2178-
|| kw_case_insensitive
2183+
|| case == Case::Insensitive
21792184
&& t.is_non_raw_ident_where(|i| quals.iter().any(|qual| qual.as_str() == i.name.as_str().to_lowercase()))
21802185
)
21812186
// Rule out unsafe extern block.
21822187
&& !self.is_unsafe_foreign_mod())
21832188
})
21842189
// `extern ABI fn`
2185-
|| self.check_keyword_case(kw::Extern, kw_case_insensitive)
2190+
|| self.check_keyword_case(kw::Extern, case)
21862191
&& self.look_ahead(1, |t| t.can_begin_literal_maybe_minus())
2187-
&& self.look_ahead(2, |t| t.is_keyword_case(kw::Fn, kw_case_insensitive))
2192+
&& self.look_ahead(2, |t| t.is_keyword_case(kw::Fn, case))
21882193
}
21892194

21902195
/// Parses all the "front matter" (or "qualifiers") for a `fn` declaration,
@@ -2200,22 +2205,22 @@ impl<'a> Parser<'a> {
22002205
/// `Visibility::Inherited` when no visibility is known.
22012206
pub(super) fn parse_fn_front_matter(&mut self, orig_vis: &Visibility) -> PResult<'a, FnHeader> {
22022207
let sp_start = self.token.span;
2203-
let constness = self.parse_constness(true);
2208+
let constness = self.parse_constness(Case::Insensitive);
22042209

22052210
let async_start_sp = self.token.span;
2206-
let asyncness = self.parse_asyncness(true);
2211+
let asyncness = self.parse_asyncness(Case::Insensitive);
22072212

22082213
let unsafe_start_sp = self.token.span;
2209-
let unsafety = self.parse_unsafety(true);
2214+
let unsafety = self.parse_unsafety(Case::Insensitive);
22102215

22112216
let ext_start_sp = self.token.span;
2212-
let ext = self.parse_extern(true);
2217+
let ext = self.parse_extern(Case::Insensitive);
22132218

22142219
if let Async::Yes { span, .. } = asyncness {
22152220
self.ban_async_in_2015(span);
22162221
}
22172222

2218-
if !self.eat_keyword_case(kw::Fn, true) {
2223+
if !self.eat_keyword_case(kw::Fn, Case::Insensitive) {
22192224
// It is possible for `expect_one_of` to recover given the contents of
22202225
// `self.expected_tokens`, therefore, do not use `self.unexpected()` which doesn't
22212226
// account for this.

compiler/rustc_parse/src/parser/mod.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ use rustc_ast::token::{self, Delimiter, Nonterminal, Token, TokenKind};
2222
use rustc_ast::tokenstream::AttributesData;
2323
use rustc_ast::tokenstream::{self, DelimSpan, Spacing};
2424
use rustc_ast::tokenstream::{TokenStream, TokenTree};
25+
use rustc_ast::util::case::Case;
2526
use rustc_ast::AttrId;
2627
use rustc_ast::DUMMY_NODE_ID;
2728
use rustc_ast::{self as ast, AnonConst, AttrStyle, AttrVec, Const, Extern};
@@ -604,12 +605,12 @@ impl<'a> Parser<'a> {
604605
self.token.is_keyword(kw)
605606
}
606607

607-
fn check_keyword_case(&mut self, kw: Symbol, case_insensitive: bool) -> bool {
608+
fn check_keyword_case(&mut self, kw: Symbol, case: Case) -> bool {
608609
if self.check_keyword(kw) {
609610
return true;
610611
}
611612

612-
if case_insensitive
613+
if case == Case::Insensitive
613614
&& let Some((ident, /* is_raw */ false)) = self.token.ident()
614615
&& ident.as_str().to_lowercase() == kw.as_str().to_lowercase() {
615616
true
@@ -633,12 +634,12 @@ impl<'a> Parser<'a> {
633634
/// Eats a keyword, optionally ignoring the case.
634635
/// If the case differs (and is ignored) an error is issued.
635636
/// This is useful for recovery.
636-
fn eat_keyword_case(&mut self, kw: Symbol, case_insensitive: bool) -> bool {
637+
fn eat_keyword_case(&mut self, kw: Symbol, case: Case) -> bool {
637638
if self.eat_keyword(kw) {
638639
return true;
639640
}
640641

641-
if case_insensitive
642+
if case == Case::Insensitive
642643
&& let Some((ident, /* is_raw */ false)) = self.token.ident()
643644
&& ident.as_str().to_lowercase() == kw.as_str().to_lowercase() {
644645
self
@@ -1136,8 +1137,8 @@ impl<'a> Parser<'a> {
11361137
}
11371138

11381139
/// Parses asyncness: `async` or nothing.
1139-
fn parse_asyncness(&mut self, case_insensitive: bool) -> Async {
1140-
if self.eat_keyword_case(kw::Async, case_insensitive) {
1140+
fn parse_asyncness(&mut self, case: Case) -> Async {
1141+
if self.eat_keyword_case(kw::Async, case) {
11411142
let span = self.prev_token.uninterpolated_span();
11421143
Async::Yes { span, closure_id: DUMMY_NODE_ID, return_impl_trait_id: DUMMY_NODE_ID }
11431144
} else {
@@ -1146,19 +1147,19 @@ impl<'a> Parser<'a> {
11461147
}
11471148

11481149
/// Parses unsafety: `unsafe` or nothing.
1149-
fn parse_unsafety(&mut self, case_insensitive: bool) -> Unsafe {
1150-
if self.eat_keyword_case(kw::Unsafe, case_insensitive) {
1150+
fn parse_unsafety(&mut self, case: Case) -> Unsafe {
1151+
if self.eat_keyword_case(kw::Unsafe, case) {
11511152
Unsafe::Yes(self.prev_token.uninterpolated_span())
11521153
} else {
11531154
Unsafe::No
11541155
}
11551156
}
11561157

11571158
/// Parses constness: `const` or nothing.
1158-
fn parse_constness(&mut self, case_insensitive: bool) -> Const {
1159+
fn parse_constness(&mut self, case: Case) -> Const {
11591160
// Avoid const blocks to be parsed as const items
11601161
if self.look_ahead(1, |t| t != &token::OpenDelim(Delimiter::Brace))
1161-
&& self.eat_keyword_case(kw::Const, case_insensitive)
1162+
&& self.eat_keyword_case(kw::Const, case)
11621163
{
11631164
Const::Yes(self.prev_token.uninterpolated_span())
11641165
} else {
@@ -1413,8 +1414,8 @@ impl<'a> Parser<'a> {
14131414
}
14141415

14151416
/// Parses `extern string_literal?`.
1416-
fn parse_extern(&mut self, case_insensitive: bool) -> Extern {
1417-
if self.eat_keyword_case(kw::Extern, case_insensitive) {
1417+
fn parse_extern(&mut self, case: Case) -> Extern {
1418+
if self.eat_keyword_case(kw::Extern, case) {
14181419
let mut extern_span = self.prev_token.span;
14191420
let abi = self.parse_abi();
14201421
if let Some(abi) = abi {

compiler/rustc_parse/src/parser/ty.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
44

55
use rustc_ast::ptr::P;
66
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
7+
use rustc_ast::util::case::Case;
78
use rustc_ast::{
89
self as ast, BareFnTy, FnRetTy, GenericBound, GenericBounds, GenericParam, Generics, Lifetime,
910
MacCall, MutTy, Mutability, PolyTraitRef, TraitBoundModifier, TraitObjectSyntax, Ty, TyKind,
@@ -267,15 +268,15 @@ impl<'a> Parser<'a> {
267268
} else if self.eat_keyword(kw::Underscore) {
268269
// A type to be inferred `_`
269270
TyKind::Infer
270-
} else if self.check_fn_front_matter(false, false) {
271+
} else if self.check_fn_front_matter(false, Case::Sensitive) {
271272
// Function pointer type
272273
self.parse_ty_bare_fn(lo, Vec::new(), recover_return_sign)?
273274
} else if self.check_keyword(kw::For) {
274275
// Function pointer type or bound list (trait object type) starting with a poly-trait.
275276
// `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T`
276277
// `for<'lt> Trait1<'lt> + Trait2 + 'a`
277278
let lifetime_defs = self.parse_late_bound_lifetime_defs()?;
278-
if self.check_fn_front_matter(false, false) {
279+
if self.check_fn_front_matter(false, Case::Sensitive) {
279280
self.parse_ty_bare_fn(lo, lifetime_defs, recover_return_sign)?
280281
} else {
281282
let path = self.parse_path(PathStyle::Type)?;

0 commit comments

Comments
 (0)