Unnamed repository; edit this file 'description' to name the repository.
queries: add textobjects for qml (#13855)
Kristoffer Plagborg Bak Sørensen 8 months ago
parent bcb6c20 · commit 6c6607e
-rw-r--r--book/src/generated/lang-support.md2
-rw-r--r--runtime/queries/qml/textobjects.scm49
2 files changed, 50 insertions, 1 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index f16644a1..4f1191b3 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -189,7 +189,7 @@
| pug | ✓ | | | |
| purescript | ✓ | ✓ | | `purescript-language-server` |
| python | ✓ | ✓ | ✓ | `ty`, `ruff`, `jedi-language-server`, `pylsp` |
-| qml | ✓ | | ✓ | `qmlls` |
+| qml | ✓ | ✓ | ✓ | `qmlls` |
| quarto | ✓ | | ✓ | |
| quint | ✓ | | | `quint-language-server` |
| r | ✓ | | | `R` |
diff --git a/runtime/queries/qml/textobjects.scm b/runtime/queries/qml/textobjects.scm
new file mode 100644
index 00000000..13662742
--- /dev/null
+++ b/runtime/queries/qml/textobjects.scm
@@ -0,0 +1,49 @@
+; (comment) is used for both // and /* ... */ comment syntax
+(comment) @comment.inside
+(comment)+ @comment.around
+
+(ui_object_definition
+ initializer: (_) @class.inside) @class.around
+
+(ui_binding
+ name: (identifier) @parameter.inside) @parameter.around
+
+(ui_property
+ (_)+ @parameter.inside ":") @parameter.around
+
+(function_declaration
+ body: (_) @function.inside) @function.around
+
+(arrow_function
+ body: (_) @function.inside) @function.around
+
+; e.g. `onClicked: console.log("Button clicked!")`
+((ui_binding
+ name: (identifier) @_name
+ value: (_) @function.around @function.inside)
+ (#match? @_name "^on[A-Z].*"))
+
+; e.g.
+; Component.onCompleted: {
+; console.log("completed")
+; }
+(statement_block (expression_statement)* @function.inside) @function.around
+
+; e.g.
+; states: [
+; State { name: "activated" },
+; State { name: "deactivated" }
+; ]
+(ui_object_array
+ ((_) @entry.inside . ","? @entry.around) @entry.around)
+
+; e.g. [1, 2, 3, 4]
+(array
+ ((_) @entry.inside . ","? @entry.around) @entry.around)
+
+; Tests in QML are written using "Qt Quick Test" and it's `TestCase` type
+; ref: https://doc.qt.io/qt-6/qtquicktest-index.html
+((ui_object_definition
+ type_name: (identifier) @_name
+ initializer: (_) @test.inside) @test.around
+ (#eq? @_name "TestCase"))