]> git.lizzy.rs Git - rust.git/commitdiff
Add checks for doc alias on which item it's used
authorGuillaume Gomez <guillaume1.gomez@gmail.com>
Mon, 6 Jul 2020 14:11:12 +0000 (16:11 +0200)
committerGuillaume Gomez <guillaume1.gomez@gmail.com>
Tue, 11 Aug 2020 21:21:05 +0000 (23:21 +0200)
src/librustdoc/visit_ast.rs

index cf57ffd0b4b305532d41bcda67bd6942a4ed0e9b..e1a84e99836e36ce32fb67c182279a3715f2b352 100644 (file)
@@ -31,6 +31,27 @@ fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec<String> {
     std::iter::once(crate_name).chain(relative).collect()
 }
 
+fn check_doc_alias_attrs(
+    attrs: &[ast::Attribute],
+    item_kind: &str,
+    diagnostic: &::rustc_errors::Handler,
+) {
+    for attr in attrs {
+        if let Some(attr) = attr.meta() {
+            if let Some(list) = attr.meta_item_list() {
+                for meta in list {
+                    if meta.check_name(sym::alias) {
+                        diagnostic.span_err(
+                            meta.span(),
+                            &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", item_kind),
+                        );
+                    }
+                }
+            }
+        }
+    }
+}
+
 // Also, is there some reason that this doesn't use the 'visit'
 // framework from syntax?.
 
@@ -387,6 +408,7 @@ fn visit_item(
 
         match item.kind {
             hir::ItemKind::ForeignMod(ref fm) => {
+                check_doc_alias_attrs(&item.attrs, "extern block", self.cx.sess().diagnostic());
                 for item in fm.items {
                     self.visit_foreign_item(item, None, om);
                 }
@@ -561,6 +583,11 @@ fn visit_item(
                 self_ty,
                 ref items,
             } => {
+                check_doc_alias_attrs(
+                    &item.attrs,
+                    "implementation block",
+                    self.cx.sess().diagnostic(),
+                );
                 // 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() {