From a1272bdb17a63361342a318982e46129d558743c Mon Sep 17 00:00:00 2001
From: Tobias Hunger
Date: Wed, 7 Feb 2024 19:36:29 +0100
Subject: slint: Update treesitter parser and queries (#9551)

* slint: Update treesitter parser and queries

* slint: Port over suggestions from nvim review---
 book/src/generated/lang-support.md    |   2 +-
 languages.toml                        |   2 +-
 runtime/queries/rust/injections.scm   |  20 +-
 runtime/queries/slint/highlights.scm  | 339 +++++++++++++++++++++-------------
 runtime/queries/slint/indents.scm     |  17 +-
 runtime/queries/slint/locals.scm      |   9 +-
 runtime/queries/slint/textobjects.scm |  35 ++++
 7 files changed, 278 insertions(+), 146 deletions(-)
 create mode 100644 runtime/queries/slint/textobjects.scm

diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index ddd48053..279acc4f 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -148,7 +148,7 @@
 | scala | ✓ | ✓ | ✓ | `metals` |
 | scheme | ✓ |  | ✓ |  |
 | scss | ✓ |  |  | `vscode-css-language-server` |
-| slint | ✓ |  | ✓ | `slint-lsp` |
+| slint | ✓ | ✓ | ✓ | `slint-lsp` |
 | smali | ✓ |  | ✓ |  |
 | smithy | ✓ |  |  | `cs` |
 | sml | ✓ |  |  |  |
diff --git a/languages.toml b/languages.toml
index 11afea0c..bad22129 100644
--- a/languages.toml
+++ b/languages.toml
@@ -2139,7 +2139,7 @@ language-servers = [ "slint-lsp" ]
 
 [[grammar]]
 name = "slint"
-source = { git = "https://github.com/jrmoulton/tree-sitter-slint", rev = "00c8a2d3645766f68c0d0460086c0a994e5b0d85" }
+source = { git = "https://github.com/slint-ui/tree-sitter-slint", rev = "15618215b79b9db08f824a5c97a12d073dcc1c00" }
 
 [[language]]
 name = "task"
diff --git a/runtime/queries/rust/injections.scm b/runtime/queries/rust/injections.scm
index ae9e587f..b05b9d97 100644
--- a/runtime/queries/rust/injections.scm
+++ b/runtime/queries/rust/injections.scm
@@ -2,11 +2,29 @@
  (#set! injection.language "comment"))
 
 ((macro_invocation
-   macro: (identifier) @_html (#eq? @_html "html")
+   macro:
+     [
+       (scoped_identifier
+         name: (_) @_macro_name)
+       (identifier) @_macro_name
+     ]
    (token_tree) @injection.content)
+ (#eq? @_macro_name "html")
  (#set! injection.language "html")
  (#set! injection.include-children))
 
+((macro_invocation
+   macro:
+     [
+       (scoped_identifier
+         name: (_) @_macro_name)
+       (identifier) @_macro_name
+     ]
+   (token_tree) @injection.content)
+ (#eq? @_macro_name "slint")
+ (#set! injection.language "slint")
+ (#set! injection.include-children))
+
 ((macro_invocation
   (token_tree) @injection.content)
  (#set! injection.language "rust")
diff --git a/runtime/queries/slint/highlights.scm b/runtime/queries/slint/highlights.scm
index c0ef3dd8..06d82a41 100644
--- a/runtime/queries/slint/highlights.scm
+++ b/runtime/queries/slint/highlights.scm
@@ -1,122 +1,109 @@
+(comment) @comment
+
+; Different types:
+(string_value) @string
+(bool_value) @constant.builtin.boolean
+
+; Constants
+
+(escape_sequence) @constant.character.escape
+
+(color_value) @constant
 
-(identifier) @variable
 [
-  (type_identifier) 
-  (units)
-]@type
+  (children_identifier)
+  (easing_kind_identifier)
+] @constant.builtin
 
-(array_literal 
-  (identifier) @type)
+[
+  (int_value)
+  (physical_length_value)
+] @constant.numeric.integer
 
-(function_identifier) @function
 [
-  (image_macro)
-  (children_macro)
-  (radial_grad_macro)
-  (linear_grad_macro)
-] @function.macro
+  (float_value)
+  (percent_value)
+  (length_value)
+  (duration_value)
+  (angle_value)
+  (relative_font_size_value)
+] @constant.numeric.float
 
-(call_expression
-  function: (identifier) @function)
-(call_expression
-  function: (field_expression
-    field: (identifier) @function))
+(purity) @keyword.storage.modifier
 
-(vis) @keyword.control.import
+(function_visibility) @keyword.storage.modifier
 
-(transition_statement state: (identifier) @variable.other.member)
-(state_expression state: (identifier) @variable.other.member)
-(struct_block_definition field: (identifier) @variable.other.member)
-(assign_property (identifier) @attribute)
+(property_visibility) @keyword.storage.modifier
 
-(comment) @comment
+(builtin_type_identifier) @type.builtin
 
-(string_literal) @string
-(int_literal) @constant.numeric.integer
-(float_literal) @constant.numeric.float
+(reference_identifier) @variable.builtin
 
-[
-  "in"
-  "in-out"
-  "for"
-] @keyword.control.repeat
+(type
+  [
+    (type_list)
+    (user_type_identifier)
+    (anon_struct_block)
+  ]) @type
 
-[
-  "import"
-  "export"
-  "from"
-] @keyword.control.import
+(user_type_identifier) @type
 
-[
-  "if"
-  "else"
-  "when"
-] @keyword.control.conditional
+; Functions and callbacks
+(argument) @variable.parameter
 
-[
-  "struct"
-  "property"
-] @keyword.storage.type
+(function_call
+  name: (_) @function.call)
 
-[
-  "global"
-] @keyword.storage.modifier
+; definitions
+(callback
+  name: (_) @function)
 
+(callback_alias
+  name: (_) @function)
 
-[
-  "root"
-  "parent"
-  "duration"
-  "easing"
-] @variable.builtin
+(callback_event
+  name: (simple_identifier) @function.call)
 
+(enum_definition
+  name: (_) @type.enum)
 
-[
-  "callback"
-  "animate"
-  "states"
-  "out"
-  "transitions"
-  "component"
-  "inherits"
-] @keyword
+(function_definition
+  name: (_) @function)
 
-[
-  "black"
-  "transparent"
-  "blue"
-  "ease"
-  "ease_in"
-  "ease-in"
-  "ease_in_out"
-  "ease-in-out"
-  "ease_out"
-  "ease-out"
-  "end"
-  "green"
-  "red"
-  "start"
-  "yellow"
-  "white"
-  "gray"
- ] @constant.builtin
+(struct_definition
+  name: (_) @type)
+
+(typed_identifier
+  type: (_) @type)
+
+; Operators
+(binary_expression
+  op: (_) @operator)
+
+(unary_expression
+  op: (_) @operator)
 
 [
-  "true"
-  "false"
-] @constant.builtin.boolean
+  (comparison_operator)
+  (mult_prec_operator)
+  (add_prec_operator)
+  (unary_prec_operator)
+  (assignment_prec_operator)
+] @operator
 
-"@" @keyword
+[
+  ":="
+  "=>"
+  "->"
+  "<=>"
+] @operator
 
-; ; Punctuation
 [
-  ","
-  "."
   ";"
-  ":"
+  "."
+  ","
 ] @punctuation.delimiter
 
-; ; Brackets
 [
   "("
   ")"
@@ -126,46 +113,136 @@
   "}"
 ] @punctuation.bracket
 
-(define_property ["<" ">"] @punctuation.bracket)
+(property
+  [
+    "<"
+    ">"
+  ] @punctuation.bracket)
 
-[
-  "angle"
-  "bool"
-  "brush"
-  "color" 
-  "duration"
-  "easing"
-  "float"
-  "image"
-  "int"
-  "length"
-  "percent"
-  "physical-length"
-  "physical_length"
-  "string"
-] @type.builtin
+; Properties, constants and variables
+(component
+  id: (simple_identifier) @constant)
+
+(property
+  name: (simple_identifier) @variable)
+
+(binding_alias
+  name: (simple_identifier) @variable)
+
+(binding
+  name: (simple_identifier) @variable)
+
+(struct_block
+  (simple_identifier) @variable.other.member)
+
+(anon_struct_block
+  (simple_identifier) @variable.other.member)
+
+(property_assignment
+  property: (simple_identifier) @variable)
+
+(states_definition
+  name: (simple_identifier) @variable)
+
+(callback
+  name: (simple_identifier) @variable)
+
+(typed_identifier
+  name: (_) @variable)
+
+(simple_indexed_identifier
+  (simple_identifier) @variable)
+
+(expression
+  (simple_identifier) @variable)
 
+; Attributes
 [
- ":="
- "<=>"
- "!"
- "-"
- "+"
- "*"
- "/"
- "&&"
- "||"
- ">"
- "<"
- ">="
- "<="
- "="
- ":"
- "+="
- "-="
- "*="
- "/="
- "?"
- "=>" ] @operator
-
-(ternary_expression [":" "?"] @keyword.control.conditional)
\ No newline at end of file
+  (linear_gradient_identifier)
+  (radial_gradient_identifier)
+  (radial_gradient_kind)
+] @attribute
+
+(image_call
+  "@image-url" @attribute)
+
+(tr
+  "@tr" @attribute)
+
+; Keywords
+(animate_option_identifier) @keyword
+
+(export) @keyword.control.import
+
+(if_statement
+  "if" @keyword.control.conditional)
+
+(if_expr
+  [
+    "if"
+    "else"
+  ] @keyword.control.conditional)
+
+(ternary_expression
+  [
+    "?"
+    ":"
+  ] @keyword.control.conditional)
+
+(animate_statement
+  "animate" @keyword)
+
+(callback
+  "callback" @keyword.function)
+
+(component_definition
+  [
+    "component"
+    "inherits"
+  ] @keyword.storage.type)
+
+(enum_definition
+  "enum" @keyword.storage.type)
+
+(for_loop
+  [
+    "for"
+    "in"
+  ] @keyword.control.repeat)
+
+(function_definition
+  "function" @keyword.function)
+
+(global_definition
+  "global" @keyword.storage.type)
+
+(imperative_block
+  "return" @keyword.control.return)
+
+(import_statement
+  [
+    "import"
+    "from"
+  ] @keyword.control.import)
+
+(import_type
+  "as" @keyword.control.import)
+
+(property
+  "property" @keyword.storage.type)
+
+(states_definition
+  [
+    "states"
+    "when"
+  ] @keyword)
+
+(struct_definition
+  "struct" @keyword.storage.type)
+
+(transitions_definition
+  [
+    "transitions"
+    "in"
+    "out"
+  ] @keyword)
diff --git a/runtime/queries/slint/indents.scm b/runtime/queries/slint/indents.scm
index 4b5ce41b..189f8a0e 100644
--- a/runtime/queries/slint/indents.scm
+++ b/runtime/queries/slint/indents.scm
@@ -1,12 +1,11 @@
 [
-  (comp_body) 
-  (state_statement)
-  (transition_statement)
-  (handler_body)
-  (consequence_body)
-  (global_single)
+  (anon_struct_block)
+  (assignment_block)
+  (block)
+  (enum_block)
+  (global_block)
+  (imperative_block)
+  (struct_block)
 ] @indent
 
-[
-  "}"
-] @outdent
+"}" @outdent
diff --git a/runtime/queries/slint/locals.scm b/runtime/queries/slint/locals.scm
index a115f0c6..06601b05 100644
--- a/runtime/queries/slint/locals.scm
+++ b/runtime/queries/slint/locals.scm
@@ -1,3 +1,6 @@
-; locals.scm
-
-(component_item) @local.scope
+[
+  (component)
+  (component_definition)
+  (function_definition)
+  (imperative_block)
+] @local.scope
diff --git a/runtime/queries/slint/textobjects.scm b/runtime/queries/slint/textobjects.scm
new file mode 100644
index 00000000..7e2f3609
--- /dev/null
+++ b/runtime/queries/slint/textobjects.scm
@@ -0,0 +1,35 @@
+(function_definition
+  (imperative_block) @funtion.inside) @function.around
+
+(callback_event
+  (imperative_block) @function.inside) @function.around
+
+(property
+  (imperative_block) @function.inside) @function.around
+
+(struct_definition
+  (struct_block) @class.inside) @class.around
+
+(enum_definition
+  (enum_block) @class.inside) @class.around
+
+(global_definition
+  (global_block) @class.inside) @class.around
+
+(component_definition
+  (block) @class.inside) @class.around
+
+(component_definition
+  (block) @class.inside) @class.around
+
+(comment) @comment.around
+
+(typed_identifier
+  name: (_) @parameter.inside) @parameter.around
+
+(callback
+  arguments: (_) @parameter.inside)
+
+(string_value
+  "\"" . (_) @text.inside . "\"") @text.around
+
-- 
cgit v1.2.3-70-g09d2