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.scm124
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)
+)