Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'runtime/queries/rust/injections.scm')
| -rw-r--r-- | runtime/queries/rust/injections.scm | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/runtime/queries/rust/injections.scm b/runtime/queries/rust/injections.scm index 1f83c6e7..c895b4ef 100644 --- a/runtime/queries/rust/injections.scm +++ b/runtime/queries/rust/injections.scm @@ -97,3 +97,127 @@ ] ) (#set! injection.language "sql")) + +; Special language `tree-sitter-rust-format-args` for Rust macros, +; which use `format_args!` under the hood and therefore have +; the `format_args!` syntax. +; +; This language is injected into a hard-coded set of macros. + +; 1st argument is `format_args!` +( + (macro_invocation + macro: + [ + (scoped_identifier + name: (_) @_macro_name) + (identifier) @_macro_name + ] + (token_tree + . (string_literal + (string_content) @injection.content + ) + ) + ) + (#any-of? @_macro_name + ; std + "print" "println" "eprint" "eprintln" + "format" "format_args" "todo" "panic" + "unreachable" "unimplemented" "compile_error" + ; log + "crit" "trace" "debug" "info" "warn" "error" + ; anyhow + "anyhow" "bail" + ; syn + "format_ident" + ; indoc + "formatdoc" "printdoc" "eprintdoc" "writedoc" + ; iced + "text" + ; ratatui + "span" + ; eyre + "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 + ) + ) + ) + (#any-of? @_macro_name + ; 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 + ) + ) + ) + (#any-of? @_macro_name + ; std + "assert_eq" "debug_assert_eq" "assert_ne" "debug_assert_ne" + ) + (#set! injection.language "rust-format-args") + (#set! injection.include-children) +) + +; Dioxus' "rsx!" macro relies heavily on string interpolation as well. The strings can be nested very deeply +( + (macro_invocation + macro: [ + (scoped_identifier + name: (_) @_macro_name) + (identifier) @_macro_name + ] + ; TODO: This only captures 1 level of string literals. But in dioxus you can have + ; nested string literals. For instance: + ; + ; rsx! { "{hello} world" }: + ; -> (token_tree (string_literal)) + ; rsx! { div { "{hello} world" } } + ; -> (token_tree (token_tree (string_literal))) + ; rsx! { div { div { "{hello} world" } } } + ; -> (token_tree (token_tree (token_tree (string_literal)))) + (token_tree (string_literal) @injection.content) + ) + (#eq? @_macro_name "rsx") + (#set! injection.language "rust-format-args") + (#set! injection.include-children) +) |