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:
@@ -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);
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)?;
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)?;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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")]
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user