Skip to content

Commit d949187

Browse files
committed
rustc: slice substs in ty::print instead of passing the full ones.
1 parent 477c86e commit d949187

File tree

8 files changed

+76
-85
lines changed

8 files changed

+76
-85
lines changed

src/librustc/infer/error_reporting/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,7 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
533533
if !(did1.is_local() || did2.is_local()) && did1.krate != did2.krate {
534534
let abs_path = |def_id| {
535535
AbsolutePathPrinter { tcx: self.tcx }
536-
.print_def_path(def_id, None)
536+
.print_def_path(def_id, &[])
537537
};
538538

539539
// We compare strings because DefPath can be different

src/librustc/mir/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2410,7 +2410,7 @@ impl<'tcx> Debug for Rvalue<'tcx> {
24102410
ty::tls::with(|tcx| {
24112411
let substs = tcx.lift(&substs).expect("could not lift for printing");
24122412
FmtPrinter::new(tcx, f, Namespace::ValueNS)
2413-
.print_def_path(variant_def.did, Some(substs))?;
2413+
.print_def_path(variant_def.did, substs)?;
24142414
Ok(())
24152415
})?;
24162416

src/librustc/ty/instance.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ impl<'tcx> fmt::Display for Instance<'tcx> {
179179
ty::tls::with(|tcx| {
180180
let substs = tcx.lift(&self.substs).expect("could not lift for printing");
181181
FmtPrinter::new(tcx, &mut *f, Namespace::ValueNS)
182-
.print_def_path(self.def_id(), Some(substs))?;
182+
.print_def_path(self.def_id(), substs)?;
183183
Ok(())
184184
})?;
185185

src/librustc/ty/print/mod.rs

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::hir::map::DefPathData;
22
use crate::hir::def_id::{CrateNum, DefId};
33
use crate::ty::{self, DefIdTree, Ty, TyCtxt};
4-
use crate::ty::subst::{Kind, Subst, SubstsRef};
4+
use crate::ty::subst::{Kind, Subst};
55

66
use rustc_data_structures::fx::FxHashSet;
77

@@ -29,14 +29,14 @@ pub trait Printer<'gcx: 'tcx, 'tcx>: Sized {
2929
fn print_def_path(
3030
self,
3131
def_id: DefId,
32-
substs: Option<SubstsRef<'tcx>>,
32+
substs: &'tcx [Kind<'tcx>],
3333
) -> Result<Self::Path, Self::Error> {
3434
self.default_print_def_path(def_id, substs)
3535
}
3636
fn print_impl_path(
3737
self,
3838
impl_def_id: DefId,
39-
substs: Option<SubstsRef<'tcx>>,
39+
substs: &'tcx [Kind<'tcx>],
4040
self_ty: Ty<'tcx>,
4141
trait_ref: Option<ty::TraitRef<'tcx>>,
4242
) -> Result<Self::Path, Self::Error> {
@@ -90,7 +90,7 @@ pub trait Printer<'gcx: 'tcx, 'tcx>: Sized {
9090
fn default_print_def_path(
9191
self,
9292
def_id: DefId,
93-
substs: Option<SubstsRef<'tcx>>,
93+
substs: &'tcx [Kind<'tcx>],
9494
) -> Result<Self::Path, Self::Error> {
9595
debug!("default_print_def_path: def_id={:?}, substs={:?}", def_id, substs);
9696
let key = self.tcx().def_key(def_id);
@@ -103,69 +103,69 @@ pub trait Printer<'gcx: 'tcx, 'tcx>: Sized {
103103
}
104104

105105
DefPathData::Impl => {
106+
let generics = self.tcx().generics_of(def_id);
106107
let mut self_ty = self.tcx().type_of(def_id);
107-
if let Some(substs) = substs {
108-
self_ty = self_ty.subst(self.tcx(), substs);
109-
}
110-
111108
let mut impl_trait_ref = self.tcx().impl_trait_ref(def_id);
112-
if let Some(substs) = substs {
109+
if substs.len() >= generics.count() {
110+
self_ty = self_ty.subst(self.tcx(), substs);
113111
impl_trait_ref = impl_trait_ref.subst(self.tcx(), substs);
114112
}
115113
self.print_impl_path(def_id, substs, self_ty, impl_trait_ref)
116114
}
117115

118116
_ => {
119-
let generics = substs.map(|_| self.tcx().generics_of(def_id));
120-
let generics_parent = generics.as_ref().and_then(|g| g.parent);
121117
let parent_def_id = DefId { index: key.parent.unwrap(), ..def_id };
122-
let print_parent_path = |cx: Self| {
123-
if let Some(generics_parent_def_id) = generics_parent {
124-
assert_eq!(parent_def_id, generics_parent_def_id);
125-
126-
// FIXME(eddyb) try to move this into the parent's printing
127-
// logic, instead of doing it when printing the child.
128-
let parent_generics = cx.tcx().generics_of(parent_def_id);
129-
let parent_has_own_self =
130-
parent_generics.has_self && parent_generics.parent_count == 0;
131-
if let (Some(substs), true) = (substs, parent_has_own_self) {
132-
let trait_ref = ty::TraitRef::new(parent_def_id, substs);
133-
cx.path_qualified(trait_ref.self_ty(), Some(trait_ref))
134-
} else {
135-
cx.print_def_path(parent_def_id, substs)
136-
}
137-
} else {
138-
cx.print_def_path(parent_def_id, None)
139-
}
140-
};
141-
let print_path = |cx: Self| {
118+
119+
let mut parent_substs = substs;
120+
let mut trait_qualify_parent = false;
121+
if !substs.is_empty() {
122+
let generics = self.tcx().generics_of(def_id);
123+
parent_substs = &substs[..generics.parent_count.min(substs.len())];
124+
142125
match key.disambiguated_data.data {
143-
// Skip `::{{constructor}}` on tuple/unit structs.
144-
DefPathData::StructCtor => print_parent_path(cx),
145-
146-
_ => {
147-
cx.path_append(
148-
print_parent_path,
149-
&key.disambiguated_data.data.as_interned_str().as_str(),
150-
)
126+
// Closures' own generics are only captures, don't print them.
127+
DefPathData::ClosureExpr => {}
128+
129+
// If we have any generic arguments to print, we do that
130+
// on top of the same path, but without its own generics.
131+
_ => if !generics.params.is_empty() && substs.len() >= generics.count() {
132+
let args = self.generic_args_to_print(generics, substs);
133+
return self.path_generic_args(
134+
|cx| cx.print_def_path(def_id, parent_substs),
135+
args,
136+
);
151137
}
152138
}
153-
};
154139

155-
if let (Some(generics), Some(substs)) = (generics, substs) {
156-
let args = self.generic_args_to_print(generics, substs);
157-
self.path_generic_args(print_path, args)
158-
} else {
159-
print_path(self)
140+
// FIXME(eddyb) try to move this into the parent's printing
141+
// logic, instead of doing it when printing the child.
142+
trait_qualify_parent =
143+
generics.has_self &&
144+
generics.parent == Some(parent_def_id) &&
145+
parent_substs.len() == generics.parent_count &&
146+
self.tcx().generics_of(parent_def_id).parent_count == 0;
160147
}
148+
149+
self.path_append(
150+
|cx: Self| if trait_qualify_parent {
151+
let trait_ref = ty::TraitRef::new(
152+
parent_def_id,
153+
cx.tcx().intern_substs(parent_substs),
154+
);
155+
cx.path_qualified(trait_ref.self_ty(), Some(trait_ref))
156+
} else {
157+
cx.print_def_path(parent_def_id, parent_substs)
158+
},
159+
&key.disambiguated_data.data.as_interned_str().as_str(),
160+
)
161161
}
162162
}
163163
}
164164

165165
fn generic_args_to_print(
166166
&self,
167167
generics: &'tcx ty::Generics,
168-
substs: SubstsRef<'tcx>,
168+
substs: &'tcx [Kind<'tcx>],
169169
) -> &'tcx [Kind<'tcx>] {
170170
let mut own_params = generics.parent_count..generics.count();
171171

@@ -193,7 +193,7 @@ pub trait Printer<'gcx: 'tcx, 'tcx>: Sized {
193193
fn default_print_impl_path(
194194
self,
195195
impl_def_id: DefId,
196-
_substs: Option<SubstsRef<'tcx>>,
196+
_substs: &'tcx [Kind<'tcx>],
197197
self_ty: Ty<'tcx>,
198198
impl_trait_ref: Option<ty::TraitRef<'tcx>>,
199199
) -> Result<Self::Path, Self::Error> {
@@ -220,7 +220,7 @@ pub trait Printer<'gcx: 'tcx, 'tcx>: Sized {
220220
// trait-type, then fallback to a format that identifies
221221
// the module more clearly.
222222
self.path_append_impl(
223-
|cx| cx.print_def_path(parent_def_id, None),
223+
|cx| cx.print_def_path(parent_def_id, &[]),
224224
self_ty,
225225
impl_trait_ref,
226226
)

src/librustc/ty/print/pretty.rs

Lines changed: 20 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX, LOCAL_CRATE};
55
use crate::middle::cstore::{ExternCrate, ExternCrateSource};
66
use crate::middle::region;
77
use crate::ty::{self, DefIdTree, ParamConst, Ty, TyCtxt, TypeFoldable};
8-
use crate::ty::subst::{Kind, Subst, SubstsRef, UnpackedKind};
8+
use crate::ty::subst::{Kind, Subst, UnpackedKind};
99
use crate::mir::interpret::ConstValue;
1010
use syntax::symbol::{keywords, Symbol};
1111

