diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index 4842f7ef4b9a9..f0eb27c90025c 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -20,6 +20,12 @@ macro_rules! pluralize { ($x:expr) => { if $x != 1 { "s" } else { "" } }; + ("is", $x:expr) => { + if $x == 1 { "is" } else { "are" } + }; + ("this", $x:expr) => { + if $x == 1 { "this" } else { "these" } + }; } /// Indicates the confidence in the correctness of a suggestion. diff --git a/compiler/rustc_middle/src/mir/interpret/error.rs b/compiler/rustc_middle/src/mir/interpret/error.rs index c978659047698..2c3c61259c473 100644 --- a/compiler/rustc_middle/src/mir/interpret/error.rs +++ b/compiler/rustc_middle/src/mir/interpret/error.rs @@ -400,7 +400,7 @@ impl fmt::Display for UndefinedBehaviorInfo<'_> { Pointer::new(*alloc, access.access_offset), access.uninit_size.bytes(), pluralize!(access.uninit_size.bytes()), - if access.uninit_size.bytes() != 1 { "are" } else { "is" }, + pluralize!("is", access.uninit_size.bytes()), Pointer::new(*alloc, access.uninit_offset), ), InvalidUninitBytes(None) => write!( diff --git a/compiler/rustc_middle/src/ty/error.rs b/compiler/rustc_middle/src/ty/error.rs index 599845bae79f3..3aad189b222ea 100644 --- a/compiler/rustc_middle/src/ty/error.rs +++ b/compiler/rustc_middle/src/ty/error.rs @@ -847,7 +847,7 @@ fn foo(&self) -> Self::T { String::new() } "{some} method{s} {are} available that return{r} `{ty}`", some = if methods.len() == 1 { "a" } else { "some" }, s = pluralize!(methods.len()), - are = if methods.len() == 1 { "is" } else { "are" }, + are = pluralize!("is", methods.len()), r = if methods.len() == 1 { "s" } else { "" }, ty = expected ); diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 01b12eec628ec..06184b4797255 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -1410,7 +1410,7 @@ impl CheckAttrVisitor<'_> { span, format!( "there {} only {} argument{}", - if arg_count != 1 { "are" } else { "is" }, + pluralize!("is", arg_count), arg_count, pluralize!(arg_count) ), diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index 9e38428660e2a..8dec28c8ae283 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -504,9 +504,9 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { for sp in spans { let msg = if sp == last_bound_span { format!( - "...because of {} bound{}", - if bounds.len() <= 2 { "this" } else { "these" }, - if bounds.len() <= 2 { "" } else { "s" }, + "...because of {these} bound{s}", + these = pluralize!("this", bounds.len() - 1), + s = pluralize!(bounds.len() - 1), ) } else { String::new() diff --git a/compiler/rustc_typeck/src/check/pat.rs b/compiler/rustc_typeck/src/check/pat.rs index a264ee5d1475d..c16be38d5fc3d 100644 --- a/compiler/rustc_typeck/src/check/pat.rs +++ b/compiler/rustc_typeck/src/check/pat.rs @@ -1761,7 +1761,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { sp, &format!( "include the missing field{} in the pattern{}", - if len == 1 { "" } else { "s" }, + pluralize!(len), if have_inaccessible_fields { " and ignore the inaccessible fields" } else { "" } ), format!( @@ -1780,10 +1780,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { err.span_suggestion( sp, &format!( - "if you don't care about {} missing field{}, you can explicitly ignore {}", - if len == 1 { "this" } else { "these" }, - if len == 1 { "" } else { "s" }, - if len == 1 { "it" } else { "them" }, + "if you don't care about {these} missing field{s}, you can explicitly ignore {them}", + these = pluralize!("this", len), + s = pluralize!(len), + them = if len == 1 { "it" } else { "them" }, ), format!("{}..{}", prefix, postfix), Applicability::MachineApplicable, diff --git a/compiler/rustc_typeck/src/coherence/inherent_impls.rs b/compiler/rustc_typeck/src/coherence/inherent_impls.rs index 59c252dec0505..303ec910a9f09 100644 --- a/compiler/rustc_typeck/src/coherence/inherent_impls.rs +++ b/compiler/rustc_typeck/src/coherence/inherent_impls.rs @@ -7,7 +7,7 @@ //! `tcx.inherent_impls(def_id)`). That value, however, //! is computed by selecting an idea from this table. -use rustc_errors::struct_span_err; +use rustc_errors::{pluralize, struct_span_err}; use rustc_hir as hir; use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::itemlikevisit::ItemLikeVisitor; @@ -410,7 +410,6 @@ impl<'tcx> InherentCollect<'tcx> { let to_implement = if assoc_items.is_empty() { String::new() } else { - let plural = assoc_items.len() > 1; let assoc_items_kind = { let item_types = assoc_items.iter().map(|x| x.kind); if item_types.clone().all(|x| x == hir::AssocItemKind::Const) { @@ -427,9 +426,9 @@ impl<'tcx> InherentCollect<'tcx> { format!( " to implement {} {}{}", - if plural { "these" } else { "this" }, + pluralize!("this", assoc_items.len()), assoc_items_kind, - if plural { "s" } else { "" } + pluralize!(assoc_items.len()), ) }; diff --git a/compiler/rustc_typeck/src/structured_errors/wrong_number_of_generic_args.rs b/compiler/rustc_typeck/src/structured_errors/wrong_number_of_generic_args.rs index 4a11771df493f..05b57592572a9 100644 --- a/compiler/rustc_typeck/src/structured_errors/wrong_number_of_generic_args.rs +++ b/compiler/rustc_typeck/src/structured_errors/wrong_number_of_generic_args.rs @@ -657,10 +657,9 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> { let num_redundant_lt_args = lt_arg_spans.len() - self.num_expected_lifetime_args(); let msg_lifetimes = format!( - "remove {} {} argument{}", - if num_redundant_lt_args == 1 { "this" } else { "these" }, - "lifetime", - pluralize!(num_redundant_lt_args), + "remove {these} lifetime argument{s}", + these = pluralize!("this", num_redundant_lt_args), + s = pluralize!(num_redundant_lt_args), ); err.span_suggestion( @@ -700,10 +699,9 @@ impl<'a, 'tcx> WrongNumberOfGenericArgs<'a, 'tcx> { let num_redundant_gen_args = gen_arg_spans.len() - self.num_expected_type_or_const_args(); let msg_types_or_consts = format!( - "remove {} {} argument{}", - if num_redundant_gen_args == 1 { "this" } else { "these" }, - "generic", - pluralize!(num_redundant_type_or_const_args), + "remove {these} generic argument{s}", + these = pluralize!("this", num_redundant_gen_args), + s = pluralize!(num_redundant_gen_args), ); err.span_suggestion(