Container,
}
+/// Inheriting deprecations Nested items causes duplicate warnings.
+/// Inheriting the deprecation of `Foo<T>` onto the parameter `T`, would cause a duplicate warnings.
+#[derive(PartialEq, Copy, Clone)]
+enum InheritDeprecation {
+ Yes,
+ No,
+}
+
+impl InheritDeprecation {
+ fn yes(&self) -> bool {
+ *self == InheritDeprecation::Yes
+ }
+}
+
// A private tree-walker for producing an Index.
struct Annotator<'a, 'tcx> {
tcx: TyCtxt<'tcx>,
attrs: &[Attribute],
item_sp: Span,
kind: AnnotationKind,
- inherit_deprecation: bool,
+ inherit_deprecation: InheritDeprecation,
visit_children: F,
) where
F: FnOnce(&mut Self),
let depr_entry = DeprecationEntry::local(depr.clone(), hir_id);
self.index.depr_map.insert(hir_id, depr_entry);
} else if let Some(parent_depr) = self.parent_depr.clone() {
- if inherit_deprecation {
+ if inherit_deprecation.yes() {
is_deprecated = true;
info!("tagging child {:?} as deprecated from parent", hir_id);
self.index.depr_map.insert(hir_id, parent_depr);
if stab.is_none() {
debug!("annotate: stab not found, parent = {:?}", self.parent_stab);
if let Some(stab) = self.parent_stab {
- if inherit_deprecation && stab.level.is_unstable() {
+ if inherit_deprecation.yes() && stab.level.is_unstable() {
self.index.stab_map.insert(hir_id, stab);
}
}
}
// returns true if an error occurred, used to suppress some spurious errors
- fn forbid_staged_api_attrs(&mut self, hir_id: HirId, attrs: &[Attribute], inherit_deprecation: bool) -> bool {
+ fn forbid_staged_api_attrs(&mut self, hir_id: HirId, attrs: &[Attribute], inherit_deprecation: InheritDeprecation) -> bool {
// Emit errors for non-staged-api crates.
let unstable_attrs = [
sym::unstable,
// Propagate unstability. This can happen even for non-staged-api crates in case
// -Zforce-unstable-if-unmarked is set.
if let Some(stab) = self.parent_stab {
- if inherit_deprecation && stab.level.is_unstable() {
+ if inherit_deprecation.yes() && stab.level.is_unstable() {
self.index.stab_map.insert(hir_id, stab);
}
}
&i.attrs,
i.span,
AnnotationKind::Required,
- true,
+ InheritDeprecation::Yes,
|_| {},
)
}
_ => {}
}
- self.annotate(i.hir_id, &i.attrs, i.span, kind, true, |v| intravisit::walk_item(v, i));
+ self.annotate(i.hir_id, &i.attrs, i.span, kind, InheritDeprecation::Yes, |v| {
+ intravisit::walk_item(v, i)
+ });
self.in_trait_impl = orig_in_trait_impl;
}
fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem<'tcx>) {
- self.annotate(ti.hir_id, &ti.attrs, ti.span, AnnotationKind::Required, true, |v| {
- intravisit::walk_trait_item(v, ti);
- });
+ self.annotate(
+ ti.hir_id,
+ &ti.attrs,
+ ti.span,
+ AnnotationKind::Required,
+ InheritDeprecation::Yes,
+ |v| {
+ intravisit::walk_trait_item(v, ti);
+ },
+ );
}
fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem<'tcx>) {
let kind =
if self.in_trait_impl { AnnotationKind::Prohibited } else { AnnotationKind::Required };
- self.annotate(ii.hir_id, &ii.attrs, ii.span, kind, true, |v| {
+ self.annotate(ii.hir_id, &ii.attrs, ii.span, kind, InheritDeprecation::Yes, |v| {
intravisit::walk_impl_item(v, ii);
});
}
fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics<'tcx>, item_id: HirId) {
- self.annotate(var.id, &var.attrs, var.span, AnnotationKind::Required, true, |v| {
- if let Some(ctor_hir_id) = var.data.ctor_hir_id() {
- v.annotate(
- ctor_hir_id,
- &var.attrs,
- var.span,
- AnnotationKind::Required,
- true,
- |_| {},
- );
- }
+ self.annotate(
+ var.id,
+ &var.attrs,
+ var.span,
+ AnnotationKind::Required,
+ InheritDeprecation::Yes,
+ |v| {
+ if let Some(ctor_hir_id) = var.data.ctor_hir_id() {
+ v.annotate(
+ ctor_hir_id,
+ &var.attrs,
+ var.span,
+ AnnotationKind::Required,
+ InheritDeprecation::Yes,
+ |_| {},
+ );
+ }
- intravisit::walk_variant(v, var, g, item_id)
- })
+ intravisit::walk_variant(v, var, g, item_id)
+ },
+ )
}
fn visit_struct_field(&mut self, s: &'tcx StructField<'tcx>) {
- self.annotate(s.hir_id, &s.attrs, s.span, AnnotationKind::Required, true, |v| {
- intravisit::walk_struct_field(v, s);
- });
+ self.annotate(
+ s.hir_id,
+ &s.attrs,
+ s.span,
+ AnnotationKind::Required,
+ InheritDeprecation::Yes,
+ |v| {
+ intravisit::walk_struct_field(v, s);
+ },
+ );
}
fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) {
- self.annotate(i.hir_id, &i.attrs, i.span, AnnotationKind::Required, true, |v| {
- intravisit::walk_foreign_item(v, i);
- });
+ self.annotate(
+ i.hir_id,
+ &i.attrs,
+ i.span,
+ AnnotationKind::Required,
+ InheritDeprecation::Yes,
+ |v| {
+ intravisit::walk_foreign_item(v, i);
+ },
+ );
}
fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) {
- self.annotate(md.hir_id, &md.attrs, md.span, AnnotationKind::Required, true, |_| {});
+ self.annotate(
+ md.hir_id,
+ &md.attrs,
+ md.span,
+ AnnotationKind::Required,
+ InheritDeprecation::Yes,
+ |_| {},
+ );
}
fn visit_generic_param(&mut self, p: &'tcx hir::GenericParam<'tcx>) {
_ => AnnotationKind::Prohibited,
};
- self.annotate(p.hir_id, &p.attrs, p.span, kind, false, |v| {
+ self.annotate(p.hir_id, &p.attrs, p.span, kind, InheritDeprecation::No, |v| {
intravisit::walk_generic_param(v, p);
});
}
&krate.item.attrs,
krate.item.span,
AnnotationKind::Required,
- true,
+ InheritDeprecation::Yes,
|v| intravisit::walk_crate(v, krate),
);
}