From ab65bc728f51fea530c6f11b81bc35976ee84ebb Mon Sep 17 00:00:00 2001 From: Michael Daffin Date: Wed, 23 Feb 2022 16:45:00 +0000 Subject: [PATCH] Add support for HCL language Queries based on the neovims ones: https://github.com/nvim-treesitter/nvim-treesitter/tree/master/queries/hcl and modified for helix support. There are a few snippets that I did not know how to port across and are commented out. --- .gitmodules | 3 + book/src/generated/lang-support.md | 1 + helix-syntax/languages/tree-sitter-hcl | 1 + languages.toml | 9 +++ runtime/queries/hcl/folds.scm | 6 ++ runtime/queries/hcl/highlights.scm | 100 +++++++++++++++++++++++++ runtime/queries/hcl/indents.toml | 13 ++++ runtime/queries/hcl/injections.scm | 2 + 8 files changed, 135 insertions(+) create mode 160000 helix-syntax/languages/tree-sitter-hcl create mode 100644 runtime/queries/hcl/folds.scm create mode 100644 runtime/queries/hcl/highlights.scm create mode 100644 runtime/queries/hcl/indents.toml create mode 100644 runtime/queries/hcl/injections.scm diff --git a/.gitmodules b/.gitmodules index fa1e0900ac914..e8f6bcadd9121 100644 --- a/.gitmodules +++ b/.gitmodules @@ -234,3 +234,6 @@ 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 diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index 4953821529ad7..40ca50f6859cb 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 index 0000000000000..3cb7fc28247ef --- /dev/null +++ b/helix-syntax/languages/tree-sitter-hcl @@ -0,0 +1 @@ +Subproject commit 3cb7fc28247efbcb2973b97e71c78838ad98a583 diff --git a/languages.toml b/languages.toml index 9876bcf10e59e..f7e62409e262e 100644 --- a/languages.toml +++ b/languages.toml @@ -750,3 +750,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 0000000000000..cb20b2aa8213b --- /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 0000000000000..9320191d0f30e --- /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) @field))) + +(attribute (identifier) @variable.other.member) +(function_call (identifier) @function.method) +(block (identifier) @type.builtin) + +(identifier) @variable +(comment) @comment +(null) @constant.builtin +(numeric_literal) @constant.number + +[ + (true) + (false) +] @constant.builtin.boolean + +;[ +; (template_interpolation_start) ; ${ +; (template_interpolation_end) ; } +; (template_directive_start) ; %{ +; (template_directive_end) ; } +; (strip_marker) ; ~ +;] @punctuation.special + +;[ +; (heredoc_identifier) ; <" +] @punctuation.special + +[ + "." + "," +] @punctuation.delimiter + +[ + "{" + "}" + "[" + "]" + "(" + ")" +] @punctuation.bracket + +[ + "!" + "\*" + "/" + "%" + "\+" + "-" + ">" + ">=" + "<" + "<=" + "==" + "!=" + "&&" + "||" +] @operator + +[ + (string_literal) + (quoted_template) +] @string + +(escape_sequence) @punctuation.special diff --git a/runtime/queries/hcl/indents.toml b/runtime/queries/hcl/indents.toml new file mode 100644 index 0000000000000..b0d4a3f0d877f --- /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 0000000000000..fd69161ae990a --- /dev/null +++ b/runtime/queries/hcl/injections.scm @@ -0,0 +1,2 @@ +((comment) @injection.content + (#set! injection.language "comment"))