about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2020-09-27 16:15:26 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2020-10-03 14:16:24 +0200
commit30cabfd215f374b855f6d6473b00a55c3511c3e2 (patch)
treea0808301f08cc30635f2db5d733cc5d2aee50b3c
parentb2321bb8da18c753fe3b9b71937a368ae42b8c4b (diff)
downloadrust-30cabfd215f374b855f6d6473b00a55c3511c3e2.tar.gz
rust-30cabfd215f374b855f6d6473b00a55c3511c3e2.zip
Don't warn if the tag is nested inside a <script> or inside a <style>
-rw-r--r--src/librustdoc/passes/html_tags.rs5
-rw-r--r--src/test/rustdoc-ui/invalid-html-tags.rs22
2 files changed, 26 insertions, 1 deletions
diff --git a/src/librustdoc/passes/html_tags.rs b/src/librustdoc/passes/html_tags.rs
index 79035ba79ff..490e913fbde 100644
--- a/src/librustdoc/passes/html_tags.rs
+++ b/src/librustdoc/passes/html_tags.rs
@@ -48,8 +48,11 @@ fn drop_tag(
     if let Some(pos) = tags.iter().rev().position(|(t, _)| *t == tag_name) {
         // Because this is from a `rev` iterator, the position is reversed as well!
         let pos = tags.len() - 1 - pos;
+        // If the tag is nested inside a "<script>", not warning should be emitted.
+        let should_not_warn =
+            tags.iter().take(pos + 1).any(|(at, _)| at == "script" || at == "style");
         for (last_tag_name, last_tag_span) in tags.drain(pos + 1..) {
-            if ALLOWED_UNCLOSED.iter().any(|&at| at == &last_tag_name) {
+            if should_not_warn || ALLOWED_UNCLOSED.iter().any(|&at| at == &last_tag_name) {
                 continue;
             }
             // `tags` is used as a queue, meaning that everything after `pos` is included inside it.
diff --git a/src/test/rustdoc-ui/invalid-html-tags.rs b/src/test/rustdoc-ui/invalid-html-tags.rs
index 51bbae2a0b6..0dc2002bd39 100644
--- a/src/test/rustdoc-ui/invalid-html-tags.rs
+++ b/src/test/rustdoc-ui/invalid-html-tags.rs
@@ -39,3 +39,25 @@ pub fn b() {}
 ///   <h3>
 //~^ ERROR unclosed HTML tag `h3`
 pub fn c() {}
+
+// Unclosed tags shouldn't warn if they are nested inside a <script> elem.
+/// <script>
+///   <h3><div>
+/// </script>
+/// <script>
+///   <div>
+///     <p>
+///   </div>
+/// </script>
+pub fn d() {}
+
+// Unclosed tags shouldn't warn if they are nested inside a <style> elem.
+/// <style>
+///   <h3><div>
+/// </style>
+/// <style>
+///   <div>
+///     <p>
+///   </div>
+/// </style>
+pub fn e() {}