aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoralois312022-11-23 03:49:02 +0000
committerGitHub2022-11-23 03:49:02 +0000
commit26ec1cf39a3c5f548f199918b0a84d614a5c6be7 (patch)
tree8b0c5cd2f238ae81f66d6ae19dc67b916a17ba3c
parent42e37a571e75aaf4feb1717dfebe8cf215e535dd (diff)
Add QML language support (#4842)
Fixes https://github.com/helix-editor/helix/issues/2771
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml13
-rw-r--r--runtime/queries/qml/highlights.scm90
-rw-r--r--runtime/queries/qml/indents.scm6
-rw-r--r--runtime/queries/qml/injections.scm16
5 files changed, 126 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 59b60851..ac955036 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -93,6 +93,7 @@
| protobuf | ✓ | | ✓ | |
| purescript | ✓ | | | `purescript-language-server` |
| python | ✓ | ✓ | ✓ | `pylsp` |
+| qml | ✓ | | ✓ | `qmlls` |
| r | ✓ | | | `R` |
| racket | | | | `racket` |
| regex | ✓ | | | |
diff --git a/languages.toml b/languages.toml
index 47d77fee..1e7dcbf7 100644
--- a/languages.toml
+++ b/languages.toml
@@ -1980,3 +1980,16 @@ language-server = { command = "bicep-langserver" }
[[grammar]]
name = "bicep"
source = { git = "https://github.com/the-mikedavis/tree-sitter-bicep", rev = "d8e097fcfa143854861ef737161163a09cc2916b" }
+
+[[language]]
+name = "qml"
+scope = "source.qml"
+file-types = ["qml"]
+roots = []
+language-server = { command = "qmlls" }
+indent = { tab-width = 4, unit = " " }
+grammar = "qmljs"
+
+[[grammar]]
+name = "qmljs"
+source = { git = "https://github.com/yuja/tree-sitter-qmljs", rev = "0b2b25bcaa7d4925d5f0dda16f6a99c588a437f1" }
diff --git a/runtime/queries/qml/highlights.scm b/runtime/queries/qml/highlights.scm
new file mode 100644
index 00000000..11178fcd
--- /dev/null
+++ b/runtime/queries/qml/highlights.scm
@@ -0,0 +1,90 @@
+(comment) @comment
+
+(ui_import
+ source: _ @namespace
+ version: _? @constant
+ alias: _? @namespace)
+
+(ui_pragma
+ name: (identifier) @attribute
+ value: (identifier)? @constant)
+
+(ui_annotation
+ "@" @punctuation
+ type_name: _ @type)
+
+;;; Declarations
+
+(enum_declaration
+ name: (identifier) @type)
+
+(enum_assignment
+ name: (identifier) @constant
+ value: _ @constant)
+
+(enum_body
+ name: (identifier) @constant)
+
+(ui_inline_component
+ name: (identifier) @type)
+
+(ui_object_definition
+ type_name: _ @type)
+
+(ui_object_definition_binding
+ type_name: _ @type
+ name: _ @variable.other.member)
+
+(ui_property
+ type: _ @type
+ name: (identifier) @variable.other.member)
+
+(ui_signal
+ name: (identifier) @function)
+
+(ui_signal_parameter
+ name: (identifier) @variable.parameter
+ type: _ @type)
+
+(ui_signal_parameter
+ type: _ @type
+ name: (identifier) @variable.parameter);;; Properties and bindings
+
+;;; Bindings
+
+(ui_binding
+ name: _ @variable.other.member)
+
+;;; Other
+
+[
+ "("
+ ")"
+ "{"
+ "}"
+] @punctuation.bracket
+
+(ui_list_property_type [
+ "<"
+ ">"
+] @punctuation.bracket)
+
+[
+ ","
+ "."
+ ":"
+] @punctuation.delimiter
+
+[
+ "as"
+ "component"
+ "default"
+ "enum"
+ "import"
+ "on"
+ "pragma"
+ "property"
+ "readonly"
+ "required"
+ "signal"
+] @keyword
diff --git a/runtime/queries/qml/indents.scm b/runtime/queries/qml/indents.scm
new file mode 100644
index 00000000..07492283
--- /dev/null
+++ b/runtime/queries/qml/indents.scm
@@ -0,0 +1,6 @@
+[
+ (enum_body)
+ (ui_object_initializer)
+] @indent
+
+"}" @outdent
diff --git a/runtime/queries/qml/injections.scm b/runtime/queries/qml/injections.scm
new file mode 100644
index 00000000..1ce987d3
--- /dev/null
+++ b/runtime/queries/qml/injections.scm
@@ -0,0 +1,16 @@
+((comment) @injection.content
+ (#set! injection.language "comment"))
+
+([
+ (empty_statement)
+ (expression_statement)
+ (function_declaration)
+ (generator_function_declaration)
+ (statement_block)
+ (switch_statement)
+ (try_statement)
+ (variable_declaration)
+ (with_statement)
+ ] @injection.content
+ (#set! injection.include-children)
+ (#set! injection.language "javascript"))