diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index 55b92862..a1746c4c 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -46,6 +46,7 @@ | make | ✓ | | | | | markdown | ✓ | | | | | mint | | | | `mint` | +| nickel | ✓ | | ✓ | `nls` | | nix | ✓ | | ✓ | `rnix-lsp` | | ocaml | ✓ | | ✓ | `ocamllsp` | | ocaml-interface | ✓ | | | `ocamllsp` | diff --git a/languages.toml b/languages.toml index 6e78e78a..fb54427d 100644 --- a/languages.toml +++ b/languages.toml @@ -380,6 +380,21 @@ indent = { tab-width = 4, unit = " " } name = "python" source = { git = "https://github.com/tree-sitter/tree-sitter-python", rev = "d6210ceab11e8d812d4ab59c07c81458ec6e5184" } +[[language]] +name = "nickel" +scope = "source.nickel" +injection-regex = "nickel" +file-types = ["ncl"] +shebangs = [] +roots = [] +comment-token = "#" +language-server = { command = "nls" } +indent = { tab-width = 2, unit = " " } + +[[grammar]] +name = "nickel" +source = { git = "https://github.com/nickel-lang/tree-sitter-nickel", rev = "85348774ccf7624fac72703b2264d18b6f572be6" } + [[language]] name = "nix" scope = "source.nix" diff --git a/runtime/queries/nickel/highlights.scm b/runtime/queries/nickel/highlights.scm new file mode 100644 index 00000000..a204dfca --- /dev/null +++ b/runtime/queries/nickel/highlights.scm @@ -0,0 +1,67 @@ +(types) @type +(type_builtin) @type.builtin +"Array" @type.builtin + +(enum_tag) @constructor + +"null" @constant.builtin +(bool) @constant.builtin.boolean +(str_esc_char) @constant.character.escape +(num_literal) @constant.numeric + +(str_chunks) @string + +; NOTE: Nickel has no block comments +(comment) @comment.line +; Nickel doesn't use comments for documentation, ideally this would be +; `@documentation` or something similar +(annot_atom + doc: (static_string) @comment.block.documentation +) + +(record_operand (atom (ident) @variable)) +(let_expr + "let" @keyword + pat: (pattern + (ident) @variable + ) + "in" @keyword +) +(fun_expr + "fun" @keyword.function + pats: + (pattern + id: (ident) @variable.parameter + )+ + "=>" @operator +) +(record_field) @variable.other.member + +[ + "." +] @punctuation.delimiter +[ + "{" "}" + "(" ")" + "[|" "|]" + "[" "]" +] @punctuation.bracket +(multstr_start) @punctuation.bracket +(multstr_end) @punctuation.bracket +(interpolation_start) @punctuation.bracket +(interpolation_end) @punctuation.bracket + +["forall" "default" "doc"] @keyword +["if" "then" "else" "switch"] @keyword.control.conditional +"import" @keyword.control.import + +(infix_expr + op: (_) @operator +) + +(applicative + t1: (applicative + (record_operand) @function + ) +) +(builtin) @function.builtin diff --git a/runtime/queries/nickel/indents.scm b/runtime/queries/nickel/indents.scm new file mode 100644 index 00000000..8be5a6bd --- /dev/null +++ b/runtime/queries/nickel/indents.scm @@ -0,0 +1,17 @@ +[ + (fun_expr) + (let_expr) + (switch_expr) + (ite_expr) + + (uni_record) + (str_chunks_multi) + "[" + "[|" +] @indent + +[ + "}" + "]" + "|]" +] @outdent