diff options
| author | Dylan DPC <dylan.dpc@gmail.com> | 2020-11-29 03:14:21 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-29 03:14:21 +0100 |
| commit | ca8a1b05c62d05d82fb6d5480dc9e4b4fdad1ce4 (patch) | |
| tree | 6383f8334a0365e06e6c08a8778d8ab313761c72 | |
| parent | d5d60364786f88bcea9d940ec056bb020c12aa5b (diff) | |
| parent | 482b3accdd2390b1cd0ffee850fe1c21468b6798 (diff) | |
| download | rust-ca8a1b05c62d05d82fb6d5480dc9e4b4fdad1ce4.tar.gz rust-ca8a1b05c62d05d82fb6d5480dc9e4b4fdad1ce4.zip | |
Rollup merge of #79464 - GuillaumeGomez:doc-keyword-ident, r=jyn514
Extend doc keyword feature by allowing any ident Part of #51315. As suggested by ``@danielhenrymantilla`` in [this comment](https://github.com/rust-lang/rust/issues/51315#issuecomment-733879934), this PR extends `#[doc(keyword = "...")]` to allow any ident to be used as keyword. The final goal is to allow (proc-)macro crates' owners to write documentation of the keywords they might introduce. r? ``@jyn514``
| -rw-r--r-- | compiler/rustc_span/src/symbol.rs | 5 | ||||
| -rw-r--r-- | src/librustdoc/clean/mod.rs | 24 | ||||
| -rw-r--r-- | src/test/rustdoc-ui/invalid-keyword.rs | 4 | ||||
| -rw-r--r-- | src/test/rustdoc-ui/invalid-keyword.stderr | 8 | ||||
| -rw-r--r-- | src/test/rustdoc/keyword.rs | 5 |
5 files changed, 35 insertions, 11 deletions
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index d5fccdeb189..523628b7058 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -1590,11 +1590,6 @@ impl Symbol { self == kw::Try } - /// Used for sanity checking rustdoc keyword sections. - pub fn is_doc_keyword(self) -> bool { - self <= kw::Union - } - /// A keyword or reserved identifier that can be used as a path segment. pub fn is_path_segment_keyword(self) -> bool { self == kw::Super diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 13643fbf3d3..221c818736e 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -162,18 +162,30 @@ impl Clean<ExternalCrate> for CrateNum { .collect() }; + let get_span = + |attr: &ast::NestedMetaItem| Some(attr.meta_item()?.name_value_literal()?.span); + let as_keyword = |res: Res| { if let Res::Def(DefKind::Mod, def_id) = res { let attrs = cx.tcx.get_attrs(def_id).clean(cx); let mut keyword = None; for attr in attrs.lists(sym::doc) { - if let Some(v) = attr.value_str() { - if attr.has_name(sym::keyword) { - if v.is_doc_keyword() { - keyword = Some(v.to_string()); - break; + if attr.has_name(sym::keyword) { + if let Some(v) = attr.value_str() { + let k = v.to_string(); + if !rustc_lexer::is_ident(&k) { + let sp = get_span(&attr).unwrap_or_else(|| attr.span()); + cx.tcx + .sess + .struct_span_err( + sp, + &format!("`{}` is not a valid identifier", v), + ) + .emit(); + } else { + keyword = Some(k); } - // FIXME: should warn on unknown keywords? + break; } } } diff --git a/src/test/rustdoc-ui/invalid-keyword.rs b/src/test/rustdoc-ui/invalid-keyword.rs new file mode 100644 index 00000000000..ce2abc69bbd --- /dev/null +++ b/src/test/rustdoc-ui/invalid-keyword.rs @@ -0,0 +1,4 @@ +#![feature(doc_keyword)] + +#[doc(keyword = "foo df")] //~ ERROR +mod foo {} diff --git a/src/test/rustdoc-ui/invalid-keyword.stderr b/src/test/rustdoc-ui/invalid-keyword.stderr new file mode 100644 index 00000000000..8658e382578 --- /dev/null +++ b/src/test/rustdoc-ui/invalid-keyword.stderr @@ -0,0 +1,8 @@ +error: `foo df` is not a valid identifier + --> $DIR/invalid-keyword.rs:3:17 + | +LL | #[doc(keyword = "foo df")] + | ^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/rustdoc/keyword.rs b/src/test/rustdoc/keyword.rs index db5d115c6da..25e8b7912e7 100644 --- a/src/test/rustdoc/keyword.rs +++ b/src/test/rustdoc/keyword.rs @@ -14,3 +14,8 @@ #[doc(keyword = "match")] /// this is a test! mod foo{} + +// @has foo/keyword.foo.html '//section[@id="main"]//div[@class="docblock"]//p' 'hello' +#[doc(keyword = "foo")] +/// hello +mod bar {} |