@@ -178,7 +178,7 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>:
178178
fn print_value_path(
179179
self,
180180
def_id: DefId,
181-
substs: Option<SubstsRef<'tcx>>,
181+
substs: &'tcx [Kind<'tcx>],
182182
) -> Result<Self::Path, Self::Error> {
183183
self.print_def_path(def_id, substs)
184184
}
@@ -264,7 +264,7 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>:
264264
}) => {
265265
debug!("try_print_visible_def_path: def_id={:?}", def_id);
266266
return Ok((if !span.is_dummy() {
267-
self.print_def_path(def_id, None)?
267+
self.print_def_path(def_id, &[])?
268268
} else {
269269
self.path_crate(cnum)?
270270
}, true));
@@ -469,8 +469,7 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>:
469469
}
470470
ty::FnDef(def_id, substs) => {
471471
let sig = self.tcx().fn_sig(def_id).subst(self.tcx(), substs);
472-
p!(print(sig),
473-
write(" {{"), print_value_path(def_id, Some(substs)), write("}}"));
472+
p!(print(sig), write(" {{"), print_value_path(def_id, substs), write("}}"));
474473
}
475474
ty::FnPtr(ref bare_fn) => {
476475
p!(print(bare_fn))
@@ -492,7 +491,7 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>:
492491
}
493492
}
494493
ty::Adt(def, substs) => {
495-
p!(print_def_path(def.did, Some(substs)));
494+
p!(print_def_path(def.did, substs));
496495
}
497496
ty::Dynamic(data, r) => {
498497
let print_r = self.region_should_not_be_omitted(r);
@@ -505,7 +504,7 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>:
505504
}
506505
}
507506
ty::Foreign(def_id) => {
508-
p!(print_def_path(def_id, None));
507+
p!(print_def_path(def_id, &[]));
509508
}
510509
ty::Projection(ref data) => p!(print(data)),
511510
ty::UnnormalizedProjection(ref data) => {
@@ -691,7 +690,7 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>:
691690
let mut first = true;
692691

693692
if let Some(principal) = predicates.principal() {
694-
p!(print_def_path(principal.def_id, None));
693+
p!(print_def_path(principal.def_id, &[]));
695694

696695
let mut resugared = false;
697696

@@ -774,7 +773,7 @@ pub trait PrettyPrinter<'gcx: 'tcx, 'tcx>:
774773
}
775774
first = false;
776775

777-
p!(print_def_path(def_id, None));
776+
p!(print_def_path(def_id, &[]));
778777
}
779778

