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 | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/runtime/queries/rust/injections.scm b/runtime/queries/rust/injections.scm index 42ca12b5..2c9ec7b1 100644 --- a/runtime/queries/rust/injections.scm +++ b/runtime/queries/rust/injections.scm @@ -97,3 +97,104 @@ ] ) (#set! injection.language "sql")) + +; std::fmt + +; For these, only the first argument is format_args! +((macro_invocation + macro: + [ + (scoped_identifier + name: (_) @_macro_name) + (identifier) @_macro_name + ] + (token_tree . (string_literal) @injection.content)) + (#any-of? @_macro_name + ; std + "format" + "print" + "println" + "eprint" + "eprintln" + "format_args" + "todo" + "unreachable" + "unimplemented" + "compile_error" + ; log + "crit" + "trace" + "debug" + "info" + "warn" + "error" + ; anyhow + "anyhow" + "bail" + ; syn + "format_ident" + ; indoc + "formatdoc" + "printdoc" + "eprintdoc" + "writedoc") + (#set! injection.language "rustfmt") + (#set! injection.include-children)) + +; For these, only the second argument is format_args! +((macro_invocation + macro: + [ + (scoped_identifier + name: (_) @_macro_name) + (identifier) @_macro_name + ] + (token_tree . (_) . (string_literal) @injection.content)) + (#any-of? @_macro_name + ; std + "write" + "writeln" + "assert" + "debug_assert") + (#set! injection.language "rustfmt") + (#set! injection.include-children)) + +; For these, only the third argument is format_args! +((macro_invocation + macro: + [ + (scoped_identifier + name: (_) @_macro_name) + (identifier) @_macro_name + ] + (token_tree . (_) . (_) . (string_literal) @injection.content)) + (#any-of? @_macro_name + ; std + "assert_eq" + "debug_assert_eq" + "assert_ne" + "debug_assert_ne") + (#set! injection.language "rustfmt") + (#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 "rustfmt") + (#set! injection.include-children)) |