Auto merge of #94131 - Mark-Simulacrum:fmt-string, r=oli-obk
Always format to internal String in FmtPrinter This avoids monomorphizing for different parameters, decreasing generic code instantiated downstream from rustc_middle -- locally seeing 7% unoptimized LLVM IR line wins on rustc_borrowck, for example. We likely can't/shouldn't get rid of the Result-ness on most functions, though some further cleanup avoiding fmt::Error where we now know it won't occur may be possible, though somewhat painful -- fmt::Write is a pretty annoying API to work with in practice when you're trying to use it infallibly.
This commit is contained in:
commit
4b043faba3
10 changed files with 84 additions and 80 deletions
|
@ -988,8 +988,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
) -> (DiagnosticStyledString, DiagnosticStyledString) {
|
||||
let get_lifetimes = |sig| {
|
||||
use rustc_hir::def::Namespace;
|
||||
let mut s = String::new();
|
||||
let (_, sig, reg) = ty::print::FmtPrinter::new(self.tcx, &mut s, Namespace::TypeNS)
|
||||
let (_, sig, reg) = ty::print::FmtPrinter::new(self.tcx, Namespace::TypeNS)
|
||||
.name_all_regions(sig)
|
||||
.unwrap();
|
||||
let lts: Vec<String> = reg.into_iter().map(|(_, kind)| kind.to_string()).collect();
|
||||
|
|
|
@ -397,14 +397,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
let mut s = String::new();
|
||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, &mut s, Namespace::TypeNS);
|
||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, Namespace::TypeNS);
|
||||
if let Some(highlight) = highlight {
|
||||
printer.region_highlight_mode = highlight;
|
||||
}
|
||||
let _ = ty.print(printer);
|
||||
let name = ty.print(printer).unwrap().into_buffer();
|
||||
InferenceDiagnosticsData {
|
||||
name: s,
|
||||
name,
|
||||
span: None,
|
||||
kind: UnderspecifiedArgKind::Type { prefix: ty.prefix_string(self.tcx) },
|
||||
parent: None,
|
||||
|
@ -433,15 +432,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
}
|
||||
|
||||
debug_assert!(!origin.span.is_dummy());
|
||||
let mut s = String::new();
|
||||
let mut printer =
|
||||
ty::print::FmtPrinter::new(self.tcx, &mut s, Namespace::ValueNS);
|
||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, Namespace::ValueNS);
|
||||
if let Some(highlight) = highlight {
|
||||
printer.region_highlight_mode = highlight;
|
||||
}
|
||||
let _ = ct.print(printer);
|
||||
let name = ct.print(printer).unwrap().into_buffer();
|
||||
InferenceDiagnosticsData {
|
||||
name: s,
|
||||
name,
|
||||
span: Some(origin.span),
|
||||
kind: UnderspecifiedArgKind::Const { is_parameter: false },
|
||||
parent: None,
|
||||
|
@ -497,8 +494,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
|
||||
let mut local_visitor = FindHirNodeVisitor::new(&self, arg, span);
|
||||
let ty_to_string = |ty: Ty<'tcx>| -> String {
|
||||
let mut s = String::new();
|
||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, &mut s, Namespace::TypeNS);
|
||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, Namespace::TypeNS);
|
||||
let ty_getter = move |ty_vid| {
|
||||
if let TypeVariableOriginKind::TypeParameterDefinition(name, _) =
|
||||
self.inner.borrow_mut().type_variables().var_origin(ty_vid).kind
|
||||
|
@ -525,14 +521,13 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
|
|||
};
|
||||
printer.const_infer_name_resolver = Some(Box::new(const_getter));
|
||||
|
||||
let _ = if let ty::FnDef(..) = ty.kind() {
|
||||
if let ty::FnDef(..) = ty.kind() {
|
||||
// We don't want the regular output for `fn`s because it includes its path in
|
||||
// invalid pseudo-syntax, we want the `fn`-pointer output instead.
|
||||
ty.fn_sig(self.tcx).print(printer)
|
||||
ty.fn_sig(self.tcx).print(printer).unwrap().into_buffer()
|
||||
} else {
|
||||
ty.print(printer)
|
||||
};
|
||||
s
|
||||
ty.print(printer).unwrap().into_buffer()
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(body_id) = body_id {
|
||||
|
|
|
@ -335,18 +335,19 @@ impl<'tcx> NiceRegionError<'_, 'tcx> {
|
|||
|
||||
impl<'tcx, T> fmt::Display for Highlighted<'tcx, T>
|
||||
where
|
||||
T: for<'a, 'b, 'c> Print<
|
||||
T: for<'a> Print<
|
||||
'tcx,
|
||||
FmtPrinter<'a, 'tcx, &'b mut fmt::Formatter<'c>>,
|
||||
FmtPrinter<'a, 'tcx>,
|
||||
Error = fmt::Error,
|
||||
Output = FmtPrinter<'a, 'tcx>,
|
||||
>,
|
||||
{
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, f, Namespace::TypeNS);
|
||||
let mut printer = ty::print::FmtPrinter::new(self.tcx, Namespace::TypeNS);
|
||||
printer.region_highlight_mode = self.highlight;
|
||||
|
||||
self.value.print(printer)?;
|
||||
Ok(())
|
||||
let s = self.value.print(printer)?.into_buffer();
|
||||
f.write_str(&s)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue