Create core::fmt::ArgumentV1 with generics instead of fn pointer

This commit is contained in:
Gary Guo
2021-10-18 00:41:57 +01:00
parent 82f613ee3b
commit 4119f60c1f

View File

@@ -339,15 +339,13 @@ impl<'tcx> FormatArgsExpn<'tcx> {
expr_visitor_no_bodies(|e| { expr_visitor_no_bodies(|e| {
// if we're still inside of the macro definition... // if we're still inside of the macro definition...
if e.span.ctxt() == expr.span.ctxt() { if e.span.ctxt() == expr.span.ctxt() {
// ArgumnetV1::new(<value>, <format_trait>::fmt) // ArgumnetV1::new_<format_trait>(<value>)
if_chain! { if_chain! {
if let ExprKind::Call(callee, [val, fmt_path]) = e.kind; if let ExprKind::Call(callee, [val]) = e.kind;
if let ExprKind::Path(QPath::TypeRelative(ty, seg)) = callee.kind; if let ExprKind::Path(QPath::TypeRelative(ty, seg)) = callee.kind;
if seg.ident.name == sym::new;
if let hir::TyKind::Path(QPath::Resolved(_, path)) = ty.kind; if let hir::TyKind::Path(QPath::Resolved(_, path)) = ty.kind;
if path.segments.last().unwrap().ident.name == sym::ArgumentV1; if path.segments.last().unwrap().ident.name == sym::ArgumentV1;
if let ExprKind::Path(QPath::Resolved(_, path)) = fmt_path.kind; if seg.ident.name.as_str().starts_with("new_");
if let [.., fmt_trait, _fmt] = path.segments;
then { then {
let val_idx = if_chain! { let val_idx = if_chain! {
if val.span.ctxt() == expr.span.ctxt(); if val.span.ctxt() == expr.span.ctxt();
@@ -361,7 +359,19 @@ impl<'tcx> FormatArgsExpn<'tcx> {
formatters.len() formatters.len()
} }
}; };
formatters.push((val_idx, fmt_trait.ident.name)); let fmt_trait = match seg.ident.name.as_str() {
"new_display" => "Display",
"new_debug" => "Debug",
"new_lower_exp" => "LowerExp",
"new_upper_exp" => "UpperExp",
"new_octal" => "Octal",
"new_pointer" => "Pointer",
"new_binary" => "Binary",
"new_lower_hex" => "LowerHex",
"new_upper_hex" => "UpperHex",
_ => unreachable!(),
};
formatters.push((val_idx, Symbol::intern(fmt_trait)));
} }
} }
if let ExprKind::Struct(QPath::Resolved(_, path), ..) = e.kind { if let ExprKind::Struct(QPath::Resolved(_, path), ..) = e.kind {