Unnamed repository; edit this file 'description' to name the repository.
Add pest support (#10616)
Support [pest-parser](https://github.com/pest-parser) - [pest-language-server](https://github.com/pest-parser/pest-ide-tools) - [tree-sitter-pest](https://github.com/pest-parser/tree-sitter-pest) close #7878
Erasin Wang 2024-04-29
parent ec22479 · commit 724a96a
-rw-r--r--book/src/generated/lang-support.md1
-rw-r--r--languages.toml21
-rw-r--r--runtime/queries/pest/highlights.scm49
-rw-r--r--runtime/queries/pest/indents.scm9
-rw-r--r--runtime/queries/pest/injections.scm7
-rw-r--r--runtime/queries/pest/textobjects.scm8
6 files changed, 95 insertions, 0 deletions
diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 45cc1384..77d304cc 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -141,6 +141,7 @@
| passwd | ✓ | | | |
| pem | ✓ | | | |
| perl | ✓ | ✓ | ✓ | `perlnavigator` |
+| pest | ✓ | ✓ | ✓ | `pest-language-server` |
| php | ✓ | ✓ | ✓ | `intelephense` |
| php-only | ✓ | | | |
| pkgbuild | ✓ | ✓ | ✓ | `pkgbuild-language-server`, `bash-language-server` |
diff --git a/languages.toml b/languages.toml
index 7e858b05..ecf1b49f 100644
--- a/languages.toml
+++ b/languages.toml
@@ -67,6 +67,7 @@ openscad-lsp = { command = "openscad-lsp", args = ["--stdio"] }
pasls = { command = "pasls", args = [] }
pbkit = { command = "pb", args = [ "lsp" ] }
perlnavigator = { command = "perlnavigator", args= ["--stdio"] }
+pest-language-server = { command = "pest-language-server" }
prisma-language-server = { command = "prisma-language-server", args = ["--stdio"] }
purescript-language-server = { command = "purescript-language-server", args = ["--stdio"] }
pylsp = { command = "pylsp" }
@@ -3558,3 +3559,23 @@ language-servers = []
[[grammar]]
name = "move"
source = { git = "https://github.com/tzakian/tree-sitter-move", rev = "8bc0d1692caa8763fef54d48068238d9bf3c0264" }
+
+[[language]]
+name = "pest"
+scope = "source.pest"
+injection-regex = "pest"
+file-types = ["pest"]
+comment-tokens = ["//", "///", "//!"]
+block-comment-tokens = { start = "/*", end = "*/" }
+indent = { tab-width = 4, unit = " " }
+language-servers = ["pest-language-server"]
+
+[language.auto-pairs]
+'(' = ')'
+'{' = '}'
+'[' = ']'
+'"' = '"'
+
+[[grammar]]
+name = "pest"
+source = { git = "https://github.com/pest-parser/tree-sitter-pest", rev = "a8a98a824452b1ec4da7f508386a187a2f234b85" }
diff --git a/runtime/queries/pest/highlights.scm b/runtime/queries/pest/highlights.scm
new file mode 100644
index 00000000..9d6f13c2
--- /dev/null
+++ b/runtime/queries/pest/highlights.scm
@@ -0,0 +1,49 @@
+(line_comment) @comment
+(block_comment) @comment
+
+[
+ "("
+ ")"
+ "["
+ "]"
+ "{"
+ "}"
+] @punctuation.bracket
+
+((identifier) @variable)
+((builtin) @type.builtin)
+((const) @constant)
+
+[
+ (string)
+ (character)
+] @string
+
+[
+ "_"
+ "@"
+ "$"
+]@keyword.storage.modifier
+
+[
+ "~"
+ "|"
+ "="
+ "+"
+ "*"
+ "&"
+ "^"
+ "!"
+ "?"
+ ".."
+] @operator
+
+[
+ "PUSH"
+ "PEEK"
+ "POP"
+ "SOI"
+ "EOI"
+ "ANY"
+] @keyword
+
diff --git a/runtime/queries/pest/indents.scm b/runtime/queries/pest/indents.scm
new file mode 100644
index 00000000..51042f90
--- /dev/null
+++ b/runtime/queries/pest/indents.scm
@@ -0,0 +1,9 @@
+[
+ (expression)
+] @indent
+
+[
+ "]"
+ "}"
+ ")"
+] @outdent
diff --git a/runtime/queries/pest/injections.scm b/runtime/queries/pest/injections.scm
new file mode 100644
index 00000000..0a79c8f8
--- /dev/null
+++ b/runtime/queries/pest/injections.scm
@@ -0,0 +1,7 @@
+((line_comment) @injection.content
+ (#set! injection.language "comment")
+ (#set! injection.include-children))
+
+((block_comment) @injection.content
+ (#set! injection.language "comment")
+ (#set! injection.include-children))
diff --git a/runtime/queries/pest/textobjects.scm b/runtime/queries/pest/textobjects.scm
new file mode 100644
index 00000000..75ccd09e
--- /dev/null
+++ b/runtime/queries/pest/textobjects.scm
@@ -0,0 +1,8 @@
+(grammar_rule (_) @class.inside) @class.around
+(term (_) @entry.inside) @entry.around
+
+(line_comment) @comment.inside
+(line_comment)+ @comment.around
+
+(block_comment) @comment.inside
+(block_comment)+ @comment.around