From b04fda8b6971c5a2541b02e0498196beb4642728 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Thu, 23 Jul 2020 21:04:54 +0200 Subject: [PATCH] Add doc(alias) attribute checks for associated consts and associated types --- src/librustdoc/visit_ast.rs | 30 +++++++++++++++++-- .../check-doc-alias-attr-location.rs | 16 ++++++++-- .../check-doc-alias-attr-location.stderr | 20 ++++++++++--- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index e1a84e99836e..4f347f2055e8 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -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<'_>, diff --git a/src/test/rustdoc-ui/check-doc-alias-attr-location.rs b/src/test/rustdoc-ui/check-doc-alias-attr-location.rs index e209da6e2c3a..8a97cf7f8e89 100644 --- a/src/test/rustdoc-ui/check-doc-alias-attr-location.rs +++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.rs @@ -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 } +} diff --git a/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr index 74adc1bc0739..5fe943debdeb 100644 --- a/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr +++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr @@ -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