780779
Ok(self)
@@ -879,7 +878,7 @@ impl TyCtxt<'_, '_, '_> {
879878
debug!("def_path_str: def_id={:?}, ns={:?}", def_id, ns);
880879
let mut s = String::new();
881880
let _ = FmtPrinter::new(self, &mut s, ns)
882-
.print_def_path(def_id, None);
881+
.print_def_path(def_id, &[]);
883882
s
884883
}
885884
}
@@ -905,21 +904,13 @@ impl<F: fmt::Write> Printer<'gcx, 'tcx> for FmtPrinter<'_, 'gcx, 'tcx, F> {
905904
fn print_def_path(
906905
mut self,
907906
def_id: DefId,
908-
substs: Option<SubstsRef<'tcx>>,
907+
substs: &'tcx [Kind<'tcx>],
909908
) -> Result<Self::Path, Self::Error> {
910909
define_scoped_cx!(self);
911910

912-
// FIXME(eddyb) avoid querying `tcx.generics_of` and `tcx.def_key`
913-
// both here and in `default_print_def_path`.
914-
let generics = substs.map(|_| self.tcx.generics_of(def_id));
915-
if generics.as_ref().and_then(|g| g.parent).is_none() {
911+
if substs.is_empty() {
916912
match self.try_print_visible_def_path(def_id)? {
917-
(cx, true) => return if let (Some(generics), Some(substs)) = (generics, substs) {
918-
let args = cx.generic_args_to_print(generics, substs);
919-
cx.path_generic_args(Ok, args)
920-
} else {
921-
Ok(cx)
922-
},
913+
(cx, true) => return Ok(cx),
923914
(cx, false) => self = cx,
924915
}
925916
}
@@ -942,7 +933,7 @@ impl<F: fmt::Write> Printer<'gcx, 'tcx> for FmtPrinter<'_, 'gcx, 'tcx, F> {
942933
let parent_def_id = DefId { index: key.parent.unwrap(), ..def_id };
943934
let span = self.tcx.def_span(def_id);
944935
return self.path_append(
945-
|cx| cx.print_def_path(parent_def_id, None),
936+
|cx| cx.print_def_path(parent_def_id, &[]),
946937
&format!("<impl at {:?}>", span),
947938
);
948939
}
@@ -1073,7 +1064,7 @@ impl<F: fmt::Write> PrettyPrinter<'gcx, 'tcx> for FmtPrinter<'_, 'gcx, 'tcx, F>
10731064
fn print_value_path(
10741065
mut self,
10751066
def_id: DefId,
1076-
substs: Option<SubstsRef<'tcx>>,
1067+
substs: &'tcx [Kind<'tcx>],
10771068
) -> Result<Self::Path, Self::Error> {
10781069
let was_in_value = std::mem::replace(&mut self.in_value, true);
10791070
self = self.print_def_path(def_id, substs)?;
@@ -1476,7 +1467,7 @@ define_print_and_forward_display! {
14761467
ty::ExistentialPredicate::Trait(x) => p!(print(x)),
14771468
ty::ExistentialPredicate::Projection(x) => p!(print(x)),
14781469
ty::ExistentialPredicate::AutoTrait(def_id) => {
1479-
p!(print_def_path(def_id, None));
1470+
p!(print_def_path(def_id, &[]));
14801471
}
14811472
}
14821473
}
@@ -1509,7 +1500,7 @@ define_print_and_forward_display! {
15091500
}
15101501

