Add doc(alias) attribute checks for associated consts and associated types

This commit is contained in:
Guillaume Gomez 2020-07-23 21:04:54 +02:00
parent 23a2ba6e53
commit b04fda8b69
3 changed files with 57 additions and 9 deletions

View file

@ -591,8 +591,14 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
// Don't duplicate impls when inlining or if it's implementing a trait, we'll pick
// them up regardless of where they're located.
if !self.inlining && of_trait.is_none() {
let items =
items.iter().map(|item| self.cx.tcx.hir().impl_item(item.id)).collect();
let items = items
.iter()
.map(|item| {
let item = self.cx.tcx.hir().impl_item(item.id);
self.check_impl_doc_alias_attr(item);
item
})
.collect();
let i = Impl {
unsafety,
polarity,
@ -608,11 +614,31 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
vis: &item.vis,
};
om.impls.push(i);
} else if of_trait.is_some() {
for item in items.iter() {
self.check_impl_doc_alias_attr(self.cx.tcx.hir().impl_item(item.id));
}
}
}
}
}
fn check_impl_doc_alias_attr(&self, item: &hir::ImplItem<'_>) {
match item.kind {
hir::ImplItemKind::Const(_, _) => check_doc_alias_attrs(
&item.attrs,
"const in implementation block",
self.cx.sess().diagnostic(),
),
hir::ImplItemKind::TyAlias(_) => check_doc_alias_attrs(
&item.attrs,
"type alias in implementation block",
self.cx.sess().diagnostic(),
),
hir::ImplItemKind::Fn(_, _) => {}
}
}
fn visit_foreign_item(
&mut self,
item: &'tcx hir::ForeignItem<'_>,

View file

@ -1,13 +1,23 @@
#![feature(doc_alias)]
pub struct Bar;
pub trait Foo {}
pub trait Foo {
type X;
fn foo() -> Self::X;
}
#[doc(alias = "foo")] //~ ERROR
extern {}
#[doc(alias = "bar")] //~ ERROR
impl Bar {}
impl Bar {
#[doc(alias = "const")] //~ ERROR
const A: u32 = 0;
}
#[doc(alias = "foobar")] //~ ERROR
impl Foo for Bar {}
impl Foo for Bar {
#[doc(alias = "assoc")] //~ ERROR
type X = i32;
fn foo() -> Self::X { 0 }
}

View file

@ -1,20 +1,32 @@
error: `#[doc(alias = "...")]` isn't allowed on extern block
--> $DIR/check-doc-alias-attr-location.rs:6:7
--> $DIR/check-doc-alias-attr-location.rs:9:7
|
LL | #[doc(alias = "foo")]
| ^^^^^^^^^^^^^
error: `#[doc(alias = "...")]` isn't allowed on implementation block
--> $DIR/check-doc-alias-attr-location.rs:9:7
--> $DIR/check-doc-alias-attr-location.rs:12:7
|
LL | #[doc(alias = "bar")]
| ^^^^^^^^^^^^^
error: `#[doc(alias = "...")]` isn't allowed on const in implementation block
--> $DIR/check-doc-alias-attr-location.rs:14:11
|
LL | #[doc(alias = "const")]
| ^^^^^^^^^^^^^^^
error: `#[doc(alias = "...")]` isn't allowed on implementation block
--> $DIR/check-doc-alias-attr-location.rs:12:7
--> $DIR/check-doc-alias-attr-location.rs:18:7
|
LL | #[doc(alias = "foobar")]
| ^^^^^^^^^^^^^^^^
error: aborting due to 3 previous errors
error: `#[doc(alias = "...")]` isn't allowed on type alias in implementation block
--> $DIR/check-doc-alias-attr-location.rs:20:11
|
LL | #[doc(alias = "assoc")]
| ^^^^^^^^^^^^^^^
error: aborting due to 5 previous errors