From f5b95beef69bbd8e627b6b0e7ea69317fd12b763 Mon Sep 17 00:00:00 2001 From: Jared Ramirez Date: Sat, 5 Feb 2022 21:24:01 -0800 Subject: [PATCH] feat(languages): rescript (#1616) * Add rescript language support * cargo xtask docgen * Add textobjects & file line ending * Fix text objects & rerun docgen * Fix textobjects queries --- .gitmodules | 4 + book/src/generated/lang-support.md | 1 + helix-syntax/languages/tree-sitter-rescript | 1 + languages.toml | 11 ++ runtime/queries/rescript/highlights.scm | 179 ++++++++++++++++++++ runtime/queries/rescript/injections.scm | 8 + runtime/queries/rescript/textobjects.scm | 9 + 7 files changed, 213 insertions(+) create mode 160000 helix-syntax/languages/tree-sitter-rescript create mode 100644 runtime/queries/rescript/highlights.scm create mode 100644 runtime/queries/rescript/injections.scm create mode 100644 runtime/queries/rescript/textobjects.scm diff --git a/.gitmodules b/.gitmodules index d35b0f33bcf0..55ed97b3238d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -222,3 +222,7 @@ path = helix-syntax/languages/tree-sitter-twig url = https://github.com/eirabben/tree-sitter-twig.git shallow = true +[submodule "helix-syntax/languages/tree-sitter-rescript"] + path = helix-syntax/languages/tree-sitter-rescript + url = https://github.com/jaredramirez/tree-sitter-rescript + shallow = true diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md index d10b56f14fa0..64dab6d335ae 100644 --- a/book/src/generated/lang-support.md +++ b/book/src/generated/lang-support.md @@ -46,6 +46,7 @@ | python | ✓ | ✓ | ✓ | `pylsp` | | racket | | | | `racket` | | regex | ✓ | | | | +| rescript | ✓ | ✓ | | `rescript-language-server` | | ruby | ✓ | | ✓ | `solargraph` | | rust | ✓ | ✓ | ✓ | `rust-analyzer` | | scala | ✓ | | ✓ | `metals` | diff --git a/helix-syntax/languages/tree-sitter-rescript b/helix-syntax/languages/tree-sitter-rescript new file mode 160000 index 000000000000..761eb9126b65 --- /dev/null +++ b/helix-syntax/languages/tree-sitter-rescript @@ -0,0 +1 @@ +Subproject commit 761eb9126b65e078b1b5770ac296b4af8870f933 diff --git a/languages.toml b/languages.toml index 74c01da5f792..041d1564ddd9 100644 --- a/languages.toml +++ b/languages.toml @@ -602,3 +602,14 @@ scope = "source.iex" injection-regex = "iex" file-types = ["iex"] roots = [] + +[[language]] +name = "rescript" +scope = "source.rescript" +injection-regex = "rescript" +file-types = ["res"] +roots = ["bsconfig.json"] +auto-format = true +comment-token = "//" +language-server = { command = "rescript-language-server", args = ["--stdio"] } +indent = { tab-width = 2, unit = " " } diff --git a/runtime/queries/rescript/highlights.scm b/runtime/queries/rescript/highlights.scm new file mode 100644 index 000000000000..b9ab8ea635ef --- /dev/null +++ b/runtime/queries/rescript/highlights.scm @@ -0,0 +1,179 @@ +(comment) @comment + +; Identifiers +;------------ + +; Escaped identifiers like \"+." +((value_identifier) @function.macro + (#match? @function.macro "^\\.*$")) + +[ + (type_identifier) + (unit_type) + "list" +] @type + +[ + (variant_identifier) + (polyvar_identifier) +] @constant + +(property_identifier) @variable.other.member +(module_identifier) @namespace + +(jsx_identifier) @tag +(jsx_attribute (property_identifier) @variable.parameter) + +; Parameters +;---------------- + +(list_pattern (value_identifier) @variable.parameter) +(spread_pattern (value_identifier) @variable.parameter) + +; String literals +;---------------- + +[ + (string) + (template_string) +] @string + +(template_substitution + "${" @punctuation.bracket + "}" @punctuation.bracket) @embedded + +(character) @constant.character +(escape_sequence) @constant.character.escape + +; Other literals +;--------------- + +[ + (true) + (false) +] @constant.builtin + +(number) @constant.numeric +(polyvar) @constant +(polyvar_string) @constant + +; Functions +;---------- + +[ + (formal_parameters (value_identifier)) + (positional_parameter (value_identifier)) + (labeled_parameter (value_identifier)) +] @variable.parameter + +(function parameter: (value_identifier) @variable.parameter) + +; Meta +;----- + +[ + "@" + "@@" + (decorator_identifier) +] @label + +(extension_identifier) @keyword +("%") @keyword + +; Misc +;----- + +(subscript_expression index: (string) @variable.other.member) +(polyvar_type_pattern "#" @constant) + +[ + ("include") + ("open") +] @keyword + +[ + "as" + "export" + "external" + "let" + "module" + "mutable" + "private" + "rec" + "type" + "and" +] @keyword + +[ + "if" + "else" + "switch" +] @keyword + +[ + "exception" + "try" + "catch" + "raise" +] @keyword + +[ + "." + "," + "|" +] @punctuation.delimiter + +[ + "++" + "+" + "+." + "-" + "-." + "*" + "*." + "/" + "/." + "<" + "<=" + "==" + "===" + "!" + "!=" + "!==" + ">" + ">=" + "&&" + "||" + "=" + ":=" + "->" + "|>" + ":>" + (uncurry) +] @operator + +[ + "(" + ")" + "{" + "}" + "[" + "]" +] @punctuation.bracket + +(polyvar_type + [ + "[" + "[>" + "[<" + "]" + ] @punctuation.bracket) + +[ + "~" + "?" + "=>" + "..." +] @punctuation + +(ternary_expression ["?" ":"] @operator) diff --git a/runtime/queries/rescript/injections.scm b/runtime/queries/rescript/injections.scm new file mode 100644 index 000000000000..201cce757bba --- /dev/null +++ b/runtime/queries/rescript/injections.scm @@ -0,0 +1,8 @@ +((comment) @injection.content + (#set! injection.language "comment")) + +((raw_js) @injection.content + (#set! injection.language "javascript")) + +((raw_gql) @injection.content + (#set! injection.language "graphql")) diff --git a/runtime/queries/rescript/textobjects.scm b/runtime/queries/rescript/textobjects.scm new file mode 100644 index 000000000000..7ee8cd1a97cf --- /dev/null +++ b/runtime/queries/rescript/textobjects.scm @@ -0,0 +1,9 @@ +; Classes (modules) +;------------------ + +(module_declaration definition: ((_) @class.inside)) @class.around + +; Functions +;---------- + +(function body: (_) @function.inside) @function.around