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. (https://github.com/rust-lang/rust/issues/44265#issuecomment-331172238)

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
This commit is contained in:
bors
2017-10-24 01:20:09 +00:00
23 changed files with 107 additions and 125 deletions

View File

@@ -780,9 +780,7 @@ pub fn walk_fn_kind<'v, V: Visitor<'v>>(visitor: &mut V, function_kind: FnKind<'
FnKind::ItemFn(_, generics, ..) => { FnKind::ItemFn(_, generics, ..) => {
visitor.visit_generics(generics); visitor.visit_generics(generics);
} }
FnKind::Method(_, sig, ..) => { FnKind::Method(..) |
visitor.visit_generics(&sig.generics);
}
FnKind::Closure(_) => {} FnKind::Closure(_) => {}
} }
} }
@@ -802,6 +800,7 @@ pub fn walk_fn<'v, V: Visitor<'v>>(visitor: &mut V,
pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v TraitItem) { pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v TraitItem) {
visitor.visit_name(trait_item.span, trait_item.name); visitor.visit_name(trait_item.span, trait_item.name);
walk_list!(visitor, visit_attribute, &trait_item.attrs); walk_list!(visitor, visit_attribute, &trait_item.attrs);
visitor.visit_generics(&trait_item.generics);
match trait_item.node { match trait_item.node {
TraitItemKind::Const(ref ty, default) => { TraitItemKind::Const(ref ty, default) => {
visitor.visit_id(trait_item.id); 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
} }
TraitItemKind::Method(ref sig, TraitMethod::Required(ref names)) => { TraitItemKind::Method(ref sig, TraitMethod::Required(ref names)) => {
visitor.visit_id(trait_item.id); visitor.visit_id(trait_item.id);
visitor.visit_generics(&sig.generics);
visitor.visit_fn_decl(&sig.decl); visitor.visit_fn_decl(&sig.decl);
for name in names { for name in names {
visitor.visit_name(name.span, name.node); 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
ref vis, ref vis,
ref defaultness, ref defaultness,
ref attrs, ref attrs,
ref generics,
ref node, ref node,
span span
} = *impl_item; } = *impl_item;
@@ -860,6 +859,7 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
visitor.visit_vis(vis); visitor.visit_vis(vis);
visitor.visit_defaultness(defaultness); visitor.visit_defaultness(defaultness);
walk_list!(visitor, visit_attribute, attrs); walk_list!(visitor, visit_attribute, attrs);
visitor.visit_generics(generics);
match *node { match *node {
ImplItemKind::Const(ref ty, body) => { ImplItemKind::Const(ref ty, body) => {
visitor.visit_id(impl_item.id); visitor.visit_id(impl_item.id);

View File

@@ -1539,6 +1539,7 @@ impl<'a> LoweringContext<'a> {
hir_id, hir_id,
name: this.lower_ident(i.ident), name: this.lower_ident(i.ident),
attrs: this.lower_attrs(&i.attrs), attrs: this.lower_attrs(&i.attrs),
generics: this.lower_generics(&i.generics),
node: match i.node { node: match i.node {
TraitItemKind::Const(ref ty, ref default) => { TraitItemKind::Const(ref ty, ref default) => {
hir::TraitItemKind::Const(this.lower_ty(ty), hir::TraitItemKind::Const(this.lower_ty(ty),
@@ -1603,6 +1604,7 @@ impl<'a> LoweringContext<'a> {
hir_id, hir_id,
name: this.lower_ident(i.ident), name: this.lower_ident(i.ident),
attrs: this.lower_attrs(&i.attrs), attrs: this.lower_attrs(&i.attrs),
generics: this.lower_generics(&i.generics),
vis: this.lower_visibility(&i.vis, None), vis: this.lower_visibility(&i.vis, None),
defaultness: this.lower_defaultness(i.defaultness, true /* [1] */), defaultness: this.lower_defaultness(i.defaultness, true /* [1] */),
node: match i.node { node: match i.node {
@@ -1729,7 +1731,6 @@ impl<'a> LoweringContext<'a> {
fn lower_method_sig(&mut self, sig: &MethodSig) -> hir::MethodSig { fn lower_method_sig(&mut self, sig: &MethodSig) -> hir::MethodSig {
hir::MethodSig { hir::MethodSig {
generics: self.lower_generics(&sig.generics),
abi: sig.abi, abi: sig.abi,
unsafety: self.lower_unsafety(sig.unsafety), unsafety: self.lower_unsafety(sig.unsafety),
constness: self.lower_constness(sig.constness), constness: self.lower_constness(sig.constness),

View File

@@ -1295,7 +1295,6 @@ pub struct MethodSig {
pub constness: Constness, pub constness: Constness,
pub abi: Abi, pub abi: Abi,
pub decl: P<FnDecl>, pub decl: P<FnDecl>,
pub generics: Generics,
} }
// The bodies for items are stored "out of line", in a separate // The bodies for items are stored "out of line", in a separate
@@ -1316,6 +1315,7 @@ pub struct TraitItem {
pub name: Name, pub name: Name,
pub hir_id: HirId, pub hir_id: HirId,
pub attrs: HirVec<Attribute>, pub attrs: HirVec<Attribute>,
pub generics: Generics,
pub node: TraitItemKind, pub node: TraitItemKind,
pub span: Span, pub span: Span,
} }
@@ -1360,6 +1360,7 @@ pub struct ImplItem {
pub vis: Visibility, pub vis: Visibility,
pub defaultness: Defaultness, pub defaultness: Defaultness,
pub attrs: HirVec<Attribute>, pub attrs: HirVec<Attribute>,
pub generics: Generics,
pub node: ImplItemKind, pub node: ImplItemKind,
pub span: Span, pub span: Span,
} }

View File

@@ -880,6 +880,7 @@ impl<'a> State<'a> {
pub fn print_method_sig(&mut self, pub fn print_method_sig(&mut self,
name: ast::Name, name: ast::Name,
m: &hir::MethodSig, m: &hir::MethodSig,
generics: &hir::Generics,
vis: &hir::Visibility, vis: &hir::Visibility,
arg_names: &[Spanned<ast::Name>], arg_names: &[Spanned<ast::Name>],
body_id: Option<hir::BodyId>) body_id: Option<hir::BodyId>)
@@ -889,7 +890,7 @@ impl<'a> State<'a> {
m.constness, m.constness,
m.abi, m.abi,
Some(name), Some(name),
&m.generics, generics,
vis, vis,
arg_names, arg_names,
body_id) body_id)
@@ -905,12 +906,14 @@ impl<'a> State<'a> {
self.print_associated_const(ti.name, &ty, default, &hir::Inherited)?; self.print_associated_const(ti.name, &ty, default, &hir::Inherited)?;
} }
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref arg_names)) => { hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref arg_names)) => {
self.print_method_sig(ti.name, sig, &hir::Inherited, arg_names, None)?; self.print_method_sig(ti.name, sig, &ti.generics, &hir::Inherited, arg_names,
None)?;
self.s.word(";")?; self.s.word(";")?;
} }
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => { hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => {
self.head("")?; self.head("")?;
self.print_method_sig(ti.name, sig, &hir::Inherited, &[], Some(body))?; self.print_method_sig(ti.name, sig, &ti.generics, &hir::Inherited, &[],
Some(body))?;
self.nbsp()?; self.nbsp()?;
self.end()?; // need to close a box self.end()?; // need to close a box
self.end()?; // need to close a box self.end()?; // need to close a box
@@ -938,7 +941,7 @@ impl<'a> State<'a> {
} }
hir::ImplItemKind::Method(ref sig, body) => { hir::ImplItemKind::Method(ref sig, body) => {
self.head("")?; self.head("")?;
self.print_method_sig(ii.name, sig, &ii.vis, &[], Some(body))?; self.print_method_sig(ii.name, sig, &ii.generics, &ii.vis, &[], Some(body))?;
self.nbsp()?; self.nbsp()?;
self.end()?; // need to close a box self.end()?; // need to close a box
self.end()?; // need to close a box self.end()?; // need to close a box

View File

@@ -232,8 +232,7 @@ impl_stable_hash_for!(struct hir::MethodSig {
unsafety, unsafety,
constness, constness,
abi, abi,
decl, decl
generics
}); });
impl_stable_hash_for!(struct hir::TypeBinding { impl_stable_hash_for!(struct hir::TypeBinding {
@@ -709,6 +708,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for hir::TraitItem {
hir_id: _, hir_id: _,
name, name,
ref attrs, ref attrs,
ref generics,
ref node, ref node,
span span
} = *self; } = *self;
@@ -716,6 +716,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for hir::TraitItem {
hcx.hash_hir_item_like(attrs, |hcx| { hcx.hash_hir_item_like(attrs, |hcx| {
name.hash_stable(hcx, hasher); name.hash_stable(hcx, hasher);
attrs.hash_stable(hcx, hasher); attrs.hash_stable(hcx, hasher);
generics.hash_stable(hcx, hasher);
node.hash_stable(hcx, hasher); node.hash_stable(hcx, hasher);
span.hash_stable(hcx, hasher); span.hash_stable(hcx, hasher);
}); });
@@ -744,6 +745,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for hir::ImplItem {
ref vis, ref vis,
defaultness, defaultness,
ref attrs, ref attrs,
ref generics,
ref node, ref node,
span span
} = *self; } = *self;
@@ -753,6 +755,7 @@ impl<'gcx> HashStable<StableHashingContext<'gcx>> for hir::ImplItem {
vis.hash_stable(hcx, hasher); vis.hash_stable(hcx, hasher);
defaultness.hash_stable(hcx, hasher); defaultness.hash_stable(hcx, hasher);
attrs.hash_stable(hcx, hasher); attrs.hash_stable(hcx, hasher);
generics.hash_stable(hcx, hasher);
node.hash_stable(hcx, hasher); node.hash_stable(hcx, hasher);
span.hash_stable(hcx, hasher); span.hash_stable(hcx, hasher);
}); });

View File

@@ -58,11 +58,10 @@ fn item_might_be_inlined(item: &hir::Item) -> bool {
} }
fn method_might_be_inlined<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, fn method_might_be_inlined<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
sig: &hir::MethodSig,
impl_item: &hir::ImplItem, impl_item: &hir::ImplItem,
impl_src: DefId) -> bool { impl_src: DefId) -> bool {
if attr::requests_inline(&impl_item.attrs) || if attr::requests_inline(&impl_item.attrs) ||
generics_require_inlining(&sig.generics) { generics_require_inlining(&impl_item.generics) {
return true return true
} }
if let Some(impl_node_id) = tcx.hir.as_local_node_id(impl_src) { if let Some(impl_node_id) = tcx.hir.as_local_node_id(impl_src) {
@@ -176,8 +175,8 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
Some(hir_map::NodeImplItem(impl_item)) => { Some(hir_map::NodeImplItem(impl_item)) => {
match impl_item.node { match impl_item.node {
hir::ImplItemKind::Const(..) => true, hir::ImplItemKind::Const(..) => true,
hir::ImplItemKind::Method(ref sig, _) => { hir::ImplItemKind::Method(..) => {
if generics_require_inlining(&sig.generics) || if generics_require_inlining(&impl_item.generics) ||
attr::requests_inline(&impl_item.attrs) { attr::requests_inline(&impl_item.attrs) {
true true
} else { } else {
@@ -293,9 +292,9 @@ impl<'a, 'tcx> ReachableContext<'a, 'tcx> {
hir::ImplItemKind::Const(_, body) => { hir::ImplItemKind::Const(_, body) => {
self.visit_nested_body(body); self.visit_nested_body(body);
} }
hir::ImplItemKind::Method(ref sig, body) => { hir::ImplItemKind::Method(_, body) => {
let did = self.tcx.hir.get_parent_did(search_item); let did = self.tcx.hir.get_parent_did(search_item);
if method_might_be_inlined(self.tcx, sig, impl_item, did) { if method_might_be_inlined(self.tcx, impl_item, did) {
self.visit_nested_body(body) self.visit_nested_body(body)
} }
} }

View File

@@ -412,7 +412,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
if let hir::TraitItemKind::Method(ref sig, _) = trait_item.node { if let hir::TraitItemKind::Method(ref sig, _) = trait_item.node {
self.visit_early_late( self.visit_early_late(
Some(self.hir_map.get_parent(trait_item.id)), Some(self.hir_map.get_parent(trait_item.id)),
&sig.decl, &sig.generics, &sig.decl, &trait_item.generics,
|this| intravisit::walk_trait_item(this, trait_item)) |this| intravisit::walk_trait_item(this, trait_item))
} else { } else {
intravisit::walk_trait_item(self, trait_item); intravisit::walk_trait_item(self, trait_item);
@@ -423,7 +423,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
if let hir::ImplItemKind::Method(ref sig, _) = impl_item.node { if let hir::ImplItemKind::Method(ref sig, _) = impl_item.node {
self.visit_early_late( self.visit_early_late(
Some(self.hir_map.get_parent(impl_item.id)), Some(self.hir_map.get_parent(impl_item.id)),
&sig.decl, &sig.generics, &sig.decl, &impl_item.generics,
|this| intravisit::walk_impl_item(this, impl_item)) |this| intravisit::walk_impl_item(this, impl_item))
} else { } else {
intravisit::walk_impl_item(self, impl_item); intravisit::walk_impl_item(self, impl_item);

View File

@@ -718,12 +718,10 @@ impl<'a, 'tcx> Visitor<'tcx> for Resolver<'a> {
_: Span, _: Span,
node_id: NodeId) { node_id: NodeId) {
let rib_kind = match function_kind { let rib_kind = match function_kind {
FnKind::ItemFn(_, generics, ..) => { FnKind::ItemFn(..) => {
self.visit_generics(generics);
ItemRibKind ItemRibKind
} }
FnKind::Method(_, sig, _, _) => { FnKind::Method(_, sig, _, _) => {
self.visit_generics(&sig.generics);
MethodRibKind(!sig.decl.has_self()) MethodRibKind(!sig.decl.has_self())
} }
FnKind::Closure(_) => ClosureRibKind(node_id), FnKind::Closure(_) => ClosureRibKind(node_id),
@@ -1880,7 +1878,7 @@ impl<'a> Resolver<'a> {
} }
TraitItemKind::Method(ref sig, _) => { TraitItemKind::Method(ref sig, _) => {
let type_parameters = let type_parameters =
HasTypeParameters(&sig.generics, HasTypeParameters(&trait_item.generics,
MethodRibKind(!sig.decl.has_self())); MethodRibKind(!sig.decl.has_self()));
this.with_type_parameter_rib(type_parameters, |this| { this.with_type_parameter_rib(type_parameters, |this| {
visit::walk_trait_item(this, trait_item) visit::walk_trait_item(this, trait_item)
@@ -2099,7 +2097,7 @@ impl<'a> Resolver<'a> {
// We also need a new scope for the method- // We also need a new scope for the method-
// specific type parameters. // specific type parameters.
let type_parameters = let type_parameters =
HasTypeParameters(&sig.generics, HasTypeParameters(&impl_item.generics,
MethodRibKind(!sig.decl.has_self())); MethodRibKind(!sig.decl.has_self()));
this.with_type_parameter_rib(type_parameters, |this| { this.with_type_parameter_rib(type_parameters, |this| {
visit::walk_impl_item(this, impl_item); visit::walk_impl_item(this, impl_item);

View File

@@ -354,23 +354,24 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
body: Option<&'l ast::Block>, body: Option<&'l ast::Block>,
id: ast::NodeId, id: ast::NodeId,
name: ast::Ident, name: ast::Ident,
generics: &'l ast::Generics,
vis: ast::Visibility, vis: ast::Visibility,
span: Span) { span: Span) {
debug!("process_method: {}:{}", id, name); debug!("process_method: {}:{}", id, name);
if let Some(mut method_data) = self.save_ctxt.get_method_data(id, name.name, span) { if let Some(mut method_data) = self.save_ctxt.get_method_data(id, name.name, span) {
let sig_str = ::make_signature(&sig.decl, &sig.generics); let sig_str = ::make_signature(&sig.decl, &generics);
if body.is_some() { if body.is_some() {
self.nest_tables(id, |v| { self.nest_tables(id, |v| {
v.process_formals(&sig.decl.inputs, &method_data.qualname) v.process_formals(&sig.decl.inputs, &method_data.qualname)
}); });
} }
self.process_generic_params(&sig.generics, span, &method_data.qualname, id); self.process_generic_params(&generics, span, &method_data.qualname, id);
method_data.value = sig_str; method_data.value = sig_str;
method_data.sig = sig::method_signature(id, name, sig, &self.save_ctxt); method_data.sig = sig::method_signature(id, name, generics, sig, &self.save_ctxt);
self.dumper.dump_def(vis == ast::Visibility::Public, method_data); self.dumper.dump_def(vis == ast::Visibility::Public, method_data);
} }
@@ -1007,6 +1008,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
body.as_ref().map(|x| &**x), body.as_ref().map(|x| &**x),
trait_item.id, trait_item.id,
trait_item.ident, trait_item.ident,
&trait_item.generics,
ast::Visibility::Public, ast::Visibility::Public,
trait_item.span); trait_item.span);
} }
@@ -1066,6 +1068,7 @@ impl<'l, 'tcx: 'l, 'll, O: DumpOutput + 'll> DumpVisitor<'l, 'tcx, 'll, O> {
Some(body), Some(body),
impl_item.id, impl_item.id,
impl_item.ident, impl_item.ident,
&impl_item.generics,
impl_item.vis.clone(), impl_item.vis.clone(),
impl_item.span); impl_item.span);
} }

View File

@@ -77,13 +77,14 @@ pub fn variant_signature(variant: &ast::Variant, scx: &SaveContext) -> Option<Si
pub fn method_signature(id: NodeId, pub fn method_signature(id: NodeId,
ident: ast::Ident, ident: ast::Ident,
generics: &ast::Generics,
m: &ast::MethodSig, m: &ast::MethodSig,
scx: &SaveContext) scx: &SaveContext)
-> Option<Signature> { -> Option<Signature> {
if !scx.config.signatures { if !scx.config.signatures {
return None; return None;
} }
make_method_signature(id, ident, m, scx).ok() make_method_signature(id, ident, generics, m, scx).ok()
} }
pub fn assoc_const_signature(id: NodeId, pub fn assoc_const_signature(id: NodeId,
@@ -895,6 +896,7 @@ fn make_assoc_const_signature(id: NodeId,
fn make_method_signature(id: NodeId, fn make_method_signature(id: NodeId,
ident: ast::Ident, ident: ast::Ident,
generics: &ast::Generics,
m: &ast::MethodSig, m: &ast::MethodSig,
scx: &SaveContext) scx: &SaveContext)
-> Result { -> Result {
@@ -915,7 +917,7 @@ fn make_method_signature(id: NodeId,
let mut sig = name_and_generics(text, let mut sig = name_and_generics(text,
0, 0,
&m.generics, generics,
id, id,
ident, ident,
scx)?; scx)?;

View File

@@ -568,15 +568,11 @@ fn compare_number_of_generics<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let num_trait_m_type_params = trait_m_generics.types.len(); let num_trait_m_type_params = trait_m_generics.types.len();
if num_impl_m_type_params != num_trait_m_type_params { if num_impl_m_type_params != num_trait_m_type_params {
let impl_m_node_id = tcx.hir.as_local_node_id(impl_m.def_id).unwrap(); let impl_m_node_id = tcx.hir.as_local_node_id(impl_m.def_id).unwrap();
let span = match tcx.hir.expect_impl_item(impl_m_node_id).node { let impl_m_item = tcx.hir.expect_impl_item(impl_m_node_id);
ImplItemKind::Method(ref impl_m_sig, _) => { let span = if impl_m_item.generics.is_parameterized() {
if impl_m_sig.generics.is_parameterized() { impl_m_item.generics.span
impl_m_sig.generics.span } else {
} else { impl_m_span
impl_m_span
}
}
_ => bug!("{:?} is not a method", impl_m),
}; };
let mut err = struct_span_err!(tcx.sess, let mut err = struct_span_err!(tcx.sess,

View File

@@ -261,19 +261,9 @@ fn type_param_predicates<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let item_node_id = tcx.hir.as_local_node_id(item_def_id).unwrap(); let item_node_id = tcx.hir.as_local_node_id(item_def_id).unwrap();
let ast_generics = match tcx.hir.get(item_node_id) { let ast_generics = match tcx.hir.get(item_node_id) {
NodeTraitItem(item) => { NodeTraitItem(item) => &item.generics,
match item.node {
TraitItemKind::Method(ref sig, _) => &sig.generics,
_ => return result
}
}
NodeImplItem(item) => { NodeImplItem(item) => &item.generics,
match item.node {
ImplItemKind::Method(ref sig, _) => &sig.generics,
_ => return result
}
}
NodeItem(item) => { NodeItem(item) => {
match item.node { match item.node {
@@ -818,12 +808,12 @@ fn has_late_bound_regions<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
match node { match node {
hir_map::NodeTraitItem(item) => match item.node { hir_map::NodeTraitItem(item) => match item.node {
hir::TraitItemKind::Method(ref sig, _) => hir::TraitItemKind::Method(ref sig, _) =>
has_late_bound_regions(tcx, &sig.generics, &sig.decl), has_late_bound_regions(tcx, &item.generics, &sig.decl),
_ => None, _ => None,
}, },
hir_map::NodeImplItem(item) => match item.node { hir_map::NodeImplItem(item) => match item.node {
hir::ImplItemKind::Method(ref sig, _) => hir::ImplItemKind::Method(ref sig, _) =>
has_late_bound_regions(tcx, &sig.generics, &sig.decl), has_late_bound_regions(tcx, &item.generics, &sig.decl),
_ => None, _ => None,
}, },
hir_map::NodeForeignItem(item) => match item.node { hir_map::NodeForeignItem(item) => match item.node {
@@ -881,19 +871,9 @@ fn generics_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let no_generics = hir::Generics::empty(); let no_generics = hir::Generics::empty();
let ast_generics = match node { let ast_generics = match node {
NodeTraitItem(item) => { NodeTraitItem(item) => &item.generics,
match item.node {
TraitItemKind::Method(ref sig, _) => &sig.generics,
_ => &no_generics
}
}
NodeImplItem(item) => { NodeImplItem(item) => &item.generics,
match item.node {
ImplItemKind::Method(ref sig, _) => &sig.generics,
_ => &no_generics
}
}
NodeItem(item) => { NodeItem(item) => {
match item.node { match item.node {
@@ -1353,19 +1333,9 @@ fn explicit_predicates_of<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let icx = ItemCtxt::new(tcx, def_id); let icx = ItemCtxt::new(tcx, def_id);
let no_generics = hir::Generics::empty(); let no_generics = hir::Generics::empty();
let ast_generics = match node { let ast_generics = match node {
NodeTraitItem(item) => { NodeTraitItem(item) => &item.generics,
match item.node {
TraitItemKind::Method(ref sig, _) => &sig.generics,
_ => &no_generics
}
}
NodeImplItem(item) => { NodeImplItem(item) => &item.generics,
match item.node {
ImplItemKind::Method(ref sig, _) => &sig.generics,
_ => &no_generics
}
}
NodeItem(item) => { NodeItem(item) => {
match item.node { match item.node {

View File

@@ -1141,13 +1141,13 @@ pub struct Method {
pub abi: Abi, pub abi: Abi,
} }
impl<'a> Clean<Method> for (&'a hir::MethodSig, hir::BodyId) { impl<'a> Clean<Method> for (&'a hir::MethodSig, &'a hir::Generics, hir::BodyId) {
fn clean(&self, cx: &DocContext) -> Method { fn clean(&self, cx: &DocContext) -> Method {
Method { Method {
generics: self.0.generics.clean(cx), generics: self.1.clean(cx),
unsafety: self.0.unsafety, unsafety: self.0.unsafety,
constness: self.0.constness, constness: self.0.constness,
decl: (&*self.0.decl, self.1).clean(cx), decl: (&*self.0.decl, self.2).clean(cx),
abi: self.0.abi abi: self.0.abi
} }
} }
@@ -1380,13 +1380,13 @@ impl Clean<Item> for hir::TraitItem {
default.map(|e| print_const_expr(cx, e))) default.map(|e| print_const_expr(cx, e)))
} }
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => { hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Provided(body)) => {
MethodItem((sig, body).clean(cx)) MethodItem((sig, &self.generics, body).clean(cx))
} }
hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref names)) => { hir::TraitItemKind::Method(ref sig, hir::TraitMethod::Required(ref names)) => {
TyMethodItem(TyMethod { TyMethodItem(TyMethod {
unsafety: sig.unsafety.clone(), unsafety: sig.unsafety.clone(),
decl: (&*sig.decl, &names[..]).clean(cx), decl: (&*sig.decl, &names[..]).clean(cx),
generics: sig.generics.clean(cx), generics: self.generics.clean(cx),
abi: sig.abi abi: sig.abi
}) })
} }
@@ -1415,7 +1415,7 @@ impl Clean<Item> for hir::ImplItem {
Some(print_const_expr(cx, expr))) Some(print_const_expr(cx, expr)))
} }
hir::ImplItemKind::Method(ref sig, body) => { hir::ImplItemKind::Method(ref sig, body) => {
MethodItem((sig, body).clean(cx)) MethodItem((sig, &self.generics, body).clean(cx))
} }
hir::ImplItemKind::Type(ref ty) => TypedefItem(Typedef { hir::ImplItemKind::Type(ref ty) => TypedefItem(Typedef {
type_: ty.clean(cx), type_: ty.clean(cx),

View File

@@ -1178,7 +1178,6 @@ pub struct MethodSig {
pub constness: Spanned<Constness>, pub constness: Spanned<Constness>,
pub abi: Abi, pub abi: Abi,
pub decl: P<FnDecl>, pub decl: P<FnDecl>,
pub generics: Generics,
} }
/// Represents an item declaration within a trait declaration, /// Represents an item declaration within a trait declaration,
@@ -1190,6 +1189,7 @@ pub struct TraitItem {
pub id: NodeId, pub id: NodeId,
pub ident: Ident, pub ident: Ident,
pub attrs: Vec<Attribute>, pub attrs: Vec<Attribute>,
pub generics: Generics,
pub node: TraitItemKind, pub node: TraitItemKind,
pub span: Span, pub span: Span,
/// See `Item::tokens` for what this is /// See `Item::tokens` for what this is
@@ -1211,6 +1211,7 @@ pub struct ImplItem {
pub vis: Visibility, pub vis: Visibility,
pub defaultness: Defaultness, pub defaultness: Defaultness,
pub attrs: Vec<Attribute>, pub attrs: Vec<Attribute>,
pub generics: Generics,
pub node: ImplItemKind, pub node: ImplItemKind,
pub span: Span, pub span: Span,
/// See `Item::tokens` for what this is /// See `Item::tokens` for what this is

View File

@@ -32,6 +32,7 @@ pub fn placeholder(kind: ExpansionKind, id: ast::NodeId) -> Expansion {
let ident = keywords::Invalid.ident(); let ident = keywords::Invalid.ident();
let attrs = Vec::new(); let attrs = Vec::new();
let generics = ast::Generics::default();
let vis = ast::Visibility::Inherited; let vis = ast::Visibility::Inherited;
let span = DUMMY_SP; let span = DUMMY_SP;
let expr_placeholder = || P(ast::Expr { let expr_placeholder = || P(ast::Expr {
@@ -49,12 +50,12 @@ pub fn placeholder(kind: ExpansionKind, id: ast::NodeId) -> Expansion {
tokens: None, tokens: None,
}))), }))),
ExpansionKind::TraitItems => Expansion::TraitItems(SmallVector::one(ast::TraitItem { ExpansionKind::TraitItems => Expansion::TraitItems(SmallVector::one(ast::TraitItem {
id, span, ident, attrs, id, span, ident, attrs, generics,
node: ast::TraitItemKind::Macro(mac_placeholder()), node: ast::TraitItemKind::Macro(mac_placeholder()),
tokens: None, tokens: None,
})), })),
ExpansionKind::ImplItems => Expansion::ImplItems(SmallVector::one(ast::ImplItem { ExpansionKind::ImplItems => Expansion::ImplItems(SmallVector::one(ast::ImplItem {
id, span, ident, vis, attrs, id, span, ident, vis, attrs, generics,
node: ast::ImplItemKind::Macro(mac_placeholder()), node: ast::ImplItemKind::Macro(mac_placeholder()),
defaultness: ast::Defaultness::Final, defaultness: ast::Defaultness::Final,
tokens: None, tokens: None,

View File

@@ -1526,7 +1526,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
span: Span, span: Span,
_node_id: NodeId) { _node_id: NodeId) {
// check for const fn declarations // check for const fn declarations
if let FnKind::ItemFn(_, _, _, Spanned { node: ast::Constness::Const, .. }, _, _, _) = if let FnKind::ItemFn(_, _, Spanned { node: ast::Constness::Const, .. }, _, _, _) =
fn_kind { fn_kind {
gate_feature_post!(&self, const_fn, span, "const fn is unstable"); gate_feature_post!(&self, const_fn, span, "const fn is unstable");
} }
@@ -1536,7 +1536,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
// point. // point.
match fn_kind { match fn_kind {
FnKind::ItemFn(_, _, _, _, abi, _, _) | FnKind::ItemFn(_, _, _, abi, _, _) |
FnKind::Method(_, &ast::MethodSig { abi, .. }, _, _) => { FnKind::Method(_, &ast::MethodSig { abi, .. }, _, _) => {
self.check_abi(abi, span); self.check_abi(abi, span);
} }

View File

@@ -943,6 +943,7 @@ pub fn noop_fold_trait_item<T: Folder>(i: TraitItem, folder: &mut T)
id: folder.new_id(i.id), id: folder.new_id(i.id),
ident: folder.fold_ident(i.ident), ident: folder.fold_ident(i.ident),
attrs: fold_attrs(i.attrs, folder), attrs: fold_attrs(i.attrs, folder),
generics: folder.fold_generics(i.generics),
node: match i.node { node: match i.node {
TraitItemKind::Const(ty, default) => { TraitItemKind::Const(ty, default) => {
TraitItemKind::Const(folder.fold_ty(ty), TraitItemKind::Const(folder.fold_ty(ty),
@@ -972,6 +973,7 @@ pub fn noop_fold_impl_item<T: Folder>(i: ImplItem, folder: &mut T)
vis: folder.fold_vis(i.vis), vis: folder.fold_vis(i.vis),
ident: folder.fold_ident(i.ident), ident: folder.fold_ident(i.ident),
attrs: fold_attrs(i.attrs, folder), attrs: fold_attrs(i.attrs, folder),
generics: folder.fold_generics(i.generics),
defaultness: i.defaultness, defaultness: i.defaultness,
node: match i.node { node: match i.node {
ast::ImplItemKind::Const(ty, expr) => { ast::ImplItemKind::Const(ty, expr) => {
@@ -1074,7 +1076,6 @@ pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) -> For
pub fn noop_fold_method_sig<T: Folder>(sig: MethodSig, folder: &mut T) -> MethodSig { pub fn noop_fold_method_sig<T: Folder>(sig: MethodSig, folder: &mut T) -> MethodSig {
MethodSig { MethodSig {
generics: folder.fold_generics(sig.generics),
abi: sig.abi, abi: sig.abi,
unsafety: sig.unsafety, unsafety: sig.unsafety,
constness: sig.constness, constness: sig.constness,

View File

@@ -1287,10 +1287,10 @@ impl<'a> Parser<'a> {
mut attrs: Vec<Attribute>) -> PResult<'a, TraitItem> { mut attrs: Vec<Attribute>) -> PResult<'a, TraitItem> {
let lo = self.span; let lo = self.span;
let (name, node) = if self.eat_keyword(keywords::Type) { let (name, node, generics) = if self.eat_keyword(keywords::Type) {
let TyParam {ident, bounds, default, ..} = self.parse_ty_param(vec![])?; let TyParam {ident, bounds, default, ..} = self.parse_ty_param(vec![])?;
self.expect(&token::Semi)?; self.expect(&token::Semi)?;
(ident, TraitItemKind::Type(bounds, default)) (ident, TraitItemKind::Type(bounds, default), ast::Generics::default())
} else if self.is_const_item() { } else if self.is_const_item() {
self.expect_keyword(keywords::Const)?; self.expect_keyword(keywords::Const)?;
let ident = self.parse_ident()?; let ident = self.parse_ident()?;
@@ -1305,7 +1305,7 @@ impl<'a> Parser<'a> {
self.expect(&token::Semi)?; self.expect(&token::Semi)?;
None None
}; };
(ident, TraitItemKind::Const(ty, default)) (ident, TraitItemKind::Const(ty, default), ast::Generics::default())
} else if self.token.is_path_start() { } else if self.token.is_path_start() {
// trait item macro. // trait item macro.
// code copied from parse_macro_use_or_failure... abstraction! // code copied from parse_macro_use_or_failure... abstraction!
@@ -1328,7 +1328,7 @@ impl<'a> Parser<'a> {
} }
let mac = respan(lo.to(self.prev_span), Mac_ { path: pth, tts: tts }); let mac = respan(lo.to(self.prev_span), Mac_ { path: pth, tts: tts });
(keywords::Invalid.ident(), ast::TraitItemKind::Macro(mac)) (keywords::Invalid.ident(), ast::TraitItemKind::Macro(mac), ast::Generics::default())
} else { } else {
let (constness, unsafety, abi) = self.parse_fn_front_matter()?; let (constness, unsafety, abi) = self.parse_fn_front_matter()?;
@@ -1341,13 +1341,12 @@ impl<'a> Parser<'a> {
// definition... // definition...
p.parse_arg_general(false) p.parse_arg_general(false)
})?; })?;
generics.where_clause = self.parse_where_clause()?; generics.where_clause = self.parse_where_clause()?;
let sig = ast::MethodSig { let sig = ast::MethodSig {
unsafety, unsafety,
constness, constness,
decl: d, decl: d,
generics,
abi, abi,
}; };
@@ -1370,13 +1369,14 @@ impl<'a> Parser<'a> {
return Err(self.fatal(&format!("expected `;` or `{{`, found `{}`", token_str))); return Err(self.fatal(&format!("expected `;` or `{{`, found `{}`", token_str)));
} }
}; };
(ident, ast::TraitItemKind::Method(sig, body)) (ident, ast::TraitItemKind::Method(sig, body), generics)
}; };
Ok(TraitItem { Ok(TraitItem {
id: ast::DUMMY_NODE_ID, id: ast::DUMMY_NODE_ID,
ident: name, ident: name,
attrs, attrs,
generics,
node, node,
span: lo.to(self.prev_span), span: lo.to(self.prev_span),
tokens: None, tokens: None,
@@ -4901,12 +4901,12 @@ impl<'a> Parser<'a> {
let lo = self.span; let lo = self.span;
let vis = self.parse_visibility(false)?; let vis = self.parse_visibility(false)?;
let defaultness = self.parse_defaultness()?; let defaultness = self.parse_defaultness()?;
let (name, node) = if self.eat_keyword(keywords::Type) { let (name, node, generics) = if self.eat_keyword(keywords::Type) {
let name = self.parse_ident()?; let name = self.parse_ident()?;
self.expect(&token::Eq)?; self.expect(&token::Eq)?;
let typ = self.parse_ty()?; let typ = self.parse_ty()?;
self.expect(&token::Semi)?; self.expect(&token::Semi)?;
(name, ast::ImplItemKind::Type(typ)) (name, ast::ImplItemKind::Type(typ), ast::Generics::default())
} else if self.is_const_item() { } else if self.is_const_item() {
self.expect_keyword(keywords::Const)?; self.expect_keyword(keywords::Const)?;
let name = self.parse_ident()?; let name = self.parse_ident()?;
@@ -4915,11 +4915,11 @@ impl<'a> Parser<'a> {
self.expect(&token::Eq)?; self.expect(&token::Eq)?;
let expr = self.parse_expr()?; let expr = self.parse_expr()?;
self.expect(&token::Semi)?; self.expect(&token::Semi)?;
(name, ast::ImplItemKind::Const(typ, expr)) (name, ast::ImplItemKind::Const(typ, expr), ast::Generics::default())
} else { } else {
let (name, inner_attrs, node) = self.parse_impl_method(&vis, at_end)?; let (name, inner_attrs, generics, node) = self.parse_impl_method(&vis, at_end)?;
attrs.extend(inner_attrs); attrs.extend(inner_attrs);
(name, node) (name, node, generics)
}; };
Ok(ImplItem { Ok(ImplItem {
@@ -4929,6 +4929,7 @@ impl<'a> Parser<'a> {
vis, vis,
defaultness, defaultness,
attrs, attrs,
generics,
node, node,
tokens: None, tokens: None,
}) })
@@ -4986,7 +4987,8 @@ impl<'a> Parser<'a> {
/// Parse a method or a macro invocation in a trait impl. /// Parse a method or a macro invocation in a trait impl.
fn parse_impl_method(&mut self, vis: &Visibility, at_end: &mut bool) fn parse_impl_method(&mut self, vis: &Visibility, at_end: &mut bool)
-> PResult<'a, (Ident, Vec<ast::Attribute>, ast::ImplItemKind)> { -> PResult<'a, (Ident, Vec<ast::Attribute>, ast::Generics,
ast::ImplItemKind)> {
// code copied from parse_macro_use_or_failure... abstraction! // code copied from parse_macro_use_or_failure... abstraction!
if self.token.is_path_start() { if self.token.is_path_start() {
// Method macro. // Method macro.
@@ -5013,7 +5015,8 @@ impl<'a> Parser<'a> {
} }
let mac = respan(lo.to(self.prev_span), Mac_ { path: pth, tts: tts }); let mac = respan(lo.to(self.prev_span), Mac_ { path: pth, tts: tts });
Ok((keywords::Invalid.ident(), vec![], ast::ImplItemKind::Macro(mac))) Ok((keywords::Invalid.ident(), vec![], ast::Generics::default(),
ast::ImplItemKind::Macro(mac)))
} else { } else {
let (constness, unsafety, abi) = self.parse_fn_front_matter()?; let (constness, unsafety, abi) = self.parse_fn_front_matter()?;
let ident = self.parse_ident()?; let ident = self.parse_ident()?;
@@ -5022,8 +5025,7 @@ impl<'a> Parser<'a> {
generics.where_clause = self.parse_where_clause()?; generics.where_clause = self.parse_where_clause()?;
*at_end = true; *at_end = true;
let (inner_attrs, body) = self.parse_inner_attrs_and_block()?; let (inner_attrs, body) = self.parse_inner_attrs_and_block()?;
Ok((ident, inner_attrs, ast::ImplItemKind::Method(ast::MethodSig { Ok((ident, inner_attrs, generics, ast::ImplItemKind::Method(ast::MethodSig {
generics,
abi, abi,
unsafety, unsafety,
constness, constness,

View File

@@ -1525,6 +1525,7 @@ impl<'a> State<'a> {
pub fn print_method_sig(&mut self, pub fn print_method_sig(&mut self,
ident: ast::Ident, ident: ast::Ident,
generics: &ast::Generics,
m: &ast::MethodSig, m: &ast::MethodSig,
vis: &ast::Visibility) vis: &ast::Visibility)
-> io::Result<()> { -> io::Result<()> {
@@ -1533,7 +1534,7 @@ impl<'a> State<'a> {
m.constness.node, m.constness.node,
m.abi, m.abi,
Some(ident), Some(ident),
&m.generics, &generics,
vis) vis)
} }
@@ -1553,7 +1554,7 @@ impl<'a> State<'a> {
if body.is_some() { if body.is_some() {
self.head("")?; self.head("")?;
} }
self.print_method_sig(ti.ident, sig, &ast::Visibility::Inherited)?; self.print_method_sig(ti.ident, &ti.generics, sig, &ast::Visibility::Inherited)?;
if let Some(ref body) = *body { if let Some(ref body) = *body {
self.nbsp()?; self.nbsp()?;
self.print_block_with_attrs(body, &ti.attrs)?; self.print_block_with_attrs(body, &ti.attrs)?;
@@ -1592,7 +1593,7 @@ impl<'a> State<'a> {
} }
ast::ImplItemKind::Method(ref sig, ref body) => { ast::ImplItemKind::Method(ref sig, ref body) => {
self.head("")?; self.head("")?;
self.print_method_sig(ii.ident, sig, &ii.vis)?; self.print_method_sig(ii.ident, &ii.generics, sig, &ii.vis)?;
self.nbsp()?; self.nbsp()?;
self.print_block_with_attrs(body, &ii.attrs)?; self.print_block_with_attrs(body, &ii.attrs)?;
} }

View File

@@ -31,7 +31,7 @@ use codemap::Spanned;
#[derive(Copy, Clone, PartialEq, Eq)] #[derive(Copy, Clone, PartialEq, Eq)]
pub enum FnKind<'a> { pub enum FnKind<'a> {
/// fn foo() or extern "Abi" fn foo() /// fn foo() or extern "Abi" fn foo()
ItemFn(Ident, &'a Generics, Unsafety, Spanned<Constness>, Abi, &'a Visibility, &'a Block), ItemFn(Ident, Unsafety, Spanned<Constness>, Abi, &'a Visibility, &'a Block),
/// fn foo(&self) /// fn foo(&self)
Method(Ident, &'a MethodSig, Option<&'a Visibility>, &'a Block), Method(Ident, &'a MethodSig, Option<&'a Visibility>, &'a Block),
@@ -247,7 +247,8 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
visitor.visit_expr(expr); visitor.visit_expr(expr);
} }
ItemKind::Fn(ref declaration, unsafety, constness, abi, ref generics, ref body) => { ItemKind::Fn(ref declaration, unsafety, constness, abi, ref generics, ref body) => {
visitor.visit_fn(FnKind::ItemFn(item.ident, generics, unsafety, visitor.visit_generics(generics);
visitor.visit_fn(FnKind::ItemFn(item.ident, unsafety,
constness, abi, &item.vis, body), constness, abi, &item.vis, body),
declaration, declaration,
item.span, item.span,
@@ -538,13 +539,11 @@ pub fn walk_fn<'a, V>(visitor: &mut V, kind: FnKind<'a>, declaration: &'a FnDecl
where V: Visitor<'a>, where V: Visitor<'a>,
{ {
match kind { match kind {
FnKind::ItemFn(_, generics, _, _, _, _, body) => { FnKind::ItemFn(_, _, _, _, _, body) => {
visitor.visit_generics(generics);
walk_fn_decl(visitor, declaration); walk_fn_decl(visitor, declaration);
visitor.visit_block(body); visitor.visit_block(body);
} }
FnKind::Method(_, sig, _, body) => { FnKind::Method(_, _, _, body) => {
visitor.visit_generics(&sig.generics);
walk_fn_decl(visitor, declaration); walk_fn_decl(visitor, declaration);
visitor.visit_block(body); visitor.visit_block(body);
} }
@@ -558,13 +557,13 @@ pub fn walk_fn<'a, V>(visitor: &mut V, kind: FnKind<'a>, declaration: &'a FnDecl
pub fn walk_trait_item<'a, V: Visitor<'a>>(visitor: &mut V, trait_item: &'a TraitItem) { pub fn walk_trait_item<'a, V: Visitor<'a>>(visitor: &mut V, trait_item: &'a TraitItem) {
visitor.visit_ident(trait_item.span, trait_item.ident); visitor.visit_ident(trait_item.span, trait_item.ident);
walk_list!(visitor, visit_attribute, &trait_item.attrs); walk_list!(visitor, visit_attribute, &trait_item.attrs);
visitor.visit_generics(&trait_item.generics);
match trait_item.node { match trait_item.node {
TraitItemKind::Const(ref ty, ref default) => { TraitItemKind::Const(ref ty, ref default) => {
visitor.visit_ty(ty); visitor.visit_ty(ty);
walk_list!(visitor, visit_expr, default); walk_list!(visitor, visit_expr, default);
} }
TraitItemKind::Method(ref sig, None) => { TraitItemKind::Method(ref sig, None) => {
visitor.visit_generics(&sig.generics);
walk_fn_decl(visitor, &sig.decl); walk_fn_decl(visitor, &sig.decl);
} }
TraitItemKind::Method(ref sig, Some(ref body)) => { TraitItemKind::Method(ref sig, Some(ref body)) => {
@@ -585,6 +584,7 @@ pub fn walk_impl_item<'a, V: Visitor<'a>>(visitor: &mut V, impl_item: &'a ImplIt
visitor.visit_vis(&impl_item.vis); visitor.visit_vis(&impl_item.vis);
visitor.visit_ident(impl_item.span, impl_item.ident); visitor.visit_ident(impl_item.span, impl_item.ident);
walk_list!(visitor, visit_attribute, &impl_item.attrs); walk_list!(visitor, visit_attribute, &impl_item.attrs);
visitor.visit_generics(&impl_item.generics);
match impl_item.node { match impl_item.node {
ImplItemKind::Const(ref ty, ref expr) => { ImplItemKind::Const(ref ty, ref expr) => {
visitor.visit_ty(ty); visitor.visit_ty(ty);

View File

@@ -506,6 +506,7 @@ impl<'a> TraitDef<'a> {
vis: ast::Visibility::Inherited, vis: ast::Visibility::Inherited,
defaultness: ast::Defaultness::Final, defaultness: ast::Defaultness::Final,
attrs: Vec::new(), attrs: Vec::new(),
generics: Generics::default(),
node: ast::ImplItemKind::Type(type_def.to_ty(cx, self.span, type_ident, generics)), node: ast::ImplItemKind::Type(type_def.to_ty(cx, self.span, type_ident, generics)),
tokens: None, tokens: None,
} }
@@ -921,12 +922,12 @@ impl<'a> MethodDef<'a> {
ast::ImplItem { ast::ImplItem {
id: ast::DUMMY_NODE_ID, id: ast::DUMMY_NODE_ID,
attrs: self.attributes.clone(), attrs: self.attributes.clone(),
generics: fn_generics,
span: trait_.span, span: trait_.span,
vis: ast::Visibility::Inherited, vis: ast::Visibility::Inherited,
defaultness: ast::Defaultness::Final, defaultness: ast::Defaultness::Final,
ident: method_ident, ident: method_ident,
node: ast::ImplItemKind::Method(ast::MethodSig { node: ast::ImplItemKind::Method(ast::MethodSig {
generics: fn_generics,
abi, abi,
unsafety, unsafety,
constness: constness:

View File

@@ -370,9 +370,7 @@ impl Foo {
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
impl Foo { impl Foo {
// FIXME(michaelwoerister): This is curious but an unused lifetime parameter doesn't seem to #[rustc_clean(cfg="cfail2", except="Hir,HirBody,TypeckTables")]
// show up in any of the derived data structures.
#[rustc_clean(cfg="cfail2", except="Hir,HirBody")]
#[rustc_clean(cfg="cfail3")] #[rustc_clean(cfg="cfail3")]
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
@@ -395,7 +393,7 @@ impl Foo {
impl Foo { impl Foo {
#[rustc_clean( #[rustc_clean(
cfg="cfail2", cfg="cfail2",
except="Hir,HirBody,GenericsOfItem,PredicatesOfItem,TypeOfItem", except="Hir,HirBody,GenericsOfItem,PredicatesOfItem,TypeOfItem,TypeckTables",
)] )]
#[rustc_clean(cfg="cfail3")] #[rustc_clean(cfg="cfail3")]
#[rustc_metadata_dirty(cfg="cfail2")] #[rustc_metadata_dirty(cfg="cfail2")]
@@ -441,7 +439,8 @@ impl Foo {
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
impl Foo { impl Foo {
#[rustc_clean(cfg="cfail2", except="Hir,HirBody,GenericsOfItem,PredicatesOfItem,TypeOfItem")] #[rustc_clean(cfg="cfail2", except="Hir,HirBody,GenericsOfItem,PredicatesOfItem,\
TypeOfItem,TypeckTables")]
#[rustc_clean(cfg="cfail3")] #[rustc_clean(cfg="cfail3")]
#[rustc_metadata_dirty(cfg="cfail2")] #[rustc_metadata_dirty(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
@@ -462,7 +461,7 @@ impl Foo {
#[rustc_metadata_clean(cfg="cfail2")] #[rustc_metadata_clean(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]
impl Foo { impl Foo {
#[rustc_clean(cfg="cfail2", except="Hir,HirBody,PredicatesOfItem")] #[rustc_clean(cfg="cfail2", except="Hir,HirBody,PredicatesOfItem,TypeckTables")]
#[rustc_clean(cfg="cfail3")] #[rustc_clean(cfg="cfail3")]
#[rustc_metadata_dirty(cfg="cfail2")] #[rustc_metadata_dirty(cfg="cfail2")]
#[rustc_metadata_clean(cfg="cfail3")] #[rustc_metadata_clean(cfg="cfail3")]

View File

@@ -26,10 +26,10 @@
miri = "Broken" miri = "Broken"
# ping @Manishearth @llogiq @mcarton @oli-obk # ping @Manishearth @llogiq @mcarton @oli-obk
clippy = "Compiling" clippy = "Broken"
# ping @nrc # ping @nrc
rls = "Testing" rls = "Broken"
# ping @nrc # ping @nrc
rustfmt = "Testing" rustfmt = "Broken"