Add documentation
This commit is contained in:
parent
3947591ee8
commit
19e90843a4
@ -395,7 +395,7 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
/// This function will also check if the item is deprecated.
|
||||
/// If so, and `id` is not `None`, a deprecated lint attached to `id` will be emitted.
|
||||
pub fn check_stability(self, def_id: DefId, id: Option<HirId>, span: Span) {
|
||||
self.check_stability_internal(def_id, id, span, |span, def_id| {
|
||||
self.check_optional_stability(def_id, id, span, |span, def_id| {
|
||||
// The API could be uncallable for other reasons, for example when a private module
|
||||
// was referenced.
|
||||
self.sess.delay_span_bug(span, &format!("encountered unmarked API: {:?}", def_id));
|
||||
@ -409,7 +409,10 @@ impl<'tcx> TyCtxt<'tcx> {
|
||||
///
|
||||
/// This function will also check if the item is deprecated.
|
||||
/// If so, and `id` is not `None`, a deprecated lint attached to `id` will be emitted.
|
||||
pub fn check_stability_internal(
|
||||
///
|
||||
/// The `unmarked` closure is called definitions without a stability annotation.
|
||||
/// This is needed for generic parameters, since they may not be marked when used in a staged_api crate.
|
||||
pub fn check_optional_stability(
|
||||
self,
|
||||
def_id: DefId,
|
||||
id: Option<HirId>,
|
||||
|
@ -37,6 +37,20 @@ enum AnnotationKind {
|
||||
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>,
|
||||
@ -56,7 +70,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
||||
attrs: &[Attribute],
|
||||
item_sp: Span,
|
||||
kind: AnnotationKind,
|
||||
inherit_deprecation: bool,
|
||||
inherit_deprecation: InheritDeprecation,
|
||||
visit_children: F,
|
||||
) where
|
||||
F: FnOnce(&mut Self),
|
||||
@ -81,7 +95,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
||||
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);
|
||||
@ -189,7 +203,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -240,7 +254,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
||||
}
|
||||
|
||||
// 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,
|
||||
@ -268,7 +282,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
@ -309,7 +323,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
&i.attrs,
|
||||
i.span,
|
||||
AnnotationKind::Required,
|
||||
true,
|
||||
InheritDeprecation::Yes,
|
||||
|_| {},
|
||||
)
|
||||
}
|
||||
@ -317,55 +331,92 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
||||
_ => {}
|
||||
}
|
||||
|
||||
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>) {
|
||||
@ -377,7 +428,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, '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);
|
||||
});
|
||||
}
|
||||
@ -519,7 +570,7 @@ fn new_index(tcx: TyCtxt<'tcx>) -> Index<'tcx> {
|
||||
&krate.item.attrs,
|
||||
krate.item.span,
|
||||
AnnotationKind::Required,
|
||||
true,
|
||||
InheritDeprecation::Yes,
|
||||
|v| intravisit::walk_crate(v, krate),
|
||||
);
|
||||
}
|
||||
|
@ -362,7 +362,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
||||
}
|
||||
(GenericParamDefKind::Type { has_default, .. }, GenericArg::Type(ty)) => {
|
||||
if *has_default {
|
||||
tcx.check_stability_internal(
|
||||
tcx.check_optional_stability(
|
||||
param.def_id,
|
||||
Some(arg.id()),
|
||||
arg.span(),
|
||||
|
Loading…
x
Reference in New Issue
Block a user