diff --git a/Cargo.lock b/Cargo.lock index 08044cab2..9424ada24 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1986,7 +1986,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a793df0d7afeac54f95b471d3af7f0d4fb975699f972341a4b76988d49cdf0c" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-targets 0.52.6", ] [[package]] @@ -2844,9 +2844,9 @@ dependencies = [ [[package]] name = "tree-house-bindings" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "690809022f44e3d2329882649724b6e0027ade3fada65e4631d303e744dc32b4" +checksum = "3f1646788fe0afdbf8e191b5d0f558df7333d8857665a67053c532ec811e6086" dependencies = [ "cc", "libloading", diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index cc9e0e62d..1c620e374 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -208,6 +208,7 @@ | ruby | ✓ | ✓ | ✓ | `ruby-lsp`, `solargraph` | | rust | ✓ | ✓ | ✓ | `rust-analyzer` | | rust-format-args | ✓ | | | | +| rust-format-args-macro | ✓ | ✓ | ✓ | | | sage | ✓ | ✓ | | | | scala | ✓ | ✓ | ✓ | `metals` | | scheme | ✓ | | ✓ | | diff --git a/helix-term/src/ui/markdown.rs b/helix-term/src/ui/markdown.rs index ae58d75e8..6bef59d14 100644 --- a/helix-term/src/ui/markdown.rs +++ b/helix-term/src/ui/markdown.rs @@ -90,7 +90,13 @@ pub fn highlighted_code_block<'a>( if pos == start { continue; } - assert!(pos > start); + // The highlighter should always move forward. + // If the highlighter malfunctions, bail on syntax highlighting and log an error. + debug_assert!(pos > start); + if pos < start { + log::error!("Failed to highlight '{language}': {text:?}"); + return styled_multiline_text(text, code_style); + } let style = syntax_highlight_stack .iter() diff --git a/helix-view/src/theme.rs b/helix-view/src/theme.rs index 61d490ff3..77fa78331 100644 --- a/helix-view/src/theme.rs +++ b/helix-view/src/theme.rs @@ -300,7 +300,7 @@ impl Theme { /// Interpret a Highlight with the RGB foreground fn decode_rgb_highlight(highlight: Highlight) -> Option<(u8, u8, u8)> { (highlight.get() > Self::RGB_START).then(|| { - let [b, g, r, ..] = (highlight.get() + 1).to_ne_bytes(); + let [b, g, r, ..] = (highlight.get() + 1).to_le_bytes(); (r, g, b) }) } @@ -309,7 +309,7 @@ impl Theme { pub fn rgb_highlight(r: u8, g: u8, b: u8) -> Highlight { // -1 because highlight is "non-max": u32::MAX is reserved for the null pointer // optimization. - Highlight::new(u32::from_ne_bytes([b, g, r, u8::MAX]) - 1) + Highlight::new(u32::from_le_bytes([b, g, r, u8::MAX]) - 1) } #[inline] diff --git a/languages.toml b/languages.toml index 5c37a0b7f..670904fed 100644 --- a/languages.toml +++ b/languages.toml @@ -4445,6 +4445,12 @@ injection-regex = "rust-format-args" name = "rust-format-args" source = { git = "https://github.com/nik-rev/tree-sitter-rust-format-args", rev = "84ffe550e261cf5ea40a0ec31849ba2443bae99f" } +[[language]] +name = "rust-format-args-macro" +scope = "source.rust-format-args-macro" +file-types = [] +grammar = "rust" + [[language]] name = "clarity" scope = "source.clar" diff --git a/runtime/queries/rust-format-args-macro/highlights.scm b/runtime/queries/rust-format-args-macro/highlights.scm new file mode 100644 index 000000000..ae55c7faf --- /dev/null +++ b/runtime/queries/rust-format-args-macro/highlights.scm @@ -0,0 +1 @@ +; inherits: rust diff --git a/runtime/queries/rust-format-args-macro/indents.scm b/runtime/queries/rust-format-args-macro/indents.scm new file mode 100644 index 000000000..ae55c7faf --- /dev/null +++ b/runtime/queries/rust-format-args-macro/indents.scm @@ -0,0 +1 @@ +; inherits: rust diff --git a/runtime/queries/rust-format-args-macro/injections.scm b/runtime/queries/rust-format-args-macro/injections.scm new file mode 100644 index 000000000..47db13450 --- /dev/null +++ b/runtime/queries/rust-format-args-macro/injections.scm @@ -0,0 +1,13 @@ +; inherits: rust + +; HACK: This language is the same as Rust but all strings are injected +; with rust-format-args. Rust injects this into known macros which use +; the format args syntax. This can cause false-positive highlights but +; those are expected to be rare. + +([ + (string_literal (string_content) @injection.content) + (raw_string_literal (string_content) @injection.content) + ] + (#set! injection.language "rust-format-args") + (#set! injection.include-children)) diff --git a/runtime/queries/rust-format-args-macro/locals.scm b/runtime/queries/rust-format-args-macro/locals.scm new file mode 100644 index 000000000..ae55c7faf --- /dev/null +++ b/runtime/queries/rust-format-args-macro/locals.scm @@ -0,0 +1 @@ +; inherits: rust diff --git a/runtime/queries/rust-format-args-macro/textobjects.scm b/runtime/queries/rust-format-args-macro/textobjects.scm new file mode 100644 index 000000000..ae55c7faf --- /dev/null +++ b/runtime/queries/rust-format-args-macro/textobjects.scm @@ -0,0 +1 @@ +; inherits: rust diff --git a/runtime/queries/rust/injections.scm b/runtime/queries/rust/injections.scm index ba58bf36d..af1970a93 100644 --- a/runtime/queries/rust/injections.scm +++ b/runtime/queries/rust/injections.scm @@ -103,8 +103,6 @@ ; the `format_args!` syntax. ; ; This language is injected into a hard-coded set of macros. - -; 1st argument is `format_args!` ( (macro_invocation macro: @@ -113,13 +111,11 @@ name: (_) @_macro_name) (identifier) @_macro_name ] - (token_tree . [ - (string_literal (string_content) @injection.content) - (raw_string_literal (string_content) @injection.content) - ] - ) + (token_tree) @injection.content ) (#any-of? @_macro_name + ; 1st argument is `format_args!` + ; std "print" "println" "eprint" "eprintln" "format" "format_args" "todo" "panic" @@ -140,63 +136,22 @@ "eyre" ; miette "miette" - ) - (#set! injection.language "rust-format-args") - (#set! injection.include-children) -) -; 2nd argument is `format_args!` -( - (macro_invocation - macro: - [ - (scoped_identifier - name: (_) @_macro_name) - (identifier) @_macro_name - ] - (token_tree - . (_) - . [ - (string_literal (string_content) @injection.content) - (raw_string_literal (string_content) @injection.content) - ] - ) - ) - (#any-of? @_macro_name + ; 2nd argument is `format_args!` + ; std "write" "writeln" "assert" "debug_assert" ; defmt "expect" "unwrap" ; ratatui "span" - ) - (#set! injection.language "rust-format-args") - (#set! injection.include-children) -) -; 3rd argument is `format_args!` -( - (macro_invocation - macro: - [ - (scoped_identifier - name: (_) @_macro_name) - (identifier) @_macro_name - ] - (token_tree - . (_) - . (_) - . [ - (string_literal (string_content) @injection.content) - (raw_string_literal (string_content) @injection.content) - ] - ) - ) - (#any-of? @_macro_name + ; 3rd argument is `format_args!` + ; std "assert_eq" "debug_assert_eq" "assert_ne" "debug_assert_ne" ) - (#set! injection.language "rust-format-args") + (#set! injection.language "rust-format-args-macro") (#set! injection.include-children) )