rustc: remove the closure from ppaux's p! macro (by making ? implicit).

This commit is contained in:
Eduard-Mihai Burtescu 2019-01-10 14:50:36 +02:00
parent 37e918526a
commit ab5d6fb302
2 changed files with 122 additions and 134 deletions

View file

@ -611,12 +611,12 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
) -> Result<P::Path, P::Error> {
let mut empty = true;
let mut start_or_continue = |cx: &mut Self, start: &str, cont: &str| {
if empty {
write!(cx.printer, "{}", if empty {
empty = false;
write!(cx.printer, "{}", start)
start
} else {
write!(cx.printer, "{}", cont)
}
cont
})
};
let start = if ns == Namespace::ValueNS { "::<" } else { "<" };

View file

@ -196,9 +196,11 @@ macro_rules! gen_print_impl {
type Output = ();
type Error = fmt::Error;
fn print(&$self, $cx: &mut PrintCx<'_, '_, 'tcx, P>) -> fmt::Result {
define_scoped_cx!($cx);
if $cx.config.is_debug $dbg
else $disp
Ok({
define_scoped_cx!($cx);
if $cx.config.is_debug $dbg
else $disp
})
}
}
};
@ -207,9 +209,11 @@ macro_rules! gen_print_impl {
type Output = ();
type Error = fmt::Error;
fn print(&$self, $cx: &mut PrintCx<'_, '_, 'tcx, P>) -> fmt::Result {
define_scoped_cx!($cx);
if $cx.config.is_debug $dbg
else $disp
Ok({
define_scoped_cx!($cx);
if $cx.config.is_debug $dbg
else $disp
})
}
}
};
@ -238,7 +242,7 @@ macro_rules! define_print {
( $generic:tt $target:ty,
($self:ident, $cx:ident) { display $disp:block } ) => {
gen_print_impl! { $generic $target, ($self, $cx) yes $disp no {
write!($cx.printer, "{:?}", $self)
write!($cx.printer, "{:?}", $self)?
} }
};
}
@ -257,10 +261,9 @@ macro_rules! print_inner {
}
macro_rules! p {
($($kind:ident $data:tt),+) => {
(|| -> fmt::Result {
$(print_inner!($kind $data)?;)+
Ok(())
})()
{
$(print_inner!($kind $data)?);+
}
};
}
macro_rules! define_scoped_cx {
@ -281,20 +284,20 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
) -> fmt::Result {
define_scoped_cx!(self);
p!(write("("))?;
p!(write("("));
let mut inputs = inputs.iter();
if let Some(&ty) = inputs.next() {
p!(print_display(ty))?;
p!(print_display(ty));
for &ty in inputs {
p!(write(", "), print_display(ty))?;
p!(write(", "), print_display(ty));
}
if c_variadic {
p!(write(", ..."))?;
p!(write(", ..."));
}
}
p!(write(")"))?;
p!(write(")"));
if !output.is_unit() {
p!(write(" -> "), print_display(output))?;
p!(write(" -> "), print_display(output));
}
Ok(())
@ -322,14 +325,12 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
let mut empty = true;
let mut start_or_continue = |cx: &mut Self, start: &str, cont: &str| {
define_scoped_cx!(cx);
if empty {
write!(cx.printer, "{}", if empty {
empty = false;
p!(write("{}", start))
start
} else {
p!(write("{}", cont))
}
cont
})
};
// NOTE(eddyb) this must be below `start_or_continue`'s definition
@ -343,7 +344,7 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
let _ = start_or_continue(self, "for<", ", ");
let br = match br {
ty::BrNamed(_, name) => {
let _ = p!(write("{}", name));
let _ = write!(self.printer, "{}", name);
br
}
ty::BrAnon(_) |
@ -356,7 +357,7 @@ impl<P: PrettyPrinter> PrintCx<'a, 'gcx, 'tcx, P> {
break name;
}
};
let _ = p!(write("{}", name));
let _ = write!(self.printer, "{}", name);
ty::BrNamed(self.tcx.hir().local_def_id(CRATE_NODE_ID), name)
}
};
@ -453,7 +454,7 @@ define_print! {
for (_, def_id) in auto_traits {
if !first {
p!(write(" + "))?;
p!(write(" + "));
}
first = false;
@ -464,8 +465,6 @@ define_print! {
iter::empty(),
)?;
}
Ok(())
}
}
}
@ -528,7 +527,8 @@ impl fmt::Debug for ty::UpvarId {
p!(write("UpvarId({:?};`{}`;{:?})",
self.var_path.hir_id,
cx.tcx.hir().name_by_hir_id(self.var_path.hir_id),
self.closure_expr_id))
self.closure_expr_id));
Ok(())
})
}
}
@ -543,12 +543,12 @@ impl<'tcx> fmt::Debug for ty::UpvarBorrow<'tcx> {
define_print! {
('tcx) &'tcx ty::List<Ty<'tcx>>, (self, cx) {
display {
p!(write("{{"))?;
p!(write("{{"));
let mut tys = self.iter();
if let Some(&ty) = tys.next() {
p!(print(ty))?;
p!(print(ty));
for &ty in tys {
p!(write(", "), print(ty))?;
p!(write(", "), print(ty));
}
}
p!(write("}}"))
@ -571,13 +571,12 @@ define_print! {
display {
let dummy_self = cx.tcx.mk_infer(ty::FreshTy(0));
ty::Binder::bind(*self)
p!(print_display(ty::Binder::bind(*self)
.with_self_ty(cx.tcx, dummy_self)
.skip_binder()
.print_display(cx)
.skip_binder()))
}
debug {
self.print_display(cx)
p!(print_display(self))
}
}
}
@ -599,21 +598,20 @@ define_print! {
if let BrNamed(_, name) = *self {
if name != "" && name != "'_" {
return p!(write("{}", name));
p!(write("{}", name));
return Ok(());
}
}
let highlight = RegionHighlightMode::get();
if let Some((region, counter)) = highlight.highlight_bound_region {
if *self == region {
return p!(write("'{}", counter));
p!(write("'{}", counter));
}
}
Ok(())
}
debug {
return match *self {
match *self {
BrAnon(n) => p!(write("BrAnon({:?})", n)),
BrFresh(n) => p!(write("BrFresh({:?})", n)),
BrNamed(did, name) => {
@ -621,7 +619,7 @@ define_print! {
did.krate, did.index, name))
}
BrEnv => p!(write("BrEnv")),
};
}
}
}
}
@ -661,10 +659,10 @@ define_print! {
let highlight = RegionHighlightMode::get();
if let Some(counter) = highlight.placeholder_highlight(*self) {
return p!(write("'{}", counter));
p!(write("'{}", counter));
} else {
p!(print_display(self.name));
}
p!(print_display(self.name))
}
}
}
@ -696,7 +694,8 @@ define_print! {
// Watch out for region highlights.
if let Some(n) = RegionHighlightMode::get().region_highlighted(self) {
return p!(write("'{:?}", n));
p!(write("'{:?}", n));
return Ok(());
}
// These printouts are concise. They do not contain all the information
@ -707,8 +706,6 @@ define_print! {
ty::ReEarlyBound(ref data) => {
if data.name != "'_" {
p!(write("{}", data.name))
} else {
Ok(())
}
}
ty::ReLateBound(_, br) |
@ -742,7 +739,7 @@ define_print! {
p!(print_display(region_vid))
}
ty::ReScope(_) |
ty::ReErased => Ok(()),
ty::ReErased => {}
ty::ReStatic => p!(write("'static")),
ty::ReEmpty => p!(write("'<empty>")),
@ -853,7 +850,7 @@ define_print! {
ty::Contravariant => "-",
ty::Invariant => "o",
ty::Bivariant => "*",
})
})?
}
}
}
@ -862,15 +859,15 @@ define_print! {
('tcx) ty::FnSig<'tcx>, (self, cx) {
display {
if self.unsafety == hir::Unsafety::Unsafe {
p!(write("unsafe "))?;
p!(write("unsafe "));
}
if self.abi != Abi::Rust {
p!(write("extern {} ", self.abi))?;
p!(write("extern {} ", self.abi));
}
p!(write("fn"))?;
cx.fn_sig(self.inputs(), self.c_variadic, self.output())
p!(write("fn"));
cx.fn_sig(self.inputs(), self.c_variadic, self.output())?
}
debug {
p!(write("({:?}; c_variadic: {})->{:?}",
@ -912,20 +909,18 @@ define_print! {
let highlight = RegionHighlightMode::get();
if let Some(counter) = highlight.region_highlighted(&ty::ReVar(*self)) {
return p!(write("'{:?}", counter));
p!(write("'{:?}", counter));
}
Ok(())
}
debug {
// HACK(eddyb) this is duplicated from `display` printing,
// to keep NLL borrowck working even with `-Zverbose`.
let highlight = RegionHighlightMode::get();
if let Some(counter) = highlight.region_highlighted(&ty::ReVar(*self)) {
return p!(write("'{:?}", counter));
p!(write("'{:?}", counter));
} else {
p!(write("'_#{}r", self.index()));
}
p!(write("'_#{}r", self.index()))
}
}
}
@ -1016,7 +1011,7 @@ define_print_multi! {
]
(self, cx) {
display {
cx.in_binder(self)
cx.in_binder(self)?
}
}
}
@ -1030,11 +1025,9 @@ define_print! {
Namespace::TypeNS,
iter::empty(),
)?;
Ok(())
}
debug {
let _ = cx.path_qualified(None, self.self_ty(), Some(*self), Namespace::TypeNS)?;
Ok(())
}
}
}
@ -1052,26 +1045,26 @@ define_print! {
p!(write("*{} ", match tm.mutbl {
hir::MutMutable => "mut",
hir::MutImmutable => "const",
}))?;
tm.ty.print(cx)
}));
p!(print(tm.ty))
}
Ref(r, ty, mutbl) => {
p!(write("&"))?;
p!(write("&"));
if r.display_outputs_anything(cx) {
p!(print_display(r), write(" "))?;
p!(print_display(r), write(" "));
}
ty::TypeAndMut { ty, mutbl }.print(cx)
p!(print(ty::TypeAndMut { ty, mutbl }))
}
Never => p!(write("!")),
Tuple(ref tys) => {
p!(write("("))?;
p!(write("("));
let mut tys = tys.iter();
if let Some(&ty) = tys.next() {
p!(print(ty), write(","))?;
p!(print(ty), write(","));
if let Some(&ty) = tys.next() {
p!(write(" "), print(ty))?;
p!(write(" "), print(ty));
for &ty in tys {
p!(write(", "), print(ty))?;
p!(write(", "), print(ty));
}
}
}
@ -1079,7 +1072,7 @@ define_print! {
}
FnDef(def_id, substs) => {
let sig = cx.tcx.fn_sig(def_id).subst(cx.tcx, substs);
p!(print(sig), write(" {{"))?;
p!(print(sig), write(" {{"));
let _ = cx.print_def_path(
def_id,
Some(substs),
@ -1089,7 +1082,7 @@ define_print! {
p!(write("}}"))
}
FnPtr(ref bare_fn) => {
bare_fn.print(cx)
p!(print(bare_fn))
}
Infer(infer_ty) => p!(write("{}", infer_ty)),
Error => p!(write("[type error]")),
@ -1114,19 +1107,16 @@ define_print! {
Namespace::TypeNS,
iter::empty(),
)?;
Ok(())
}
Dynamic(data, r) => {
let print_r = r.display_outputs_anything(cx);
if print_r {
p!(write("("))?;
p!(write("("));
}
p!(write("dyn "))?;
data.print(cx)?;
p!(write("dyn "), print(data));
if print_r {
p!(write(" + "), print_display(r), write(")"))?;
p!(write(" + "), print_display(r), write(")"));
}
Ok(())
}
Foreign(def_id) => {
let _ = cx.print_def_path(
@ -1135,11 +1125,10 @@ define_print! {
Namespace::TypeNS,
iter::empty(),
)?;
Ok(())
}
Projection(ref data) => data.print(cx),
Projection(ref data) => p!(print(data)),
UnnormalizedProjection(ref data) => {
p!(write("Unnormalized("))?;
p!(write("Unnormalized("));
data.print(cx)?;
p!(write(")"))
}
@ -1148,21 +1137,22 @@ define_print! {
}
Opaque(def_id, substs) => {
if cx.config.is_verbose {
return p!(write("Opaque({:?}, {:?})", def_id, substs));
p!(write("Opaque({:?}, {:?})", def_id, substs));
return Ok(());
}
let def_key = cx.tcx.def_key(def_id);
if let Some(name) = def_key.disambiguated_data.data.get_opt_name() {
p!(write("{}", name))?;
p!(write("{}", name));
let mut substs = substs.iter();
// FIXME(eddyb) print this with `print_def_path`.
if let Some(first) = substs.next() {
p!(write("::<"))?;
p!(write("{}", first))?;
p!(write("::<"));
p!(write("{}", first));
for subst in substs {
p!(write(", {}", subst))?;
p!(write(", {}", subst));
}
p!(write(">"))?;
p!(write(">"));
}
return Ok(());
}
@ -1172,7 +1162,7 @@ define_print! {
let mut first = true;
let mut is_sized = false;
p!(write("impl"))?;
p!(write("impl"));
for predicate in bounds.predicates {
if let Some(trait_ref) = predicate.to_opt_poly_trait_ref() {
// Don't print +Sized, but rather +?Sized if absent.
@ -1183,30 +1173,29 @@ define_print! {
p!(
write("{}", if first { " " } else { "+" }),
print(trait_ref))?;
print(trait_ref));
first = false;
}
}
if !is_sized {
p!(write("{}?Sized", if first { " " } else { "+" }))?;
p!(write("{}?Sized", if first { " " } else { "+" }));
} else if first {
p!(write(" Sized"))?;
p!(write(" Sized"));
}
Ok(())
}
Str => p!(write("str")),
Generator(did, substs, movability) => {
let upvar_tys = substs.upvar_tys(did, cx.tcx);
let witness = substs.witness(did, cx.tcx);
if movability == hir::GeneratorMovability::Movable {
p!(write("[generator"))?;
p!(write("[generator"));
} else {
p!(write("[static generator"))?;
p!(write("[static generator"));
}
// FIXME(eddyb) should use `def_span`.
if let Some(hir_id) = cx.tcx.hir().as_local_hir_id(did) {
p!(write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)))?;
p!(write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)));
let mut sep = " ";
cx.tcx.with_freevars(hir_id, |freevars| {
for (freevar, upvar_ty) in freevars.iter().zip(upvar_tys) {
@ -1214,7 +1203,7 @@ define_print! {
write("{}{}:",
sep,
cx.tcx.hir().name(freevar.var_id())),
print(upvar_ty))?;
print(upvar_ty));
sep = ", ";
}
Ok(())
@ -1222,12 +1211,12 @@ define_print! {
} else {
// cross-crate closure types should only be
// visible in codegen bug reports, I imagine.
p!(write("@{:?}", did))?;
p!(write("@{:?}", did));
let mut sep = " ";
for (index, upvar_ty) in upvar_tys.enumerate() {
p!(
write("{}{}:", sep, index),
print(upvar_ty))?;
print(upvar_ty));
sep = ", ";
}
}
@ -1235,18 +1224,18 @@ define_print! {
p!(write(" "), print(witness), write("]"))
},
GeneratorWitness(types) => {
cx.in_binder(&types)
cx.in_binder(&types)?
}
Closure(did, substs) => {
let upvar_tys = substs.upvar_tys(did, cx.tcx);
p!(write("[closure"))?;
p!(write("[closure"));
// FIXME(eddyb) should use `def_span`.
if let Some(hir_id) = cx.tcx.hir().as_local_hir_id(did) {
if cx.tcx.sess.opts.debugging_opts.span_free_formats {
p!(write("@{:?}", hir_id))?;
p!(write("@{:?}", hir_id));
} else {
p!(write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)))?;
p!(write("@{:?}", cx.tcx.hir().span_by_hir_id(hir_id)));
}
let mut sep = " ";
cx.tcx.with_freevars(hir_id, |freevars| {
@ -1255,7 +1244,7 @@ define_print! {
write("{}{}:",
sep,
cx.tcx.hir().name(freevar.var_id())),
print(upvar_ty))?;
print(upvar_ty));
sep = ", ";
}
Ok(())
@ -1263,38 +1252,38 @@ define_print! {
} else {
// cross-crate closure types should only be
// visible in codegen bug reports, I imagine.
p!(write("@{:?}", did))?;
p!(write("@{:?}", did));
let mut sep = " ";
for (index, upvar_ty) in upvar_tys.enumerate() {
p!(
write("{}{}:", sep, index),
print(upvar_ty))?;
print(upvar_ty));
sep = ", ";
}
}
if cx.is_verbose {
if cx.config.is_verbose {
p!(write(
" closure_kind_ty={:?} closure_sig_ty={:?}",
substs.closure_kind_ty(did, cx.tcx),
substs.closure_sig_ty(did, cx.tcx)
))?;
));
}
p!(write("]"))
},
Array(ty, sz) => {
p!(write("["), print(ty), write("; "))?;
p!(write("["), print(ty), write("; "));
match sz {
ty::LazyConst::Unevaluated(_def_id, _substs) => {
p!(write("_"))?;
p!(write("_"));
}
ty::LazyConst::Evaluated(c) => {
match c.val {
ConstValue::Infer(..) => p!(write("_"))?,
ConstValue::Infer(..) => p!(write("_")),
ConstValue::Param(ParamConst { name, .. }) =>
p!(write("{}", name))?,
_ => p!(write("{}", c.unwrap_usize(cx.tcx)))?,
p!(write("{}", name)),
_ => p!(write("{}", c.unwrap_usize(cx.tcx))),
}
}
}
@ -1306,7 +1295,7 @@ define_print! {
}
}
debug {
self.print_display(cx)
p!(print_display(self))
}
}
}
@ -1423,7 +1412,6 @@ define_print! {
Namespace::TypeNS,
iter::empty(),
)?;
Ok(())
}
}
}
@ -1444,14 +1432,14 @@ define_print! {
('tcx) ty::Predicate<'tcx>, (self, cx) {
display {
match *self {
ty::Predicate::Trait(ref data) => data.print(cx),
ty::Predicate::Subtype(ref predicate) => predicate.print(cx),
ty::Predicate::RegionOutlives(ref predicate) => predicate.print(cx),
ty::Predicate::TypeOutlives(ref predicate) => predicate.print(cx),
ty::Predicate::Projection(ref predicate) => predicate.print(cx),
ty::Predicate::Trait(ref data) => p!(print(data)),
ty::Predicate::Subtype(ref predicate) => p!(print(predicate)),
ty::Predicate::RegionOutlives(ref predicate) => p!(print(predicate)),
ty::Predicate::TypeOutlives(ref predicate) => p!(print(predicate)),
ty::Predicate::Projection(ref predicate) => p!(print(predicate)),
ty::Predicate::WellFormed(ty) => p!(print(ty), write(" well-formed")),
ty::Predicate::ObjectSafe(trait_def_id) => {
p!(write("the trait `"))?;
p!(write("the trait `"));
let _ = cx.print_def_path(
trait_def_id,
None,
@ -1461,7 +1449,7 @@ define_print! {
p!(write("` is object-safe"))
}
ty::Predicate::ClosureKind(closure_def_id, _closure_substs, kind) => {
p!(write("the closure `"))?;
p!(write("the closure `"));
let _ = cx.print_def_path(
closure_def_id,
None,
@ -1471,7 +1459,7 @@ define_print! {
p!(write("` implements the trait `{}`", kind))
}
ty::Predicate::ConstEvaluatable(def_id, substs) => {
p!(write("the constant `"))?;
p!(write("the constant `"));
let _ = cx.print_def_path(
def_id,
Some(substs),
@ -1484,12 +1472,12 @@ define_print! {
}
debug {
match *self {
ty::Predicate::Trait(ref a) => a.print(cx),
ty::Predicate::Subtype(ref pair) => pair.print(cx),
ty::Predicate::RegionOutlives(ref pair) => pair.print(cx),
ty::Predicate::TypeOutlives(ref pair) => pair.print(cx),
ty::Predicate::Projection(ref pair) => pair.print(cx),
ty::Predicate::WellFormed(ty) => ty.print(cx),
ty::Predicate::Trait(ref a) => p!(print(a)),
ty::Predicate::Subtype(ref pair) => p!(print(pair)),
ty::Predicate::RegionOutlives(ref pair) => p!(print(pair)),
ty::Predicate::TypeOutlives(ref pair) => p!(print(pair)),
ty::Predicate::Projection(ref pair) => p!(print(pair)),
ty::Predicate::WellFormed(ty) => p!(print(ty)),
ty::Predicate::ObjectSafe(trait_def_id) => {
p!(write("ObjectSafe({:?})", trait_def_id))
}