15111502
ty::TraitRef<'tcx> {
1512-
p!(print_def_path(self.def_id, Some(self.substs)));
1503+
p!(print_def_path(self.def_id, self.substs));
15131504
}
15141505

15151506
ConstValue<'tcx> {
@@ -1553,7 +1544,7 @@ define_print_and_forward_display! {
15531544
}
15541545

15551546
ty::ProjectionTy<'tcx> {
1556-
p!(print_def_path(self.item_def_id, Some(self.substs)));
1547+
p!(print_def_path(self.item_def_id, self.substs));
15571548
}
15581549

15591550
ty::ClosureKind {
@@ -1574,17 +1565,17 @@ define_print_and_forward_display! {
15741565
ty::Predicate::WellFormed(ty) => p!(print(ty), write(" well-formed")),
15751566
ty::Predicate::ObjectSafe(trait_def_id) => {
15761567
p!(write("the trait `"),
1577-
print_def_path(trait_def_id, None),
1568+
print_def_path(trait_def_id, &[]),
15781569
write("` is object-safe"))
15791570
}
15801571
ty::Predicate::ClosureKind(closure_def_id, _closure_substs, kind) => {
15811572
p!(write("the closure `"),
1582-
print_value_path(closure_def_id, None),
1573+
print_value_path(closure_def_id, &[]),
15831574
write("` implements the trait `{}`", kind))
15841575
}
15851576
ty::Predicate::ConstEvaluatable(def_id, substs) => {
15861577
p!(write("the constant `"),
1587-
print_value_path(def_id, Some(substs)),
1578+
print_value_path(def_id, substs),
15881579
write("` can be evaluated"))
15891580
}
15901581
}

src/librustc/ty/structural_impls.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl fmt::Debug for ty::TraitDef {
3636
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3737
ty::tls::with(|tcx| {
3838
FmtPrinter::new(tcx, f, Namespace::TypeNS)
39-
.print_def_path(self.def_id, None)?;
39+
.print_def_path(self.def_id, &[])?;
4040
Ok(())
4141
})
4242
}
@@ -46,7 +46,7 @@ impl fmt::Debug for ty::AdtDef {
4646
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
4747
ty::tls::with(|tcx| {
4848
FmtPrinter::new(tcx, f, Namespace::TypeNS)
49-
.print_def_path(self.did, None)?;
49+
.print_def_path(self.did, &[])?;
5050
Ok(())
5151
})
5252
}

0 commit comments

Comments
 (0)