about summary refs log tree commit diff
diff options
context:
space:
mode:
authorManish Goregaokar <manishsmail@gmail.com>2020-07-16 11:18:44 -0700
committerGitHub <noreply@github.com>2020-07-16 11:18:44 -0700
commit61a3f6701b5e1d8cd87be83c2b6a8322f812c8d8 (patch)
tree291441ecd6c8cf664aa06327901876e715d7ef50
parentef3900090ef983368b9c9efaaace7dfaff8b0992 (diff)
parentb0884c098bc3704f7ec9381ac1670eb923845127 (diff)
downloadrust-61a3f6701b5e1d8cd87be83c2b6a8322f812c8d8.tar.gz
rust-61a3f6701b5e1d8cd87be83c2b6a8322f812c8d8.zip
Rollup merge of #74148 - GuillaumeGomez:doc-alias-check, r=Manishearth
Move #[doc(alias)] check in rustc

Part of #73721.

r? @ollie27
-rw-r--r--src/librustc_passes/check_attr.rs30
-rw-r--r--src/librustdoc/clean/types.rs28
-rw-r--r--src/test/ui/check-doc-alias-attr.rs (renamed from src/test/rustdoc-ui/check-doc-alias-attr.rs)1
-rw-r--r--src/test/ui/check-doc-alias-attr.stderr (renamed from src/test/rustdoc-ui/check-doc-alias-attr.stderr)6
4 files changed, 34 insertions, 31 deletions
diff --git a/src/librustc_passes/check_attr.rs b/src/librustc_passes/check_attr.rs
index 46aa5a4dcdf..3e63a63d9d0 100644
--- a/src/librustc_passes/check_attr.rs
+++ b/src/librustc_passes/check_attr.rs
@@ -70,6 +70,8 @@ impl CheckAttrVisitor<'tcx> {
                 self.check_target_feature(attr, span, target)
             } else if attr.check_name(sym::track_caller) {
                 self.check_track_caller(&attr.span, attrs, span, target)
+            } else if attr.check_name(sym::doc) {
+                self.check_doc_alias(attr)
             } else {
                 true
             };
@@ -216,6 +218,34 @@ impl CheckAttrVisitor<'tcx> {
         }
     }
 
+    fn check_doc_alias(&self, attr: &Attribute) -> bool {
+        if let Some(mi) = attr.meta() {
+            if let Some(list) = mi.meta_item_list() {
+                for meta in list {
+                    if meta.check_name(sym::alias) {
+                        if !meta.is_value_str()
+                            || meta
+                                .value_str()
+                                .map(|s| s.to_string())
+                                .unwrap_or_else(String::new)
+                                .is_empty()
+                        {
+                            self.tcx
+                                .sess
+                                .struct_span_err(
+                                    meta.span(),
+                                    "doc alias attribute expects a string: #[doc(alias = \"0\")]",
+                                )
+                                .emit();
+                            return false;
+                        }
+                    }
+                }
+            }
+        }
+        true
+    }
+
     /// Checks if the `#[repr]` attributes on `item` are valid.
     fn check_repr(
         &self,
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs
index c9ae67ded0a..9ed5e2697c8 100644
--- a/src/librustdoc/clean/types.rs
+++ b/src/librustdoc/clean/types.rs
@@ -486,33 +486,6 @@ impl Attributes {
         })
     }
 
-    /// Enforce the format of attributes inside `#[doc(...)]`.
-    pub fn check_doc_attributes(
-        diagnostic: &::rustc_errors::Handler,
-        mi: &ast::MetaItem,
-    ) -> Option<(String, String)> {
-        mi.meta_item_list().and_then(|list| {
-            for meta in list {
-                if meta.check_name(sym::alias) {
-                    if !meta.is_value_str()
-                        || meta
-                            .value_str()
-                            .map(|s| s.to_string())
-                            .unwrap_or_else(String::new)
-                            .is_empty()
-                    {
-                        diagnostic.span_err(
-                            meta.span(),
-                            "doc alias attribute expects a string: #[doc(alias = \"0\")]",
-                        );
-                    }
-                }
-            }
-
-            None
-        })
-    }
-
     pub fn has_doc_flag(&self, flag: Symbol) -> bool {
         for attr in &self.other_attrs {
             if !attr.check_name(sym::doc) {
@@ -556,7 +529,6 @@ impl Attributes {
                 } else {
                     if attr.check_name(sym::doc) {
                         if let Some(mi) = attr.meta() {
-                            Attributes::check_doc_attributes(&diagnostic, &mi);
                             if let Some(cfg_mi) = Attributes::extract_cfg(&mi) {
                                 // Extracted #[doc(cfg(...))]
                                 match Cfg::parse(cfg_mi) {
diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.rs b/src/test/ui/check-doc-alias-attr.rs
index 2f01099107d..b02cc1a4545 100644
--- a/src/test/rustdoc-ui/check-doc-alias-attr.rs
+++ b/src/test/ui/check-doc-alias-attr.rs
@@ -1,3 +1,4 @@
+#![crate_type = "lib"]
 #![feature(doc_alias)]
 
 #[doc(alias = "foo")] // ok!
diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.stderr b/src/test/ui/check-doc-alias-attr.stderr
index 480acc821aa..268230ab44a 100644
--- a/src/test/rustdoc-ui/check-doc-alias-attr.stderr
+++ b/src/test/ui/check-doc-alias-attr.stderr
@@ -1,17 +1,17 @@
 error: doc alias attribute expects a string: #[doc(alias = "0")]
-  --> $DIR/check-doc-alias-attr.rs:6:7
+  --> $DIR/check-doc-alias-attr.rs:7:7
    |
 LL | #[doc(alias)]
    |       ^^^^^
 
 error: doc alias attribute expects a string: #[doc(alias = "0")]
-  --> $DIR/check-doc-alias-attr.rs:7:7
+  --> $DIR/check-doc-alias-attr.rs:8:7
    |
 LL | #[doc(alias = 0)]
    |       ^^^^^^^^^
 
 error: doc alias attribute expects a string: #[doc(alias = "0")]
-  --> $DIR/check-doc-alias-attr.rs:8:7
+  --> $DIR/check-doc-alias-attr.rs:9:7
    |
 LL | #[doc(alias("bar"))]
    |       ^^^^^^^^^^^^