use rustc_middle::ty::ToPolyTraitRef;
use rustc_middle::ty::{self, DefIdTree, ToPredicate, Ty, TyCtxt, TypeVisitable};
use rustc_span::symbol::{kw, sym, Ident};
+use rustc_span::Symbol;
use rustc_span::{lev_distance, source_map, ExpnKind, FileName, MacroKind, Span};
use rustc_trait_selection::traits::error_reporting::on_unimplemented::InferCtxtExt as _;
use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _;
add a `use` for {one_of_them}:",
an = if candidates.len() == 1 { "an" } else { "" },
s = pluralize!(candidates.len()),
- were = if candidates.len() == 1 { "was" } else { "were" },
+ were = pluralize!("was", candidates.len()),
one_of_them = if candidates.len() == 1 { "it" } else { "one_of_them" },
);
self.suggest_use_candidates(&mut err, help, candidates);
Option<ObligationCause<'tcx>>,
)],
) {
- let mut derives = Vec::<(String, Span, String)>::new();
+ let mut derives = Vec::<(String, Span, Symbol)>::new();
let mut traits = Vec::<Span>::new();
for (pred, _, _) in unsatisfied_predicates {
let ty::PredicateKind::Trait(trait_pred) = pred.kind().skip_binder() else { continue };
derives.push((
self_name.clone(),
self_span,
- parent_diagnostic_name.to_string(),
+ parent_diagnostic_name,
));
}
}
}
- derives.push((self_name, self_span, diagnostic_name.to_string()));
+ derives.push((self_name, self_span, diagnostic_name));
} else {
traits.push(self.tcx.def_span(trait_pred.def_id()));
}
continue;
}
}
- derives_grouped.push((self_name, self_span, trait_name));
+ derives_grouped.push((self_name, self_span, trait_name.to_string()));
}
let len = traits.len();