From 4bb61a0e5b5f02d759fd2f0e8b4b0a1c7439ea8b Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 8 Mar 2026 03:34:11 -0700 Subject: [PATCH 1/4] fix(syntax): highlight Rust union keyword in source view --- .../assets/syntaxes/Packages/Rust/Rust.sublime-syntax | 2 +- crates/bin/docs_rs_web/src/utils/highlight.rs | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) 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..95cf320d9 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 @@ -133,7 +133,7 @@ contexts: - match: \*mut\b scope: storage.modifier.rust - - match: \b(crate|extern|use|where)\b + - match: \b(crate|extern|union|use|where)\b scope: keyword.other.rust - match: \b(break|else|for|if|loop|match|while|continue)\b diff --git a/crates/bin/docs_rs_web/src/utils/highlight.rs b/crates/bin/docs_rs_web/src/utils/highlight.rs index 2705b9d9f..2b1b84f7c 100644 --- a/crates/bin/docs_rs_web/src/utils/highlight.rs +++ b/crates/bin/docs_rs_web/src/utils/highlight.rs @@ -135,4 +135,10 @@ mod tests { let highlighted = with_lang(Some("toml"), &text, None); assert!(highlighted.starts_with("<p>\n")); } + + #[test] + fn rust_union_is_highlighted_as_keyword() { + let highlighted = with_lang(Some("rust"), "union Foo { field: u8 }\n", None); + assert!(highlighted.contains("union")); + } } From 693d4a43f3876267242731572027a93e846ea2b8 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 8 Mar 2026 04:09:38 -0700 Subject: [PATCH 2/4] fix(rust syntax): treat union as contextual keyword --- .../assets/syntaxes/Packages/Rust/Rust.sublime-syntax | 5 ++++- .../assets/syntaxes/Packages/Rust/syntax_test_rust.rs | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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 95cf320d9..ac0fda35d 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 @@ -133,7 +133,10 @@ contexts: - match: \*mut\b scope: storage.modifier.rust - - match: \b(crate|extern|union|use|where)\b + - 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 diff --git a/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/syntax_test_rust.rs b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/syntax_test_rust.rs index 3ba2ebe02..526a5f2f7 100644 --- a/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/syntax_test_rust.rs +++ b/crates/bin/docs_rs_web/assets/syntaxes/Packages/Rust/syntax_test_rust.rs @@ -1148,3 +1148,12 @@ let p_imm: *const u32 = &i as *const u32; type ExampleRawPointer = HashMap<*const i32, Option, BuildHasherDefault>; // ^^^^^^ storage.modifier - invalid // ^^^ storage.type + + +union MyUnion { +// <- keyword.other + f1: u32, +} + +let union = 1; +// ^^^^^ - keyword.other From e962d498a4f94c6fc2203bad4803731e440b6df7 Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 8 Mar 2026 04:22:32 -0700 Subject: [PATCH 3/4] test(rust): cover weak union keyword cases --- crates/bin/docs_rs_web/src/utils/highlight.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/crates/bin/docs_rs_web/src/utils/highlight.rs b/crates/bin/docs_rs_web/src/utils/highlight.rs index 2b1b84f7c..15ff74fd2 100644 --- a/crates/bin/docs_rs_web/src/utils/highlight.rs +++ b/crates/bin/docs_rs_web/src/utils/highlight.rs @@ -141,4 +141,20 @@ mod tests { let highlighted = with_lang(Some("rust"), "union Foo { field: u8 }\n", None); assert!(highlighted.contains("union")); } + + #[test] + fn rust_union_identifier_is_not_highlighted_as_keyword() { + let highlighted = with_lang( + Some("rust"), + "struct X { union: u32 }\nlet x = X { union: 0 };\n", + None, + ); + assert!(!highlighted.contains("union")); + } + + #[test] + fn rust_union_macro_name_is_not_highlighted_as_keyword() { + let highlighted = with_lang(Some("rust"), "macro_rules! union { () => {} }\nunion!();\n", None); + assert!(!highlighted.contains("union")); + } } From 7862ec37fc0a48f8dca5af33784baa246471ab5e Mon Sep 17 00:00:00 2001 From: Sergio Date: Sun, 8 Mar 2026 04:28:21 -0700 Subject: [PATCH 4/4] test(rust): assert weak union usages are not keyword-highlighted --- crates/bin/docs_rs_web/src/utils/highlight.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/bin/docs_rs_web/src/utils/highlight.rs b/crates/bin/docs_rs_web/src/utils/highlight.rs index 15ff74fd2..053a86228 100644 --- a/crates/bin/docs_rs_web/src/utils/highlight.rs +++ b/crates/bin/docs_rs_web/src/utils/highlight.rs @@ -139,22 +139,26 @@ mod tests { #[test] fn rust_union_is_highlighted_as_keyword() { let highlighted = with_lang(Some("rust"), "union Foo { field: u8 }\n", None); - assert!(highlighted.contains("union")); + assert!(highlighted.contains("union Foo")); } #[test] fn rust_union_identifier_is_not_highlighted_as_keyword() { let highlighted = with_lang( Some("rust"), - "struct X { union: u32 }\nlet x = X { union: 0 };\n", + "struct X { union: u32 }\nlet x = X { union: 0 };\nprintln!(\"{}\", x.union);\n", None, ); - assert!(!highlighted.contains("union")); + assert!(highlighted.contains("union:")); + assert!(highlighted.contains("x.union")); + assert!(!highlighted.contains("union:")); + assert!(!highlighted.contains(".union")); } #[test] fn rust_union_macro_name_is_not_highlighted_as_keyword() { let highlighted = with_lang(Some("rust"), "macro_rules! union { () => {} }\nunion!();\n", None); - assert!(!highlighted.contains("union")); + assert!(highlighted.contains("macro_rules! union")); + assert!(!highlighted.contains("union!")); } }