Inherit #[stable(..)]
annotations in enum variants and fields from its item
This commit is contained in:
parent
178108bf81
commit
4cb089bb54
13 changed files with 213 additions and 163 deletions
|
@ -109,7 +109,7 @@ impl LibFeatureCollector<'tcx> {
|
|||
}
|
||||
|
||||
fn span_feature_error(&self, span: Span, msg: &str) {
|
||||
struct_span_err!(self.tcx.sess, span, E0711, "{}", &msg,).emit();
|
||||
struct_span_err!(self.tcx.sess, span, E0711, "{}", &msg).emit();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -70,6 +70,17 @@ impl InheritConstStability {
|
|||
}
|
||||
}
|
||||
|
||||
enum InheritStability {
|
||||
Yes,
|
||||
No,
|
||||
}
|
||||
|
||||
impl InheritStability {
|
||||
fn yes(&self) -> bool {
|
||||
matches!(self, InheritStability::Yes)
|
||||
}
|
||||
}
|
||||
|
||||
// A private tree-walker for producing an Index.
|
||||
struct Annotator<'a, 'tcx> {
|
||||
tcx: TyCtxt<'tcx>,
|
||||
|
@ -91,6 +102,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
|||
kind: AnnotationKind,
|
||||
inherit_deprecation: InheritDeprecation,
|
||||
inherit_const_stability: InheritConstStability,
|
||||
inherit_from_parent: InheritStability,
|
||||
visit_children: F,
|
||||
) where
|
||||
F: FnOnce(&mut Self),
|
||||
|
@ -131,12 +143,13 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
|||
}
|
||||
|
||||
if self.tcx.features().staged_api {
|
||||
if let Some(..) = attrs.iter().find(|a| self.tcx.sess.check_name(a, sym::deprecated)) {
|
||||
self.tcx.sess.span_err(
|
||||
item_sp,
|
||||
"`#[deprecated]` cannot be used in staged API; \
|
||||
use `#[rustc_deprecated]` instead",
|
||||
);
|
||||
if let Some(a) = attrs.iter().find(|a| self.tcx.sess.check_name(a, sym::deprecated)) {
|
||||
self.tcx
|
||||
.sess
|
||||
.struct_span_err(a.span, "`#[deprecated]` cannot be used in staged API")
|
||||
.span_label(a.span, "use `#[rustc_deprecated]` instead")
|
||||
.span_label(item_sp, "")
|
||||
.emit();
|
||||
}
|
||||
} else {
|
||||
self.recurse_with_stability_attrs(
|
||||
|
@ -185,7 +198,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
|||
if kind == AnnotationKind::Prohibited
|
||||
|| (kind == AnnotationKind::Container && stab.level.is_stable() && is_deprecated)
|
||||
{
|
||||
self.tcx.sess.span_err(item_sp, "This stability annotation is useless");
|
||||
self.tcx.sess.span_err(item_sp, "this stability annotation is useless");
|
||||
}
|
||||
|
||||
debug!("annotate: found {:?}", stab);
|
||||
|
@ -202,7 +215,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
|||
{
|
||||
match stab_v.parse::<u64>() {
|
||||
Err(_) => {
|
||||
self.tcx.sess.span_err(item_sp, "Invalid stability version found");
|
||||
self.tcx.sess.span_err(item_sp, "invalid stability version found");
|
||||
break;
|
||||
}
|
||||
Ok(stab_vp) => match dep_v.parse::<u64>() {
|
||||
|
@ -210,7 +223,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
|||
Ordering::Less => {
|
||||
self.tcx.sess.span_err(
|
||||
item_sp,
|
||||
"An API can't be stabilized after it is deprecated",
|
||||
"an API can't be stabilized after it is deprecated",
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
@ -221,7 +234,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> {
|
|||
if dep_v != "TBD" {
|
||||
self.tcx
|
||||
.sess
|
||||
.span_err(item_sp, "Invalid deprecation version found");
|
||||
.span_err(item_sp, "invalid deprecation version found");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -237,7 +250,9 @@ 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.yes() && stab.level.is_unstable() {
|
||||
if inherit_deprecation.yes() && stab.level.is_unstable()
|
||||
|| inherit_from_parent.yes()
|
||||
{
|
||||
self.index.stab_map.insert(hir_id, stab);
|
||||
}
|
||||
}
|
||||
|
@ -368,6 +383,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::Yes,
|
||||
|_| {},
|
||||
)
|
||||
}
|
||||
|
@ -382,6 +398,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
kind,
|
||||
InheritDeprecation::Yes,
|
||||
const_stab_inherit,
|
||||
InheritStability::No,
|
||||
|v| intravisit::walk_item(v, i),
|
||||
);
|
||||
self.in_trait_impl = orig_in_trait_impl;
|
||||
|
@ -395,6 +412,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::No,
|
||||
|v| {
|
||||
intravisit::walk_trait_item(v, ti);
|
||||
},
|
||||
|
@ -411,6 +429,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
kind,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::No,
|
||||
|v| {
|
||||
intravisit::walk_impl_item(v, ii);
|
||||
},
|
||||
|
@ -425,6 +444,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::Yes,
|
||||
|v| {
|
||||
if let Some(ctor_hir_id) = var.data.ctor_hir_id() {
|
||||
v.annotate(
|
||||
|
@ -434,6 +454,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::No,
|
||||
|_| {},
|
||||
);
|
||||
}
|
||||
|
@ -451,6 +472,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::Yes,
|
||||
|v| {
|
||||
intravisit::walk_struct_field(v, s);
|
||||
},
|
||||
|
@ -465,6 +487,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::No,
|
||||
|v| {
|
||||
intravisit::walk_foreign_item(v, i);
|
||||
},
|
||||
|
@ -479,6 +502,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::No,
|
||||
|_| {},
|
||||
);
|
||||
}
|
||||
|
@ -499,6 +523,7 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> {
|
|||
kind,
|
||||
InheritDeprecation::No,
|
||||
InheritConstStability::No,
|
||||
InheritStability::No,
|
||||
|v| {
|
||||
intravisit::walk_generic_param(v, p);
|
||||
},
|
||||
|
@ -669,6 +694,7 @@ fn new_index(tcx: TyCtxt<'tcx>) -> Index<'tcx> {
|
|||
AnnotationKind::Required,
|
||||
InheritDeprecation::Yes,
|
||||
InheritConstStability::No,
|
||||
InheritStability::No,
|
||||
|v| intravisit::walk_crate(v, krate),
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue