diff --git a/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-syntax b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-syntax
index 79c3a8877..aeca23485 100644
--- a/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-syntax
+++ b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/Rust.sublime-syntax
@@ -136,6 +136,9 @@ contexts:
- match: \b(crate|extern|use|where)\b
scope: keyword.other.rust
+ - match: \bunion(?=\s+[[:alpha:]_][[:alnum:]_]*\s*)\b
+ scope: keyword.other.rust
+
- match: \b(break|else|for|if|loop|match|while|continue)\b
scope: keyword.control.rust
diff --git a/crates/bin/docs_rs_web/src/utils/highlight.rs b/crates/bin/docs_rs_web/src/utils/highlight.rs
index 2705b9d9f..ce39656be 100644
--- a/crates/bin/docs_rs_web/src/utils/highlight.rs
+++ b/crates/bin/docs_rs_web/src/utils/highlight.rs
@@ -135,4 +135,58 @@ mod tests {
let highlighted = with_lang(Some("toml"), &text, None);
assert!(highlighted.starts_with("<p>\n"));
}
+
+ // "union" should be a keyword only in this case: `union X {}`.
+ #[test]
+ fn union_keyword() {
+ fn highlight_and_check(code: &str, should_contain: &[&str]) {
+ let highlighted = with_lang(Some("rust"), code, None);
+ for needle in should_contain {
+ if !highlighted.contains(needle) {
+ panic!("{needle:?} isn't contained in {highlighted:?}");
+ }
+ }
+ }
+ highlight_and_check(
+ r#"
+struct X {
+ union: u32,
+}
+let union = X { union: 0 };
+println!("{}", union.union);"#,
+ &[
+ // "union" as field name
+ "{\n union: u32 union union: 0 union.union {} }
+union!();"#,
+ &[
+ // "union" as macro name
+ "macro_rules! union",
+ // Calling the "union" macro.
+ "union!",
+ ],
+ );
+ highlight_and_check(
+ "union X { a: u32 }",
+ // "union" has "syntax-keyword" in here, so all good.
+ &["union X { a: T }"#,
+ // "union" has "syntax-keyword" in here, so all good.
+ &[
+ "union X