aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Davis2022-01-06 15:00:00 +0000
committerGitHub2022-01-06 15:00:00 +0000
commita8fd33ac012a79069ef1409503a2edcf3a585153 (patch)
tree879db9e3f4d97e1d4199af63b780e1e3d92f027c
parent2e02a1d6bc004212033b9c4e5ed0de0fd880796c (diff)
add tree-sitter-regex (#1362)
* add tree-sitter-regex * adapt regex highlights from upstream * inject regex into elixir sigil_r/2 and sigil_R/2 * generate lang-support docs * capture interesting nodes in character-ranges * make $.character_class captures more consistent * fix fallthrough behavior for character classes * capture pattern characters as 'string' * use latest tree-sitter-regex * set elixir regex injections as combined * add link to upstream queries * inject regex in rust into 'Regex::new' raw string literals
-rw-r--r--.gitmodules4
-rw-r--r--book/src/generated/lang-support.md1
m---------helix-syntax/languages/tree-sitter-regex0
-rw-r--r--languages.toml7
-rw-r--r--runtime/queries/elixir/injections.scm7
-rw-r--r--runtime/queries/regex/highlights.scm53
-rw-r--r--runtime/queries/rust/injections.scm14
7 files changed, 86 insertions, 0 deletions
diff --git a/.gitmodules b/.gitmodules
index 9297708a..f6a0fdc4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -190,3 +190,7 @@
path = helix-syntax/languages/tree-sitter-git-rebase
url = https://github.com/the-mikedavis/tree-sitter-git-rebase.git
shallow = true
+[submodule "helix-syntax/languages/tree-sitter-regex"]
+ path = helix-syntax/languages/tree-sitter-regex
+ url = https://github.com/tree-sitter/tree-sitter-regex.git
+ shallow = true
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index a1fbf172..daf8b006 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -38,6 +38,7 @@
| protobuf | ✓ | | ✓ | |
| python | ✓ | ✓ | ✓ | `pylsp` |
| racket | | | | `racket` |
+| regex | ✓ | | | |
| ruby | ✓ | | ✓ | `solargraph` |
| rust | ✓ | ✓ | ✓ | `rust-analyzer` |
| scala | ✓ | | ✓ | `metals` |
diff --git a/helix-syntax/languages/tree-sitter-regex b/helix-syntax/languages/tree-sitter-regex
new file mode 160000
+Subproject e1cfca3c79896ff79842f057ea13e529b66af63
diff --git a/languages.toml b/languages.toml
index e8329fe7..3e2e7b15 100644
--- a/languages.toml
+++ b/languages.toml
@@ -530,3 +530,10 @@ file-types = ["git-rebase-todo"]
injection-regex = "git-rebase"
comment-token = "#"
indent = { tab-width = 2, unit = " " }
+
+[[language]]
+name = "regex"
+scope = "source.regex"
+injection-regex = "regex"
+file-types = ["regex"]
+roots = []
diff --git a/runtime/queries/elixir/injections.scm b/runtime/queries/elixir/injections.scm
index 321c90ad..8370a0d8 100644
--- a/runtime/queries/elixir/injections.scm
+++ b/runtime/queries/elixir/injections.scm
@@ -1,2 +1,9 @@
((comment) @injection.content
(#set! injection.language "comment"))
+
+((sigil
+ (sigil_name) @_sigil_name
+ (quoted_content) @injection.content)
+ (#match? @_sigil_name "^(r|R)$")
+ (#set! injection.language "regex")
+ (#set! injection.combined))
diff --git a/runtime/queries/regex/highlights.scm b/runtime/queries/regex/highlights.scm
new file mode 100644
index 00000000..9376caa9
--- /dev/null
+++ b/runtime/queries/regex/highlights.scm
@@ -0,0 +1,53 @@
+; upstream: https://github.com/tree-sitter/tree-sitter-regex/blob/e1cfca3c79896ff79842f057ea13e529b66af636/queries/highlights.scm
+
+[
+ "("
+ ")"
+ "(?"
+ "(?:"
+ "(?<"
+ ">"
+ "["
+ "]"
+ "{"
+ "}"
+] @punctuation.bracket
+
+[
+ "*"
+ "+"
+ "|"
+ "="
+ "<="
+ "!"
+ "<!"
+ "?"
+] @operator
+
+[
+ (identity_escape)
+ (control_letter_escape)
+ (character_class_escape)
+ (control_escape)
+ (start_assertion)
+ (end_assertion)
+ (boundary_assertion)
+ (non_boundary_assertion)
+] @constant.character.escape
+
+(group_name) @property
+
+(count_quantifier
+ [
+ (decimal_digits) @constant.numeric
+ "," @punctuation.delimiter
+ ])
+
+(character_class
+ [
+ "^" @operator
+ (class_range "-" @operator)
+ ])
+
+(class_character) @constant.character
+(pattern_character) @string
diff --git a/runtime/queries/rust/injections.scm b/runtime/queries/rust/injections.scm
index d8382e49..77c70805 100644
--- a/runtime/queries/rust/injections.scm
+++ b/runtime/queries/rust/injections.scm
@@ -10,3 +10,17 @@
(token_tree) @injection.content)
(#set! injection.language "rust")
(#set! injection.include-children))
+
+(call_expression
+ function: (scoped_identifier
+ path: (identifier) @_regex (#eq? @_regex "Regex")
+ name: (identifier) @_new (#eq? @_new "new"))
+ arguments: (arguments (raw_string_literal) @injection.content)
+ (#set! injection.language "regex"))
+
+(call_expression
+ function: (scoped_identifier
+ path: (scoped_identifier (identifier) @_regex (#eq? @_regex "Regex") .)
+ name: (identifier) @_new (#eq? @_new "new"))
+ arguments: (arguments (raw_string_literal) @injection.content)
+ (#set! injection.language "regex"))