aboutsummaryrefslogtreecommitdiffstats
path: root/runtime/queries/rust
diff options
context:
space:
mode:
authorChristian Clason <c.clason@uni-graz.at>2023-06-12 09:54:30 -0600
committerChristian Clason <c.clason@uni-graz.at>2025-05-12 18:43:40 +0200
commit692b051b09935653befdb8f7ba8afdb640adf17b (patch)
tree167162b6b129ae04f68c5735078521a72917c742 /runtime/queries/rust
parentfeat(c-family): inherit injections (diff)
downloadnvim-treesitter-692b051b09935653befdb8f7ba8afdb640adf17b.tar
nvim-treesitter-692b051b09935653befdb8f7ba8afdb640adf17b.tar.gz
nvim-treesitter-692b051b09935653befdb8f7ba8afdb640adf17b.tar.bz2
nvim-treesitter-692b051b09935653befdb8f7ba8afdb640adf17b.tar.lz
nvim-treesitter-692b051b09935653befdb8f7ba8afdb640adf17b.tar.xz
nvim-treesitter-692b051b09935653befdb8f7ba8afdb640adf17b.tar.zst
nvim-treesitter-692b051b09935653befdb8f7ba8afdb640adf17b.zip
feat!: drop modules, general refactor and cleanup
Diffstat (limited to 'runtime/queries/rust')
-rw-r--r--runtime/queries/rust/folds.scm25
-rw-r--r--runtime/queries/rust/highlights.scm531
-rw-r--r--runtime/queries/rust/indents.scm132
-rw-r--r--runtime/queries/rust/injections.scm89
-rw-r--r--runtime/queries/rust/locals.scm98
5 files changed, 875 insertions, 0 deletions
diff --git a/runtime/queries/rust/folds.scm b/runtime/queries/rust/folds.scm
new file mode 100644
index 000000000..9237b6f7b
--- /dev/null
+++ b/runtime/queries/rust/folds.scm
@@ -0,0 +1,25 @@
+[
+ (mod_item)
+ (foreign_mod_item)
+ (function_item)
+ (struct_item)
+ (trait_item)
+ (enum_item)
+ (impl_item)
+ (type_item)
+ (union_item)
+ (const_item)
+ (let_declaration)
+ (loop_expression)
+ (for_expression)
+ (while_expression)
+ (if_expression)
+ (match_expression)
+ (call_expression)
+ (array_expression)
+ (macro_definition)
+ (macro_invocation)
+ (attribute_item)
+ (block)
+ (use_declaration)+
+] @fold
diff --git a/runtime/queries/rust/highlights.scm b/runtime/queries/rust/highlights.scm
new file mode 100644
index 000000000..de9d09684
--- /dev/null
+++ b/runtime/queries/rust/highlights.scm
@@ -0,0 +1,531 @@
+; Forked from https://github.com/tree-sitter/tree-sitter-rust
+; Copyright (c) 2017 Maxim Sokolov
+; Licensed under the MIT license.
+; Identifier conventions
+(shebang) @keyword.directive
+
+(identifier) @variable
+
+((identifier) @type
+ (#lua-match? @type "^[A-Z]"))
+
+(const_item
+ name: (identifier) @constant)
+
+; Assume all-caps names are constants
+((identifier) @constant
+ (#lua-match? @constant "^[A-Z][A-Z%d_]*$"))
+
+; Other identifiers
+(type_identifier) @type
+
+(primitive_type) @type.builtin
+
+(field_identifier) @variable.member
+
+(shorthand_field_identifier) @variable.member
+
+(shorthand_field_initializer
+ (identifier) @variable.member)
+
+(mod_item
+ name: (identifier) @module)
+
+(self) @variable.builtin
+
+"_" @character.special
+
+(label
+ [
+ "'"
+ (identifier)
+ ] @label)
+
+; Function definitions
+(function_item
+ (identifier) @function)
+
+(function_signature_item
+ (identifier) @function)
+
+(parameter
+ [
+ (identifier)
+ "_"
+ ] @variable.parameter)
+
+(parameter
+ (ref_pattern
+ [
+ (mut_pattern
+ (identifier) @variable.parameter)
+ (identifier) @variable.parameter
+ ]))
+
+(closure_parameters
+ (_) @variable.parameter)
+
+; Function calls
+(call_expression
+ function: (identifier) @function.call)
+
+(call_expression
+ function: (scoped_identifier
+ (identifier) @function.call .))
+
+(call_expression
+ function: (field_expression
+ field: (field_identifier) @function.call))
+
+(generic_function
+ function: (identifier) @function.call)
+
+(generic_function
+ function: (scoped_identifier
+ name: (identifier) @function.call))
+
+(generic_function
+ function: (field_expression
+ field: (field_identifier) @function.call))
+
+; Assume other uppercase names are enum constructors
+((field_identifier) @constant
+ (#lua-match? @constant "^[A-Z]"))
+
+(enum_variant
+ name: (identifier) @constant)
+
+; Assume that uppercase names in paths are types
+(scoped_identifier
+ path: (identifier) @module)
+
+(scoped_identifier
+ (scoped_identifier
+ name: (identifier) @module))
+
+(scoped_type_identifier
+ path: (identifier) @module)
+
+(scoped_type_identifier
+ path: (identifier) @type
+ (#lua-match? @type "^[A-Z]"))
+
+(scoped_type_identifier
+ (scoped_identifier
+ name: (identifier) @module))
+
+((scoped_identifier
+ path: (identifier) @type)
+ (#lua-match? @type "^[A-Z]"))
+
+((scoped_identifier
+ name: (identifier) @type)
+ (#lua-match? @type "^[A-Z]"))
+
+((scoped_identifier
+ name: (identifier) @constant)
+ (#lua-match? @constant "^[A-Z][A-Z%d_]*$"))
+
+((scoped_identifier
+ path: (identifier) @type
+ name: (identifier) @constant)
+ (#lua-match? @type "^[A-Z]")
+ (#lua-match? @constant "^[A-Z]"))
+
+((scoped_type_identifier
+ path: (identifier) @type
+ name: (type_identifier) @constant)
+ (#lua-match? @type "^[A-Z]")
+ (#lua-match? @constant "^[A-Z]"))
+
+[
+ (crate)
+ (super)
+] @module
+
+(scoped_use_list
+ path: (identifier) @module)
+
+(scoped_use_list
+ path: (scoped_identifier
+ (identifier) @module))
+
+(use_list
+ (scoped_identifier
+ (identifier) @module
+ .
+ (_)))
+
+(use_list
+ (identifier) @type
+ (#lua-match? @type "^[A-Z]"))
+
+(use_as_clause
+ alias: (identifier) @type
+ (#lua-match? @type "^[A-Z]"))
+
+; Correct enum constructors
+(call_expression
+ function: (scoped_identifier
+ "::"
+ name: (identifier) @constant)
+ (#lua-match? @constant "^[A-Z]"))
+
+; Assume uppercase names in a match arm are constants.
+((match_arm
+ pattern: (match_pattern
+ (identifier) @constant))
+ (#lua-match? @constant "^[A-Z]"))
+
+((match_arm
+ pattern: (match_pattern
+ (scoped_identifier
+ name: (identifier) @constant)))
+ (#lua-match? @constant "^[A-Z]"))
+
+((identifier) @constant.builtin
+ (#any-of? @constant.builtin "Some" "None" "Ok" "Err"))
+
+; Macro definitions
+"$" @function.macro
+
+(metavariable) @function.macro
+
+(macro_definition
+ "macro_rules!" @function.macro)
+
+; Attribute macros
+(attribute_item
+ (attribute
+ (identifier) @function.macro))
+
+(inner_attribute_item
+ (attribute
+ (identifier) @function.macro))
+
+(attribute
+ (scoped_identifier
+ (identifier) @function.macro .))
+
+; Derive macros (assume all arguments are types)
+; (attribute
+; (identifier) @_name
+; arguments: (attribute (attribute (identifier) @type))
+; (#eq? @_name "derive"))
+; Function-like macros
+(macro_invocation
+ macro: (identifier) @function.macro)
+
+(macro_invocation
+ macro: (scoped_identifier
+ (identifier) @function.macro .))
+
+; Literals
+(boolean_literal) @boolean
+
+(integer_literal) @number
+
+(float_literal) @number.float
+
+[
+ (raw_string_literal)
+ (string_literal)
+] @string
+
+(escape_sequence) @string.escape
+
+(char_literal) @character
+
+; Keywords
+[
+ "use"
+ "mod"
+] @keyword.import
+
+(use_as_clause
+ "as" @keyword.import)
+
+[
+ "default"
+ "impl"
+ "let"
+ "move"
+ "unsafe"
+ "where"
+] @keyword
+
+[
+ "enum"
+ "struct"
+ "union"
+ "trait"
+ "type"
+] @keyword.type
+
+[
+ "async"
+ "await"
+ "gen"
+] @keyword.coroutine
+
+"try" @keyword.exception
+
+[
+ "ref"
+ "pub"
+ "raw"
+ (mutable_specifier)
+ "const"
+ "static"
+ "dyn"
+ "extern"
+] @keyword.modifier
+
+(lifetime
+ "'" @keyword.modifier)
+
+(lifetime
+ (identifier) @attribute)
+
+(lifetime
+ (identifier) @attribute.builtin
+ (#any-of? @attribute.builtin "static" "_"))
+
+"fn" @keyword.function
+
+[
+ "return"
+ "yield"
+] @keyword.return
+
+(type_cast_expression
+ "as" @keyword.operator)
+
+(qualified_type
+ "as" @keyword.operator)
+
+(use_list
+ (self) @module)
+
+(scoped_use_list
+ (self) @module)
+
+(scoped_identifier
+ [
+ (crate)
+ (super)
+ (self)
+ ] @module)
+
+(visibility_modifier
+ [
+ (crate)
+ (super)
+ (self)
+ ] @module)
+
+[
+ "if"
+ "else"
+ "match"
+] @keyword.conditional
+
+[
+ "break"
+ "continue"
+ "in"
+ "loop"
+ "while"
+] @keyword.repeat
+
+"for" @keyword
+
+(for_expression
+ "for" @keyword.repeat)
+
+; Operators
+[
+ "!"
+ "!="
+ "%"
+ "%="
+ "&"
+ "&&"
+ "&="
+ "*"
+ "*="
+ "+"
+ "+="
+ "-"
+ "-="
+ ".."
+ "..="
+ "..."
+ "/"
+ "/="
+ "<"
+ "<<"
+ "<<="
+ "<="
+ "="
+ "=="
+ ">"
+ ">="
+ ">>"
+ ">>="
+ "?"
+ "@"
+ "^"
+ "^="
+ "|"
+ "|="
+ "||"
+] @operator
+
+(use_wildcard
+ "*" @character.special)
+
+(remaining_field_pattern
+ ".." @character.special)
+
+(range_pattern
+ [
+ ".."
+ "..="
+ "..."
+ ] @character.special)
+
+; Punctuation
+[
+ "("
+ ")"
+ "["
+ "]"
+ "{"
+ "}"
+] @punctuation.bracket
+
+(closure_parameters
+ "|" @punctuation.bracket)
+
+(type_arguments
+ [
+ "<"
+ ">"
+ ] @punctuation.bracket)
+
+(type_parameters
+ [
+ "<"
+ ">"
+ ] @punctuation.bracket)
+
+(bracketed_type
+ [
+ "<"
+ ">"
+ ] @punctuation.bracket)
+
+(for_lifetimes
+ [
+ "<"
+ ">"
+ ] @punctuation.bracket)
+
+[
+ ","
+ "."
+ ":"
+ "::"
+ ";"
+ "->"
+ "=>"
+] @punctuation.delimiter
+
+(attribute_item
+ "#" @punctuation.special)
+
+(inner_attribute_item
+ [
+ "!"
+ "#"
+ ] @punctuation.special)
+
+(macro_invocation
+ "!" @function.macro)
+
+(never_type
+ "!" @type.builtin)
+
+(macro_invocation
+ macro: (identifier) @_identifier @keyword.exception
+ "!" @keyword.exception
+ (#eq? @_identifier "panic"))
+
+(macro_invocation
+ macro: (identifier) @_identifier @keyword.exception
+ "!" @keyword.exception
+ (#contains? @_identifier "assert"))
+
+(macro_invocation
+ macro: (identifier) @_identifier @keyword.debug
+ "!" @keyword.debug
+ (#eq? @_identifier "dbg"))
+
+; Comments
+[
+ (line_comment)
+ (block_comment)
+ (outer_doc_comment_marker)
+ (inner_doc_comment_marker)
+] @comment @spell
+
+(line_comment
+ (doc_comment)) @comment.documentation
+
+(block_comment
+ (doc_comment)) @comment.documentation
+
+(call_expression
+ function: (scoped_identifier
+ path: (identifier) @_regex
+ (#any-of? @_regex "Regex" "ByteRegexBuilder")
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (raw_string_literal
+ (string_content) @string.regexp)))
+
+(call_expression
+ function: (scoped_identifier
+ path: (scoped_identifier
+ (identifier) @_regex
+ (#any-of? @_regex "Regex" "ByteRegexBuilder") .)
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (raw_string_literal
+ (string_content) @string.regexp)))
+
+(call_expression
+ function: (scoped_identifier
+ path: (identifier) @_regex
+ (#any-of? @_regex "RegexSet" "RegexSetBuilder")
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (array_expression
+ (raw_string_literal
+ (string_content) @string.regexp))))
+
+(call_expression
+ function: (scoped_identifier
+ path: (scoped_identifier
+ (identifier) @_regex
+ (#any-of? @_regex "RegexSet" "RegexSetBuilder") .)
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (array_expression
+ (raw_string_literal
+ (string_content) @string.regexp))))
diff --git a/runtime/queries/rust/indents.scm b/runtime/queries/rust/indents.scm
new file mode 100644
index 000000000..9fe337d5c
--- /dev/null
+++ b/runtime/queries/rust/indents.scm
@@ -0,0 +1,132 @@
+[
+ (mod_item)
+ (struct_item)
+ (enum_item)
+ (impl_item)
+ (struct_expression)
+ (struct_pattern)
+ (tuple_struct_pattern)
+ (tuple_expression)
+ (tuple_type)
+ (tuple_pattern)
+ (match_block)
+ (call_expression)
+ (assignment_expression)
+ (arguments)
+ (block)
+ (where_clause)
+ (use_list)
+ (array_expression)
+ (ordered_field_declaration_list)
+ (field_declaration_list)
+ (enum_variant_list)
+ (parameters)
+ (token_tree)
+ (token_repetition)
+ (macro_definition)
+] @indent.begin
+
+(trait_item
+ body: (_) @indent.begin)
+
+(string_literal
+ (escape_sequence)) @indent.begin
+
+; Typing in "(" inside macro definitions breaks the tree entirely
+; Making macro_definition becoming errors
+; Offset this by adding back one indent for start of macro rules
+(ERROR
+ .
+ "macro_rules!"
+ [
+ "("
+ "{"
+ "["
+ ] @indent.begin
+ (#set! indent.immediate)
+ (#set! indent.start_at_same_line))
+
+(macro_definition
+ [
+ ")"
+ "}"
+ "]"
+ ] @indent.end)
+
+(trait_item
+ body: (_) @indent.begin)
+
+(string_literal
+ (escape_sequence)) @indent.begin
+
+(block
+ "}" @indent.end)
+
+(enum_item
+ body: (enum_variant_list
+ "}" @indent.end))
+
+(impl_item
+ body: (declaration_list
+ "}" @indent.end))
+
+(match_expression
+ body: (match_block
+ "}" @indent.end))
+
+(mod_item
+ body: (declaration_list
+ "}" @indent.end))
+
+(struct_item
+ body: (field_declaration_list
+ "}" @indent.end))
+
+(struct_expression
+ body: (field_initializer_list
+ "}" @indent.end))
+
+(struct_pattern
+ "}" @indent.end)
+
+(tuple_struct_pattern
+ ")" @indent.end)
+; Typing in "(" inside macro definitions breaks the tree entirely
+; Making macro_definition becoming errors
+; Offset this by adding back one indent for start of macro rules
+(ERROR
+ .
+ "macro_rules!"
+ "(" @indent.begin
+ (#set! indent.immediate)
+ (#set! indent.start_at_same_line))
+
+(tuple_type
+ ")" @indent.end)
+
+(tuple_pattern
+ ")" @indent.end)
+
+(trait_item
+ body: (declaration_list
+ "}" @indent.end))
+
+(impl_item
+ (where_clause) @indent.dedent)
+
+[
+ "where"
+ ")"
+ "]"
+ "}"
+] @indent.branch
+
+(impl_item
+ (declaration_list) @indent.branch)
+
+[
+ (line_comment)
+ (string_literal)
+] @indent.ignore
+
+(raw_string_literal) @indent.auto
diff --git a/runtime/queries/rust/injections.scm b/runtime/queries/rust/injections.scm
new file mode 100644
index 000000000..7bffd1fc9
--- /dev/null
+++ b/runtime/queries/rust/injections.scm
@@ -0,0 +1,89 @@
+(macro_invocation
+ macro: [
+ (scoped_identifier
+ name: (_) @_macro_name)
+ (identifier) @_macro_name
+ ]
+ (token_tree) @injection.content
+ (#not-any-of? @_macro_name "slint" "html" "json")
+ (#set! injection.language "rust")
+ (#set! injection.include-children))
+
+(macro_invocation
+ macro: [
+ (scoped_identifier
+ name: (_) @injection.language)
+ (identifier) @injection.language
+ ]
+ (token_tree) @injection.content
+ (#any-of? @injection.language "slint" "html" "json")
+ (#offset! @injection.content 0 1 0 -1)
+ (#set! injection.include-children))
+
+(macro_definition
+ (macro_rule
+ left: (token_tree_pattern) @injection.content
+ (#set! injection.language "rust")))
+
+(macro_definition
+ (macro_rule
+ right: (token_tree) @injection.content
+ (#set! injection.language "rust")))
+
+([
+ (line_comment)
+ (block_comment)
+] @injection.content
+ (#set! injection.language "comment"))
+
+(call_expression
+ function: (scoped_identifier
+ path: (identifier) @_regex
+ (#any-of? @_regex "Regex" "RegexBuilder")
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (raw_string_literal
+ (string_content) @injection.content))
+ (#set! injection.language "regex"))
+
+(call_expression
+ function: (scoped_identifier
+ path: (scoped_identifier
+ (identifier) @_regex
+ (#any-of? @_regex "Regex" "RegexBuilder") .)
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (raw_string_literal
+ (string_content) @injection.content))
+ (#set! injection.language "regex"))
+
+(call_expression
+ function: (scoped_identifier
+ path: (identifier) @_regex
+ (#any-of? @_regex "RegexSet" "RegexSetBuilder")
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (array_expression
+ (raw_string_literal
+ (string_content) @injection.content)))
+ (#set! injection.language "regex"))
+
+(call_expression
+ function: (scoped_identifier
+ path: (scoped_identifier
+ (identifier) @_regex
+ (#any-of? @_regex "RegexSet" "RegexSetBuilder") .)
+ name: (identifier) @_new
+ (#eq? @_new "new"))
+ arguments: (arguments
+ (array_expression
+ (raw_string_literal
+ (string_content) @injection.content)))
+ (#set! injection.language "regex"))
+
+((block_comment) @injection.content
+ (#match? @injection.content "/\\*!([a-zA-Z]+:)?re2c")
+ (#set! injection.language "re2c"))
diff --git a/runtime/queries/rust/locals.scm b/runtime/queries/rust/locals.scm
new file mode 100644
index 000000000..718d5f24a
--- /dev/null
+++ b/runtime/queries/rust/locals.scm
@@ -0,0 +1,98 @@
+; Imports
+(extern_crate_declaration
+ name: (identifier) @local.definition.import)
+
+(use_declaration
+ argument: (scoped_identifier
+ name: (identifier) @local.definition.import))
+
+(use_as_clause
+ alias: (identifier) @local.definition.import)
+
+(use_list
+ (identifier) @local.definition.import) ; use std::process::{Child, Command, Stdio};
+
+; Functions
+(function_item
+ name: (identifier) @local.definition.function)
+
+(function_item
+ name: (identifier) @local.definition.method
+ parameters: (parameters
+ (self_parameter)))
+
+; Variables
+(parameter
+ pattern: (identifier) @local.definition.var)
+
+(let_declaration
+ pattern: (identifier) @local.definition.var)
+
+(const_item
+ name: (identifier) @local.definition.var)
+
+(tuple_pattern
+ (identifier) @local.definition.var)
+
+(let_condition
+ pattern: (_
+ (identifier) @local.definition.var))
+
+(tuple_struct_pattern
+ (identifier) @local.definition.var)
+
+(closure_parameters
+ (identifier) @local.definition.var)
+
+(self_parameter
+ (self) @local.definition.var)
+
+(for_expression
+ pattern: (identifier) @local.definition.var)
+
+; Types
+(struct_item
+ name: (type_identifier) @local.definition.type)
+
+(enum_item
+ name: (type_identifier) @local.definition.type)
+
+; Fields
+(field_declaration
+ name: (field_identifier) @local.definition.field)
+
+(enum_variant
+ name: (identifier) @local.definition.field)
+
+; References
+(identifier) @local.reference
+
+((type_identifier) @local.reference
+ (#set! reference.kind "type"))
+
+((field_identifier) @local.reference
+ (#set! reference.kind "field"))
+
+; Macros
+(macro_definition
+ name: (identifier) @local.definition.macro)
+
+; Module
+(mod_item
+ name: (identifier) @local.definition.namespace)
+
+; Scopes
+[
+ (block)
+ (function_item)
+ (closure_expression)
+ (while_expression)
+ (for_expression)
+ (loop_expression)
+ (if_expression)
+ (match_expression)
+ (match_arm)
+ (struct_item)
+ (enum_item)
+ (impl_item)
+] @local.scope