Skip to content

Commit 3366247

Browse files
committed
Auto merge of #44766 - sunjay:lift_generics, r=nikomatsakis
Move Generics from MethodSig to TraitItem and ImplItem As part of `rust-impl-period/WG-compiler-traits`, we want to "lift" `Generics` from `MethodSig` into `TraitItem` and `ImplItem`. This is in preparation for adding associated type generics. (#44265 (comment)) Currently this change is only made in the AST. In the future, it may also impact the HIR. (Still discussing) To understand this PR, it's probably best to start from the changes to `ast.rs` and then work your way to the other files to understand the far reaching effects of this change. r? @nikomatsakis
2 parents 4c053db + 4b0f004 commit 3366247

File tree

23 files changed

+107
-125
lines changed

23 files changed

+107
-125
lines changed

src/librustc/hir/intravisit.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -780,9 +780,7 @@ pub fn walk_fn_kind<'v, V: Visitor<'v>>(visitor: &mut V, function_kind: FnKind<'
780780
FnKind::ItemFn(_, generics, ..) => {
781781
visitor.visit_generics(generics);
782782
}
783-
FnKind::Method(_, sig, ..) => {
784-
visitor.visit_generics(&sig.generics);
785-
}
783+
FnKind::Method(..) |
786784
FnKind::Closure(_) => {}
787785
}
788786
}
@@ -802,6 +800,7 @@ pub fn walk_fn<'v, V: Visitor<'v>>(visitor: &mut V,
802800
pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v TraitItem) {
803801
visitor.visit_name(trait_item.span, trait_item.name);
804802
walk_list!(visitor, visit_attribute, &trait_item.attrs);
803+
visitor.visit_generics(&trait_item.generics);
805804
match trait_item.node {
806805
TraitItemKind::Const(ref ty, default) => {
807806
visitor.visit_id(trait_item.id);
@@ -810,7 +809,6 @@ pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v Trai
810809
}
811810
TraitItemKind::Method(ref sig, TraitMethod::Required(ref names)) => {
812811
visitor.visit_id(trait_item.id);
813-
visitor.visit_generics(&sig.generics);
814812
visitor.visit_fn_decl(&sig.decl);
815813
for name in names {
816814
visitor.visit_name(name.span, name.node);
@@ -852,6 +850,7 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
852850
ref vis,
853851
ref defaultness,
854852
ref attrs,
853+
ref generics,
855854
ref node,
856855
span
857856
} = *impl_item;
@@ -860,6 +859,7 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
860859
visitor.visit_vis(vis);
861860
visitor.visit_defaultness(defaultness);
862861
walk_list!(visitor, visit_attribute, attrs);
862+
visitor.visit_generics(generics);
863863
match *node {
864864
ImplItemKind::Const(ref ty, body) => {
865865
visitor.visit_id(impl_item.id);

src/librustc/hir/lowering.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1539,6 +1539,7 @@ impl<'a> LoweringContext<'a> {
15391539
hir_id,
15401540
name: this.lower_ident(i.ident),
15411541
attrs: this.lower_attrs(&i.attrs),
1542+
generics: this.lower_generics(&i.generics),
15421543
node: match i.node {
15431544
TraitItemKind::Const(ref ty, ref default) => {
15441545
hir::TraitItemKind::Const(this.lower_ty(ty),
@@ -1603,6 +1604,7 @@ impl<'a> LoweringContext<'a> {
16031604
hir_id,
16041605
name: this.lower_ident(i.ident),
16051606
attrs: this.lower_attrs(&i.attrs),
1607+
generics: this.lower_generics(&i.generics),
16061608
vis: this.lower_visibility(&i.vis, None),
16071609
defaultness: this.lower_defaultness(i.defaultness, true /* [1] */),
16081610
node: match i.node {
@@ -1729,7 +1731,6 @@ impl<'a> LoweringContext<'a> {
17291731

17301732
fn lower_method_sig(&mut self, sig: &MethodSig) -> hir::MethodSig {
17311733
hir::MethodSig {
1732-
generics: self.lower_generics(&sig.generics),
17331734
abi: sig.abi,
17341735
unsafety: self.lower_unsafety(sig.unsafety),
17351736
constness: self.lower_constness(sig.constness),

src/librustc/hir/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1295,7 +1295,6 @@ pub struct MethodSig {
12951295
pub constness: Constness,
12961296
pub abi: Abi,
12971297
pub decl: P<FnDecl>,
1298-
pub generics: Generics,
12991298
}
13001299

13011300
// The bodies for items are stored "out of line", in a separate
@@ -1316,6 +1315,7 @@ pub struct TraitItem {
13161315
pub name: Name,
13171316
pub hir_id: HirId,
13181317
pub attrs: HirVec<Attribute>,
1318+
pub generics: Generics,
13191319
pub node: TraitItemKind,
13201320
pub span: Span,
13211321
}
@@ -1360,6 +1360,7 @@ pub struct ImplItem {
13601360
pub vis: Visibility,
13611361
pub defaultness: Defaultness,
13621362
pub attrs: HirVec<Attribute>,
1363+
pub generics: Generics,
13631364
pub node: ImplItemKind,
13641365
pub span: Span,
13651366
}

src/librustc/hir/print.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,7 @@ impl<'a> State<'a> {
880880
pub fn print_method_sig(&mut self,
881881
name: ast::Name,
882882
m: &hir::MethodSig,
883+
generics: &hir::Generics,
883884
vis: &hir::Visibility,
884885
arg_names: &[Spanned<ast::Name>],
885886
body_id: Option<hir::BodyId>)
@@ -889,7 +890,7 @@ impl<'a> State<'a> {
889890
m.constness,
890891
m.abi,
891892
Some(name),
892-
&m.generics,
893+
generics,
893894
vis,
894895
arg_names,
895896
body_id)
@@ -905,12 +906,14 @@ impl<'a> State<'a> {
905906
self.print_associated_const(ti.name, &ty, default, &hir::Inherited)?;
906907
}
907908
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref arg_names)) => {
908-
self.print_method_sig(ti.name, sig, &hir::Inherited, arg_names, None)?;
909+
self.print_method_sig(ti.name, sig, &ti.generics, &hir::Inherited, arg_names,
910+
None)?;
909911
self.s.word(";")?;
910912
}
911913
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => {
912914
self.head("")?;
913-
self.print_method_sig(ti.name, sig, &hir::Inherited, &[], Some(body))?;
915+
self.print_method_sig(ti.name, sig, &ti.generics, &hir::Inherited, &[],
916+
Some(body))?;
914917
self.nbsp()?;
915918
self.end()?; // need to close a box
916919
self.end()?; // need to close a box
@@ -938,7 +941,7 @@ impl<'a> State<'a> {
938941
}
939942
hir::ImplItemKind::Method(ref sig, body) => {
940943
self.head("")?;
941-
self.print_method_sig(ii.name, sig, &ii.vis, &[], Some(body))?;
944+
self.print_method_sig(ii.name, sig, &ii.generics, &ii.vis, &[], Some(body))?;
942945
self.nbsp()?;
943946
self.end()?; // need to close a box
944947
self.end()?; // need to close a box

src/librustc/ich/impls_hir.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -232,8 +232,7 @@ impl_stable_hash_for!(struct hir::MethodSig {
232232
unsafety,
233233
constness,
234234
abi,
235-
decl,
236-
generics
235+
decl
237236
});
238237

239238
impl_stable_hash_for!(struct hir::TypeBinding {
@@ -709,13 +708,15 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for hir::TraitItem {
709708
hir_id: _,
710709
name,
711710
ref attrs,
711+
ref generics,
712712
ref node,
713713
span
714714
} = *self;
715715

716716
hcx.hash_hir_item_like(attrs, |hcx| {
717717
name.hash_stable(hcx, hasher);
718718
attrs.hash_stable(hcx, hasher);
719+
generics.hash_stable(hcx, hasher);
719720
node.hash_stable(hcx, hasher);
720721
span.hash_stable(hcx, hasher);
721722
});
@@ -744,6 +745,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for hir::ImplItem {
744745
ref vis,
745746
defaultness,
746747
ref attrs,
748+
ref generics,
747749
ref node,
748750
span
749751
} = *self;
@@ -753,6 +755,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for hir::ImplItem {
753755
vis.hash_stable(hcx, hasher);
754756
defaultness.hash_stable(hcx, hasher);
755757
attrs.hash_stable(hcx, hasher);
758+
generics.hash_stable(hcx, hasher);
756759
node.hash_stable(hcx, hasher);
757760
span.hash_stable(hcx, hasher);
758761
});

src/librustc/middle/reachable.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,10 @@ fn item_might_be_inlined(item: &hir::Item) -> bool {
5858
}
5959

6060
fn method_might_be_inlined<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
61-
sig: &hir::MethodSig,
6261
impl_item: &hir::ImplItem,
6362
impl_src: DefId) -> bool {
6463
if attr::requests_inline(&impl_item.attrs) ||
65-
generics_require_inlining(&sig.generics) {
64+
generics_require_inlining(&impl_item.generics) {
6665
return true
6766
}
6867
if let Some(impl_node_id) = tcx.hir.as_local_node_id(impl_src) {
@@ -176,8 +175,8 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
176175
Some(hir_map::NodeImplItem(impl_item)) => {
177176
match impl_item.node {
178177
hir::ImplItemKind::Const(..) => true,
179-
hir::ImplItemKind::Method(ref sig, _) => {
180-
if generics_require_inlining(&sig.generics) ||
178+
hir::ImplItemKind::Method(..) => {
179+
if generics_require_inlining(&impl_item.generics) ||
181180
attr::requests_inline(&impl_item.attrs) {
182181
true
183182
} else {
@@ -293,9 +292,9 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
293292
hir::ImplItemKind::Const(_, body) => {
294293
self.visit_nested_body(body);
295294
}
296-
hir::ImplItemKind::Method(ref sig, body) => {
295+
hir::ImplItemKind::Method(_, body) => {
297296
let did = self.tcx.hir.get_parent_did(search_item);
298-
if method_might_be_inlined(self.tcx, sig, impl_item, did) {
297+
if method_might_be_inlined(self.tcx, impl_item, did) {
299298
self.visit_nested_body(body)
300299
}
301300
}

src/librustc/middle/resolve_lifetime.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
412412
if let hir::TraitItemKind::Method(ref sig, _) = trait_item.node {
413413
self.visit_early_late(
414414
Some(self.hir_map.get_parent(trait_item.id)),
415-
&sig.decl, &sig.generics,
415+
&sig.decl, &trait_item.generics,
416416
|this| intravisit::walk_trait_item(this, trait_item))
417417
} else {
418418
intravisit::walk_trait_item(self, trait_item);
@@ -423,7 +423,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
423423
if let hir::ImplItemKind::Method(ref sig, _) = impl_item.node {
424424
self.visit_early_late(
425425
Some(self.hir_map.get_parent(impl_item.id)),
426-
&sig.decl, &sig.generics,
426+
&sig.decl, &impl_item.generics,
427427
|this| intravisit::walk_impl_item(this, impl_item))
428428
} else {
429429
intravisit::walk_impl_item(self, impl_item);

src/librustc_resolve/lib.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -718,12 +718,10 @@ impl<'a, 'tcx> Visitor<'tcx> for Resolver<'a> {
718718
_: Span,
719719
node_id: NodeId) {
720720
let rib_kind = match function_kind {
721-
FnKind::ItemFn(_, generics, ..) => {
722-
self.visit_generics(generics);
721+
FnKind::ItemFn(..) => {
723722
ItemRibKind
724723
}
725724
FnKind::Method(_, sig, _, _) => {
726-
self.visit_generics(&sig.generics);
727725
MethodRibKind(!sig.decl.has_self())
728726
}
729727
FnKind::Closure(_) => ClosureRibKind(node_id),
@@ -1880,7 +1878,7 @@ impl<'a> Resolver<'a> {
18801878
}
18811879
TraitItemKind::Method(ref sig, _) => {
18821880
let type_parameters =
1883-
HasTypeParameters(&sig.generics,
1881+
HasTypeParameters(&trait_item.generics,
18841882
MethodRibKind(!sig.decl.has_self()));
18851883
this.with_type_parameter_rib(type_parameters, |this| {
18861884
visit::walk_trait_item(this, trait_item)
@@ -2099,7 +2097,7 @@ impl<'a> Resolver<'a> {
20992097
// We also need a new scope for the method-
21002098
// specific type parameters.
21012099
let type_parameters =
2102-
HasTypeParameters(&sig.generics,
2100+
HasTypeParameters(&impl_item.generics,
21032101
MethodRibKind(!sig.decl.has_self()));
21042102
this.with_type_parameter_rib(type_parameters, |this| {
21052103
visit::walk_impl_item(this, impl_item);

src/librustc_save_analysis/dump_visitor.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -354,23 +354,24 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
354354
body: Option<&'l ast::Block>,
355355
id: ast::NodeId,
356356
name: ast::Ident,
357+
generics: &'l ast::Generics,
357358
vis: ast::Visibility,
358359
span: Span) {
359360
debug!("process_method: {}:{}", id, name);
360361

361362
if let Some(mut method_data) = self.save_ctxt.get_method_data(id, name.name, span) {
362363

363-
let sig_str = ::make_signature(&sig.decl, &sig.generics);
364+
let sig_str = ::make_signature(&sig.decl, &generics);
364365
if body.is_some() {
365366
self.nest_tables(id, |v| {
366367
v.process_formals(&sig.decl.inputs, &method_data.qualname)
367368
});
368369
}
369370

370-
self.process_generic_params(&sig.generics, span, &method_data.qualname, id);
371+
self.process_generic_params(&generics, span, &method_data.qualname, id);
371372

372373
method_data.value = sig_str;
373-
method_data.sig = sig::method_signature(id, name, sig, &self.save_ctxt);
374+
method_data.sig = sig::method_signature(id, name, generics, sig, &self.save_ctxt);
374375
self.dumper.dump_def(vis == ast::Visibility::Public, method_data);
375376
}
376377

@@ -1007,6 +1008,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
10071008
body.as_ref().map(|x| &**x),
10081009
trait_item.id,
10091010
trait_item.ident,
1011+
&trait_item.generics,
10101012
ast::Visibility::Public,
10111013
trait_item.span);
10121014
}
@@ -1066,6 +1068,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
10661068
Some(body),
10671069
impl_item.id,
10681070
impl_item.ident,
1071+
&impl_item.generics,
10691072
impl_item.vis.clone(),
10701073
impl_item.span);
10711074
}

src/librustc_save_analysis/sig.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,14 @@ pub fn variant_signature(variant: &ast::Variant, scx: &SaveContext) -> Option<Si
7777

7878
pub fn method_signature(id: NodeId,
7979
ident: ast::Ident,
80+
generics: &ast::Generics,
8081
m: &ast::MethodSig,
8182
scx: &SaveContext)
8283
-> Option<Signature> {
8384
if !scx.config.signatures {
8485
return None;
8586
}
86-
make_method_signature(id, ident, m, scx).ok()
87+
make_method_signature(id, ident, generics, m, scx).ok()
8788
}
8889

8990
pub fn assoc_const_signature(id: NodeId,
@@ -895,6 +896,7 @@ fn make_assoc_const_signature(id: NodeId,
895896

896897
fn make_method_signature(id: NodeId,
897898
ident: ast::Ident,
899+
generics: &ast::Generics,
898900
m: &ast::MethodSig,
899901
scx: &SaveContext)
900902
-> Result {
@@ -915,7 +917,7 @@ fn make_method_signature(id: NodeId,
915917

916918
let mut sig = name_and_generics(text,
917919
0,
918-
&m.generics,
920+
generics,
919921
id,
920922
ident,
921923
scx)?;

src/librustc_typeck/check/compare_method.rs

+5-9
Original file line numberDiff line numberDiff line change
@@ -568,15 +568,11 @@ fn compare_number_of_generics<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
568568
let num_trait_m_type_params = trait_m_generics.types.len();
569569
if num_impl_m_type_params != num_trait_m_type_params {
570570
let impl_m_node_id = tcx.hir.as_local_node_id(impl_m.def_id).unwrap();
571-
let span = match tcx.hir.expect_impl_item(impl_m_node_id).node {
572-
ImplItemKind::Method(ref impl_m_sig, _) => {
573-
if impl_m_sig.generics.is_parameterized() {
574-
impl_m_sig.generics.span
575-
} else {
576-
impl_m_span
577-
}
578-
}
579-
_ => bug!("{:?} is not a method", impl_m),
571+
let impl_m_item = tcx.hir.expect_impl_item(impl_m_node_id);
572+
let span = if impl_m_item.generics.is_parameterized() {
573+
impl_m_item.generics.span
574+
} else {
575+
impl_m_span
580576
};
581577

582578
let mut err = struct_span_err!(tcx.sess,

0 commit comments

Comments
 (0)