summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules4
-rw-r--r--book/src/generated/lang-support.md1
m---------helix-syntax/languages/tree-sitter-hcl0
-rw-r--r--languages.toml9
-rw-r--r--runtime/queries/hcl/folds.scm6
-rw-r--r--runtime/queries/hcl/highlights.scm100
-rw-r--r--runtime/queries/hcl/indents.toml13
-rw-r--r--runtime/queries/hcl/injections.scm2
8 files changed, 135 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules
index fa1e0900..6c0b1fe2 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -234,3 +234,7 @@
path = helix-syntax/languages/tree-sitter-kotlin
url = https://github.com/fwcd/tree-sitter-kotlin.git
shallow = true
+[submodule "helix-syntax/languages/tree-sitter-hcl"]
+ path = helix-syntax/languages/tree-sitter-hcl
+ url = https://github.com/MichaHoffmann/tree-sitter-hcl.git
+ shallow = true
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 49538215..40ca50f6 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -21,6 +21,7 @@
| go | ✓ | ✓ | ✓ | `gopls` |
| graphql | ✓ | | | |
| haskell | ✓ | | | `haskell-language-server-wrapper` |
+| hcl | ✓ | | ✓ | |
| html | ✓ | | | |
| iex | ✓ | | | |
| java | ✓ | | | |
diff --git a/helix-syntax/languages/tree-sitter-hcl b/helix-syntax/languages/tree-sitter-hcl
new file mode 160000
+Subproject 3cb7fc28247efbcb2973b97e71c78838ad98a58
diff --git a/languages.toml b/languages.toml
index 33906e4b..2ce4cf12 100644
--- a/languages.toml
+++ b/languages.toml
@@ -757,3 +757,12 @@ roots = ["settings.gradle", "settings.gradle.kts"]
comment-token = "//"
indent = { tab-width = 4, unit = " " }
language-server = { command = "kotlin-language-server" }
+
+[[language]]
+name = "hcl"
+scope = "source.hcl"
+injection-regex = "(hcl|tf)"
+file-types = ["hcl", "tf"]
+roots = []
+comment-token = "#"
+indent = { tab-width = 2, unit = " " }
diff --git a/runtime/queries/hcl/folds.scm b/runtime/queries/hcl/folds.scm
new file mode 100644
index 00000000..cb20b2aa
--- /dev/null
+++ b/runtime/queries/hcl/folds.scm
@@ -0,0 +1,6 @@
+[
+ (comment)
+ (block)
+ (heredoc_template)
+ (object)
+] @fold
diff --git a/runtime/queries/hcl/highlights.scm b/runtime/queries/hcl/highlights.scm
new file mode 100644
index 00000000..03b3e525
--- /dev/null
+++ b/runtime/queries/hcl/highlights.scm
@@ -0,0 +1,100 @@
+(ERROR) @error
+
+; { key: val }
+
+(object_elem val: (expression
+ (variable_expr
+ (identifier) @type.builtin (#match? @type.builtin "^(bool|string|number|object|tuple|list|map|set|any)$"))))
+
+(get_attr (identifier) @variable.builtin (#match? @variable.builtin "^(root|cwd|module)$"))
+(variable_expr (identifier) @variable.builtin (#match? @variable.builtin "^(var|local|path)$"))
+((identifier) @type.builtin (#match? @type.builtin "^(bool|string|number|object|tuple|list|map|set|any)$"))
+((identifier) @keyword (#match? @keyword "^(module|root|cwd|resource|variable|data|locals|terraform|provider|output)$"))
+
+; highlight identifier keys as though they were block attributes
+(object_elem key: (expression (variable_expr (identifier) @variable.other.member)))
+
+(attribute (identifier) @variable.other.member)
+(function_call (identifier) @function.method)
+(block (identifier) @type.builtin)
+
+(identifier) @variable
+(comment) @comment
+(null_lit) @constant.builtin
+(numeric_lit) @constant.number
+(bool_lit) @constant.builtin.boolean
+
+[
+ (template_interpolation_start) ; ${
+ (template_interpolation_end) ; }
+ (template_directive_start) ; %{
+ (template_directive_end) ; }
+ (strip_marker) ; ~
+] @punctuation.special
+
+[
+ (heredoc_identifier) ; <<END
+ (heredoc_start) ; END
+] @punctuation.delimiter
+
+[
+ (quoted_template_start) ; "
+ (quoted_template_end); "
+ (template_literal) ; non-interpolation/directive content
+] @string
+
+[
+ "if"
+ "else"
+ "endif"
+] @keyword.control.conditional
+
+[
+ "for"
+ "endfor"
+ "in"
+] @keyword.control.repeat
+
+[
+ ":"
+ "="
+] @none
+
+[
+ (ellipsis)
+ "\?"
+ "=>"
+] @punctuation.special
+
+[
+ "."
+ ".*"
+ ","
+ "[*]"
+] @punctuation.delimiter
+
+[
+ "{"
+ "}"
+ "["
+ "]"
+ "("
+ ")"
+] @punctuation.bracket
+
+[
+ "!"
+ "\*"
+ "/"
+ "%"
+ "\+"
+ "-"
+ ">"
+ ">="
+ "<"
+ "<="
+ "=="
+ "!="
+ "&&"
+ "||"
+] @operator
diff --git a/runtime/queries/hcl/indents.toml b/runtime/queries/hcl/indents.toml
new file mode 100644
index 00000000..b0d4a3f0
--- /dev/null
+++ b/runtime/queries/hcl/indents.toml
@@ -0,0 +1,13 @@
+indent = [
+ "object",
+ "block",
+ "tuple",
+ "for_tuple_expr",
+ "for_object_expr"
+]
+
+outdent = [
+ "object_end",
+ "block_end",
+ "tuple_end"
+]
diff --git a/runtime/queries/hcl/injections.scm b/runtime/queries/hcl/injections.scm
new file mode 100644
index 00000000..fd69161a
--- /dev/null
+++ b/runtime/queries/hcl/injections.scm
@@ -0,0 +1,2 @@
+((comment) @injection.content
+ (#set! injection.language "comment"))