Use Arena inside hir::ForeignItem.

This commit is contained in:
Camille GILLOT 2019-11-28 20:18:29 +01:00
parent abbe6259e1
commit acf33f2d6b
26 changed files with 72 additions and 63 deletions

View file

@ -126,6 +126,8 @@ macro_rules! arena_types {
[few] hir_forest: rustc::hir::map::Forest<$tcx>, [few] hir_forest: rustc::hir::map::Forest<$tcx>,
[] attribute: syntax::ast::Attribute, [] attribute: syntax::ast::Attribute,
[] global_asm: rustc::hir::GlobalAsm, [] global_asm: rustc::hir::GlobalAsm,
[] fn_decl: rustc::hir::FnDecl,
[] foreign_item: rustc::hir::ForeignItem<$tcx>,
[] impl_item_ref: rustc::hir::ImplItemRef, [] impl_item_ref: rustc::hir::ImplItemRef,
[] macro_def: rustc::hir::MacroDef<$tcx>, [] macro_def: rustc::hir::MacroDef<$tcx>,
[] path: rustc::hir::Path, [] path: rustc::hir::Path,

View file

@ -120,7 +120,7 @@ impl Target {
} }
} }
fn from_foreign_item(foreign_item: &hir::ForeignItem) -> Target { fn from_foreign_item(foreign_item: &hir::ForeignItem<'_>) -> Target {
match foreign_item.kind { match foreign_item.kind {
hir::ForeignItemKind::Fn(..) => Target::ForeignFn, hir::ForeignItemKind::Fn(..) => Target::ForeignFn,
hir::ForeignItemKind::Static(..) => Target::ForeignStatic, hir::ForeignItemKind::Static(..) => Target::ForeignStatic,
@ -504,7 +504,7 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> {
intravisit::walk_trait_item(self, trait_item) intravisit::walk_trait_item(self, trait_item)
} }
fn visit_foreign_item(&mut self, f_item: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, f_item: &'tcx hir::ForeignItem<'tcx>) {
let target = Target::from_foreign_item(f_item); let target = Target::from_foreign_item(f_item);
self.check_attributes(f_item.hir_id, &f_item.attrs, &f_item.span, target, None); self.check_attributes(f_item.hir_id, &f_item.attrs, &f_item.span, target, None);
intravisit::walk_foreign_item(self, f_item) intravisit::walk_foreign_item(self, f_item)

View file

@ -250,7 +250,7 @@ pub trait Visitor<'v>: Sized {
fn visit_mod(&mut self, m: &'v Mod, _s: Span, n: HirId) { fn visit_mod(&mut self, m: &'v Mod, _s: Span, n: HirId) {
walk_mod(self, m, n) walk_mod(self, m, n)
} }
fn visit_foreign_item(&mut self, i: &'v ForeignItem) { fn visit_foreign_item(&mut self, i: &'v ForeignItem<'v>) {
walk_foreign_item(self, i) walk_foreign_item(self, i)
} }
fn visit_local(&mut self, l: &'v Local) { fn visit_local(&mut self, l: &'v Local) {
@ -498,7 +498,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) {
} }
ItemKind::ForeignMod(ref foreign_module) => { ItemKind::ForeignMod(ref foreign_module) => {
visitor.visit_id(item.hir_id); visitor.visit_id(item.hir_id);
walk_list!(visitor, visit_foreign_item, &foreign_module.items); walk_list!(visitor, visit_foreign_item, foreign_module.items);
} }
ItemKind::GlobalAsm(_) => { ItemKind::GlobalAsm(_) => {
visitor.visit_id(item.hir_id); visitor.visit_id(item.hir_id);
@ -735,13 +735,13 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat) {
} }
} }
pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v ForeignItem) { pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v ForeignItem<'v>) {
visitor.visit_id(foreign_item.hir_id); visitor.visit_id(foreign_item.hir_id);
visitor.visit_vis(&foreign_item.vis); visitor.visit_vis(&foreign_item.vis);
visitor.visit_ident(foreign_item.ident); visitor.visit_ident(foreign_item.ident);
match foreign_item.kind { match foreign_item.kind {
ForeignItemKind::Fn(ref function_declaration, ref param_names, ref generics) => { ForeignItemKind::Fn(ref function_declaration, param_names, ref generics) => {
visitor.visit_generics(generics); visitor.visit_generics(generics);
visitor.visit_fn_decl(function_declaration); visitor.visit_fn_decl(function_declaration);
for &param_name in param_names { for &param_name in param_names {
@ -752,7 +752,7 @@ pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v
ForeignItemKind::Type => (), ForeignItemKind::Type => (),
} }
walk_list!(visitor, visit_attribute, &foreign_item.attrs); walk_list!(visitor, visit_attribute, foreign_item.attrs);
} }
pub fn walk_param_bound<'v, V: Visitor<'v>>(visitor: &mut V, bound: &'v GenericBound) { pub fn walk_param_bound<'v, V: Visitor<'v>>(visitor: &mut V, bound: &'v GenericBound) {

View file

@ -706,12 +706,12 @@ impl LoweringContext<'_, 'hir> {
respan(vis.span, vis_kind) respan(vis.span, vis_kind)
} }
fn lower_foreign_item(&mut self, i: &ForeignItem) -> hir::ForeignItem { fn lower_foreign_item(&mut self, i: &ForeignItem) -> hir::ForeignItem<'hir> {
let def_id = self.resolver.definitions().local_def_id(i.id); let def_id = self.resolver.definitions().local_def_id(i.id);
hir::ForeignItem { hir::ForeignItem {
hir_id: self.lower_node_id(i.id), hir_id: self.lower_node_id(i.id),
ident: i.ident, ident: i.ident,
attrs: self.lower_attrs(&i.attrs), attrs: self.lower_attrs_arena(&i.attrs),
kind: match i.kind { kind: match i.kind {
ForeignItemKind::Fn(ref fdec, ref generics) => { ForeignItemKind::Fn(ref fdec, ref generics) => {
let (generics, (fn_dec, fn_args)) = self.add_in_band_defs( let (generics, (fn_dec, fn_args)) = self.add_in_band_defs(
@ -726,12 +726,14 @@ impl LoweringContext<'_, 'hir> {
) )
}, },
); );
let fn_dec = self.arena.alloc(fn_dec.into_inner());
let fn_args = self.arena.alloc_from_iter(fn_args.into_iter());
hir::ForeignItemKind::Fn(fn_dec, fn_args, generics) hir::ForeignItemKind::Fn(fn_dec, fn_args, generics)
} }
ForeignItemKind::Static(ref t, m) => { ForeignItemKind::Static(ref t, m) => {
hir::ForeignItemKind::Static( hir::ForeignItemKind::Static(
self.lower_ty(t, ImplTraitContext::disallowed()), m) self.arena.alloc(self.lower_ty(t, ImplTraitContext::disallowed()).into_inner()), m)
} }
ForeignItemKind::Ty => hir::ForeignItemKind::Type, ForeignItemKind::Ty => hir::ForeignItemKind::Type,
ForeignItemKind::Macro(_) => panic!("macro shouldn't exist here"), ForeignItemKind::Macro(_) => panic!("macro shouldn't exist here"),
@ -741,13 +743,12 @@ impl LoweringContext<'_, 'hir> {
} }
} }
fn lower_foreign_mod(&mut self, fm: &ForeignMod) -> hir::ForeignMod { fn lower_foreign_mod(&mut self, fm: &ForeignMod) -> hir::ForeignMod<'hir> {
hir::ForeignMod { hir::ForeignMod {
abi: fm.abi.map_or(abi::Abi::C, |abi| self.lower_abi(abi)), abi: fm.abi.map_or(abi::Abi::C, |abi| self.lower_abi(abi)),
items: fm.items items: self.arena.alloc_from_iter(fm.items
.iter() .iter()
.map(|x| self.lower_foreign_item(x)) .map(|x| self.lower_foreign_item(x))),
.collect(),
} }
} }

View file

@ -385,7 +385,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> {
}); });
} }
fn visit_foreign_item(&mut self, foreign_item: &'hir ForeignItem) { fn visit_foreign_item(&mut self, foreign_item: &'hir ForeignItem<'hir>) {
self.insert(foreign_item.span, foreign_item.hir_id, Node::ForeignItem(foreign_item)); self.insert(foreign_item.span, foreign_item.hir_id, Node::ForeignItem(foreign_item));
self.with_parent(foreign_item.hir_id, |this| { self.with_parent(foreign_item.hir_id, |this| {

View file

@ -1002,7 +1002,7 @@ impl<'hir> Map<'hir> {
} }
} }
pub fn expect_foreign_item(&self, id: HirId) -> &'hir ForeignItem { pub fn expect_foreign_item(&self, id: HirId) -> &'hir ForeignItem<'hir> {
match self.find(id) { match self.find(id) {
Some(Node::ForeignItem(item)) => item, Some(Node::ForeignItem(item)) => item,
_ => bug!("expected foreign item, found {}", self.node_to_string(id)) _ => bug!("expected foreign item, found {}", self.node_to_string(id))
@ -1249,7 +1249,7 @@ trait Named {
impl<T:Named> Named for Spanned<T> { fn name(&self) -> Name { self.node.name() } } impl<T:Named> Named for Spanned<T> { fn name(&self) -> Name { self.node.name() } }
impl Named for Item<'_> { fn name(&self) -> Name { self.ident.name } } impl Named for Item<'_> { fn name(&self) -> Name { self.ident.name } }
impl Named for ForeignItem { fn name(&self) -> Name { self.ident.name } } impl Named for ForeignItem<'_> { fn name(&self) -> Name { self.ident.name } }
impl Named for Variant { fn name(&self) -> Name { self.ident.name } } impl Named for Variant { fn name(&self) -> Name { self.ident.name } }
impl Named for StructField { fn name(&self) -> Name { self.ident.name } } impl Named for StructField { fn name(&self) -> Name { self.ident.name } }
impl Named for TraitItem { fn name(&self) -> Name { self.ident.name } } impl Named for TraitItem { fn name(&self) -> Name { self.ident.name } }

View file

@ -2252,9 +2252,9 @@ pub struct Mod {
} }
#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] #[derive(RustcEncodable, RustcDecodable, Debug, HashStable)]
pub struct ForeignMod { pub struct ForeignMod<'hir> {
pub abi: Abi, pub abi: Abi,
pub items: HirVec<ForeignItem>, pub items: &'hir [ForeignItem<'hir>],
} }
#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] #[derive(RustcEncodable, RustcDecodable, Debug, HashStable)]
@ -2491,7 +2491,7 @@ pub enum ItemKind<'hir> {
/// A module. /// A module.
Mod(Mod), Mod(Mod),
/// An external module, e.g. `extern { .. }`. /// An external module, e.g. `extern { .. }`.
ForeignMod(ForeignMod), ForeignMod(ForeignMod<'hir>),
/// Module-level inline assembly (from `global_asm!`). /// Module-level inline assembly (from `global_asm!`).
GlobalAsm(&'hir GlobalAsm), GlobalAsm(&'hir GlobalAsm),
/// A type alias, e.g., `type Foo = Bar<u8>`. /// A type alias, e.g., `type Foo = Bar<u8>`.
@ -2607,11 +2607,11 @@ pub enum AssocItemKind {
} }
#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] #[derive(RustcEncodable, RustcDecodable, Debug, HashStable)]
pub struct ForeignItem { pub struct ForeignItem<'hir> {
#[stable_hasher(project(name))] #[stable_hasher(project(name))]
pub ident: Ident, pub ident: Ident,
pub attrs: HirVec<Attribute>, pub attrs: &'hir [Attribute],
pub kind: ForeignItemKind, pub kind: ForeignItemKind<'hir>,
pub hir_id: HirId, pub hir_id: HirId,
pub span: Span, pub span: Span,
pub vis: Visibility, pub vis: Visibility,
@ -2619,16 +2619,16 @@ pub struct ForeignItem {
/// An item within an `extern` block. /// An item within an `extern` block.
#[derive(RustcEncodable, RustcDecodable, Debug, HashStable)] #[derive(RustcEncodable, RustcDecodable, Debug, HashStable)]
pub enum ForeignItemKind { pub enum ForeignItemKind<'hir> {
/// A foreign function. /// A foreign function.
Fn(P<FnDecl>, HirVec<Ident>, Generics), Fn(&'hir FnDecl, &'hir [Ident], Generics),
/// A foreign static item (`static ext: u8`). /// A foreign static item (`static ext: u8`).
Static(P<Ty>, Mutability), Static(&'hir Ty, Mutability),
/// A foreign type. /// A foreign type.
Type, Type,
} }
impl ForeignItemKind { impl ForeignItemKind<'hir> {
pub fn descriptive_variant(&self) -> &str { pub fn descriptive_variant(&self) -> &str {
match *self { match *self {
ForeignItemKind::Fn(..) => "foreign function", ForeignItemKind::Fn(..) => "foreign function",
@ -2788,7 +2788,7 @@ impl CodegenFnAttrs {
pub enum Node<'hir> { pub enum Node<'hir> {
Param(&'hir Param), Param(&'hir Param),
Item(&'hir Item<'hir>), Item(&'hir Item<'hir>),
ForeignItem(&'hir ForeignItem), ForeignItem(&'hir ForeignItem<'hir>),
TraitItem(&'hir TraitItem), TraitItem(&'hir TraitItem),
ImplItem(&'hir ImplItem), ImplItem(&'hir ImplItem),
Variant(&'hir Variant), Variant(&'hir Variant),

View file

@ -267,11 +267,11 @@ impl<'a> State<'a> {
} }
pub fn print_foreign_mod(&mut self, pub fn print_foreign_mod(&mut self,
nmod: &hir::ForeignMod, nmod: &hir::ForeignMod<'_>,
attrs: &[ast::Attribute]) attrs: &[ast::Attribute])
{ {
self.print_inner_attributes(attrs); self.print_inner_attributes(attrs);
for item in &nmod.items { for item in nmod.items {
self.print_foreign_item(item); self.print_foreign_item(item);
} }
} }
@ -361,7 +361,7 @@ impl<'a> State<'a> {
self.end() self.end()
} }
pub fn print_foreign_item(&mut self, item: &hir::ForeignItem) { pub fn print_foreign_item(&mut self, item: &hir::ForeignItem<'_>) {
self.hardbreak_if_not_bol(); self.hardbreak_if_not_bol();
self.maybe_print_comment(item.span.lo()); self.maybe_print_comment(item.span.lo());
self.print_outer_attributes(&item.attrs); self.print_outer_attributes(&item.attrs);

View file

@ -943,7 +943,7 @@ for LateContextAndPass<'a, 'tcx, T> {
self.context.generics = generics; self.context.generics = generics;
} }
fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) {
self.with_lint_attrs(it.hir_id, &it.attrs, |cx| { self.with_lint_attrs(it.hir_id, &it.attrs, |cx| {
cx.with_param_env(it.hir_id, |cx| { cx.with_param_env(it.hir_id, |cx| {
lint_callback!(cx, check_foreign_item, it); lint_callback!(cx, check_foreign_item, it);

View file

@ -94,8 +94,8 @@ macro_rules! late_lint_methods {
fn check_crate_post(a: &$hir hir::Crate<$hir>); fn check_crate_post(a: &$hir hir::Crate<$hir>);
fn check_mod(a: &$hir hir::Mod, b: Span, c: hir::HirId); fn check_mod(a: &$hir hir::Mod, b: Span, c: hir::HirId);
fn check_mod_post(a: &$hir hir::Mod, b: Span, c: hir::HirId); fn check_mod_post(a: &$hir hir::Mod, b: Span, c: hir::HirId);
fn check_foreign_item(a: &$hir hir::ForeignItem); fn check_foreign_item(a: &$hir hir::ForeignItem<$hir>);
fn check_foreign_item_post(a: &$hir hir::ForeignItem); fn check_foreign_item_post(a: &$hir hir::ForeignItem<$hir>);
fn check_item(a: &$hir hir::Item<$hir>); fn check_item(a: &$hir hir::Item<$hir>);
fn check_item_post(a: &$hir hir::Item<$hir>); fn check_item_post(a: &$hir hir::Item<$hir>);
fn check_local(a: &$hir hir::Local); fn check_local(a: &$hir hir::Local);
@ -610,7 +610,7 @@ impl intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> {
}); });
} }
fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) {
self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { self.with_lint_attrs(it.hir_id, &it.attrs, |builder| {
intravisit::walk_foreign_item(builder, it); intravisit::walk_foreign_item(builder, it);
}) })

View file

@ -536,7 +536,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> {
} }
} }
fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) {
match item.kind { match item.kind {
hir::ForeignItemKind::Fn(ref decl, _, ref generics) => { hir::ForeignItemKind::Fn(ref decl, _, ref generics) => {
self.visit_early_late(None, decl, generics, |this| { self.visit_early_late(None, decl, generics, |this| {

View file

@ -318,7 +318,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
}); });
} }
fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) {
self.annotate(i.hir_id, &i.attrs, i.span, AnnotationKind::Required, |v| { self.annotate(i.hir_id, &i.attrs, i.span, AnnotationKind::Required, |v| {
intravisit::walk_foreign_item(v, i); intravisit::walk_foreign_item(v, i);
}); });
@ -392,7 +392,7 @@ impl<'a, 'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'a, 'tcx> {
intravisit::walk_struct_field(self, s); intravisit::walk_struct_field(self, s);
} }
fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) {
self.check_missing_stability(i.hir_id, i.span, i.kind.descriptive_variant()); self.check_missing_stability(i.hir_id, i.span, i.kind.descriptive_variant());
intravisit::walk_foreign_item(self, i); intravisit::walk_foreign_item(self, i);
} }

View file

@ -136,7 +136,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for Context<'a, 'tcx> {
NestedVisitorMap::None NestedVisitorMap::None
} }
fn visit_foreign_item(&mut self, i: &hir::ForeignItem) { fn visit_foreign_item(&mut self, i: &hir::ForeignItem<'_>) {
if let Some((lang_item, _)) = lang_items::extract(&i.attrs) { if let Some((lang_item, _)) = lang_items::extract(&i.attrs) {
self.register(lang_item, i.span); self.register(lang_item, i.span);
} }

View file

@ -996,7 +996,7 @@ impl<'a, 'tcx> LateLintPass<'a, 'tcx> for UnreachablePub {
self.perform_lint(cx, "item", item.hir_id, &item.vis, item.span, true); self.perform_lint(cx, "item", item.hir_id, &item.vis, item.span, true);
} }
fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, foreign_item: &hir::ForeignItem) { fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, foreign_item: &hir::ForeignItem<'tcx>) {
self.perform_lint(cx, "item", foreign_item.hir_id, &foreign_item.vis, self.perform_lint(cx, "item", foreign_item.hir_id, &foreign_item.vis,
foreign_item.span, true); foreign_item.span, true);
} }

View file

@ -1009,7 +1009,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
} }
impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes { impl<'a, 'tcx> LateLintPass<'a, 'tcx> for ImproperCTypes {
fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::ForeignItem) { fn check_foreign_item(&mut self, cx: &LateContext<'_, '_>, it: &hir::ForeignItem<'_>) {
let mut vis = ImproperCTypesVisitor { cx }; let mut vis = ImproperCTypesVisitor { cx };
let abi = cx.tcx.hir().get_foreign_abi(it.hir_id); let abi = cx.tcx.hir().get_foreign_abi(it.hir_id);
if let Abi::Rust | Abi::RustCall | Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi { if let Abi::Rust | Abi::RustCall | Abi::RustIntrinsic | Abi::PlatformIntrinsic = abi {

View file

@ -1525,7 +1525,7 @@ impl EncodeContext<'tcx> {
fn encode_info_for_foreign_item( fn encode_info_for_foreign_item(
&mut self, &mut self,
def_id: DefId, def_id: DefId,
nitem: &hir::ForeignItem, nitem: &hir::ForeignItem<'_>,
) { ) {
let tcx = self.tcx; let tcx = self.tcx;
@ -1551,7 +1551,7 @@ impl EncodeContext<'tcx> {
record!(self.per_def.visibility[def_id] <- record!(self.per_def.visibility[def_id] <-
ty::Visibility::from_hir(&nitem.vis, nitem.hir_id, self.tcx)); ty::Visibility::from_hir(&nitem.vis, nitem.hir_id, self.tcx));
record!(self.per_def.span[def_id] <- nitem.span); record!(self.per_def.span[def_id] <- nitem.span);
record!(self.per_def.attributes[def_id] <- &nitem.attrs); record!(self.per_def.attributes[def_id] <- nitem.attrs);
self.encode_stability(def_id); self.encode_stability(def_id);
self.encode_const_stability(def_id); self.encode_const_stability(def_id);
self.encode_deprecation(def_id); self.encode_deprecation(def_id);
@ -1590,7 +1590,7 @@ impl Visitor<'tcx> for EncodeContext<'tcx> {
} }
self.encode_addl_info_for_item(item); self.encode_addl_info_for_item(item);
} }
fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem<'tcx>) {
intravisit::walk_foreign_item(self, ni); intravisit::walk_foreign_item(self, ni);
let def_id = self.tcx.hir().local_def_id(ni.hir_id); let def_id = self.tcx.hir().local_def_id(ni.hir_id);
self.encode_info_for_foreign_item(def_id, ni); self.encode_info_for_foreign_item(def_id, ni);

View file

@ -510,7 +510,7 @@ impl DeadVisitor<'tcx> {
&variant.attrs) &variant.attrs)
} }
fn should_warn_about_foreign_item(&mut self, fi: &hir::ForeignItem) -> bool { fn should_warn_about_foreign_item(&mut self, fi: &hir::ForeignItem<'_>) -> bool {
!self.symbol_is_live(fi.hir_id) !self.symbol_is_live(fi.hir_id)
&& !has_allow_dead_code_or_lang_attr(self.tcx, fi.hir_id, &fi.attrs) && !has_allow_dead_code_or_lang_attr(self.tcx, fi.hir_id, &fi.attrs)
} }
@ -621,7 +621,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> {
} }
} }
fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem<'tcx>) {
if self.should_warn_about_foreign_item(fi) { if self.should_warn_about_foreign_item(fi) {
self.warn_dead_code(fi.hir_id, fi.span, fi.ident.name, self.warn_dead_code(fi.hir_id, fi.span, fi.ident.name,
fi.kind.descriptive_variant(), "used"); fi.kind.descriptive_variant(), "used");

View file

@ -133,7 +133,7 @@ impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> {
hir_visit::walk_mod(self, m, n) hir_visit::walk_mod(self, m, n)
} }
fn visit_foreign_item(&mut self, i: &'v hir::ForeignItem) { fn visit_foreign_item(&mut self, i: &'v hir::ForeignItem<'v>) {
self.record("ForeignItem", Id::Node(i.hir_id), i); self.record("ForeignItem", Id::Node(i.hir_id), i);
hir_visit::walk_foreign_item(self, i) hir_visit::walk_foreign_item(self, i)
} }

View file

@ -708,7 +708,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> {
} }
} }
hir::ItemKind::ForeignMod(ref foreign_mod) => { hir::ItemKind::ForeignMod(ref foreign_mod) => {
for foreign_item in &foreign_mod.items { for foreign_item in foreign_mod.items {
if foreign_item.vis.node.is_pub() { if foreign_item.vis.node.is_pub() {
self.update(foreign_item.hir_id, item_level); self.update(foreign_item.hir_id, item_level);
} }
@ -812,7 +812,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> {
} }
// Visit everything, but foreign items have their own levels. // Visit everything, but foreign items have their own levels.
hir::ItemKind::ForeignMod(ref foreign_mod) => { hir::ItemKind::ForeignMod(ref foreign_mod) => {
for foreign_item in &foreign_mod.items { for foreign_item in foreign_mod.items {
let foreign_item_level = self.get(foreign_item.hir_id); let foreign_item_level = self.get(foreign_item.hir_id);
if foreign_item_level.is_some() { if foreign_item_level.is_some() {
self.reach(foreign_item.hir_id, foreign_item_level) self.reach(foreign_item.hir_id, foreign_item_level)
@ -1621,7 +1621,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> {
} }
} }
fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem) { fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) {
if self.access_levels.is_reachable(item.hir_id) { if self.access_levels.is_reachable(item.hir_id) {
intravisit::walk_foreign_item(self, item) intravisit::walk_foreign_item(self, item)
} }
@ -1898,7 +1898,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx>
} }
// Subitems of foreign modules have their own publicity. // Subitems of foreign modules have their own publicity.
hir::ItemKind::ForeignMod(ref foreign_mod) => { hir::ItemKind::ForeignMod(ref foreign_mod) => {
for foreign_item in &foreign_mod.items { for foreign_item in foreign_mod.items {
let vis = ty::Visibility::from_hir(&foreign_item.vis, item.hir_id, tcx); let vis = ty::Visibility::from_hir(&foreign_item.vis, item.hir_id, tcx);
self.check(foreign_item.hir_id, vis).generics().predicates().ty(); self.check(foreign_item.hir_id, vis).generics().predicates().ty();
} }

View file

@ -17,7 +17,7 @@ use std::iter;
fn equate_intrinsic_type<'tcx>( fn equate_intrinsic_type<'tcx>(
tcx: TyCtxt<'tcx>, tcx: TyCtxt<'tcx>,
it: &hir::ForeignItem, it: &hir::ForeignItem<'_>,
n_tps: usize, n_tps: usize,
abi: Abi, abi: Abi,
safety: hir::Unsafety, safety: hir::Unsafety,
@ -83,7 +83,7 @@ pub fn intrinsic_operation_unsafety(intrinsic: &str) -> hir::Unsafety {
/// Remember to add all intrinsics here, in librustc_codegen_llvm/intrinsic.rs, /// Remember to add all intrinsics here, in librustc_codegen_llvm/intrinsic.rs,
/// and in libcore/intrinsics.rs /// and in libcore/intrinsics.rs
pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem) { pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
let param = |n| tcx.mk_ty_param(n, Symbol::intern(&format!("P{}", n))); let param = |n| tcx.mk_ty_param(n, Symbol::intern(&format!("P{}", n)));
let name = it.ident.as_str(); let name = it.ident.as_str();
@ -399,7 +399,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem) {
} }
/// Type-check `extern "platform-intrinsic" { ... }` functions. /// Type-check `extern "platform-intrinsic" { ... }` functions.
pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem) { pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) {
let param = |n| { let param = |n| {
let name = Symbol::intern(&format!("P{}", n)); let name = Symbol::intern(&format!("P{}", n));
tcx.mk_ty_param(n, name) tcx.mk_ty_param(n, name)

View file

@ -1766,15 +1766,15 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) {
check_abi(tcx, it.span, m.abi); check_abi(tcx, it.span, m.abi);
if m.abi == Abi::RustIntrinsic { if m.abi == Abi::RustIntrinsic {
for item in &m.items { for item in m.items {
intrinsic::check_intrinsic_type(tcx, item); intrinsic::check_intrinsic_type(tcx, item);
} }
} else if m.abi == Abi::PlatformIntrinsic { } else if m.abi == Abi::PlatformIntrinsic {
for item in &m.items { for item in m.items {
intrinsic::check_platform_intrinsic_type(tcx, item); intrinsic::check_platform_intrinsic_type(tcx, item);
} }
} else { } else {
for item in &m.items { for item in m.items {
let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id)); let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id));
let own_counts = generics.own_counts(); let own_counts = generics.own_counts();
if generics.params.len() - own_counts.lifetimes != 0 { if generics.params.len() - own_counts.lifetimes != 0 {
@ -4689,7 +4689,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
Some(Node::ForeignItem(hir::ForeignItem { Some(Node::ForeignItem(hir::ForeignItem {
kind: hir::ForeignItemKind::Fn(_, idents, _), kind: hir::ForeignItemKind::Fn(_, idents, _),
.. ..
})) | })) => sugg_call = idents.iter()
.map(|ident| if ident.name != kw::SelfLower {
ident.to_string()
} else {
"_".to_string()
}).collect::<Vec<_>>()
.join(", "),
Some(Node::TraitItem(hir::TraitItem { Some(Node::TraitItem(hir::TraitItem {
kind: hir::TraitItemKind::Method(.., hir::TraitMethod::Required(idents)), kind: hir::TraitItemKind::Method(.., hir::TraitMethod::Required(idents)),
.. ..

View file

@ -417,7 +417,7 @@ fn convert_item(tcx: TyCtxt<'_>, item_id: hir::HirId) {
| hir::ItemKind::Mod(_) | hir::ItemKind::Mod(_)
| hir::ItemKind::GlobalAsm(_) => {} | hir::ItemKind::GlobalAsm(_) => {}
hir::ItemKind::ForeignMod(ref foreign_mod) => { hir::ItemKind::ForeignMod(ref foreign_mod) => {
for item in &foreign_mod.items { for item in foreign_mod.items {
let def_id = tcx.hir().local_def_id(item.hir_id); let def_id = tcx.hir().local_def_id(item.hir_id);
tcx.generics_of(def_id); tcx.generics_of(def_id);
tcx.type_of(def_id); tcx.type_of(def_id);

View file

@ -93,7 +93,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for ConstraintContext<'a, 'tcx> {
} }
hir::ItemKind::ForeignMod(ref foreign_mod) => { hir::ItemKind::ForeignMod(ref foreign_mod) => {
for foreign_item in &foreign_mod.items { for foreign_item in foreign_mod.items {
if let hir::ForeignItemKind::Fn(..) = foreign_item.kind { if let hir::ForeignItemKind::Fn(..) = foreign_item.kind {
self.visit_node_helper(foreign_item.hir_id); self.visit_node_helper(foreign_item.hir_id);
} }

View file

@ -156,7 +156,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for TermsContext<'a, 'tcx> {
} }
hir::ItemKind::ForeignMod(ref foreign_mod) => { hir::ItemKind::ForeignMod(ref foreign_mod) => {
for foreign_item in &foreign_mod.items { for foreign_item in foreign_mod.items {
if let hir::ForeignItemKind::Fn(..) = foreign_item.kind { if let hir::ForeignItemKind::Fn(..) = foreign_item.kind {
self.add_inferreds_for_item(foreign_item.hir_id); self.add_inferreds_for_item(foreign_item.hir_id);
} }

View file

@ -217,7 +217,7 @@ pub struct ForeignItem<'hir> {
pub vis: &'hir hir::Visibility, pub vis: &'hir hir::Visibility,
pub id: hir::HirId, pub id: hir::HirId,
pub name: Name, pub name: Name,
pub kind: &'hir hir::ForeignItemKind, pub kind: &'hir hir::ForeignItemKind<'hir>,
pub attrs: &'hir [ast::Attribute], pub attrs: &'hir [ast::Attribute],
pub whence: Span, pub whence: Span,
} }

View file

@ -363,7 +363,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
match item.kind { match item.kind {
hir::ItemKind::ForeignMod(ref fm) => { hir::ItemKind::ForeignMod(ref fm) => {
for item in &fm.items { for item in fm.items {
self.visit_foreign_item(item, None, om); self.visit_foreign_item(item, None, om);
} }
} }