aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpostsolar <120750161+postsolar@users.noreply.github.com>2023-11-08 18:07:02 +0200
committerGitHub <noreply@github.com>2023-11-08 18:07:02 +0200
commitbf18ff20ae4d7b667b5e7ede0244c6596427d69e (patch)
treea3fc33da986596dabbf5740f43cb456b0183f113
parentUpdate README (diff)
downloadnvim-treesitter-bf18ff20ae4d7b667b5e7ede0244c6596427d69e.tar
nvim-treesitter-bf18ff20ae4d7b667b5e7ede0244c6596427d69e.tar.gz
nvim-treesitter-bf18ff20ae4d7b667b5e7ede0244c6596427d69e.tar.bz2
nvim-treesitter-bf18ff20ae4d7b667b5e7ede0244c6596427d69e.tar.lz
nvim-treesitter-bf18ff20ae4d7b667b5e7ede0244c6596427d69e.tar.xz
nvim-treesitter-bf18ff20ae4d7b667b5e7ede0244c6596427d69e.tar.zst
nvim-treesitter-bf18ff20ae4d7b667b5e7ede0244c6596427d69e.zip
feat(purescript): add parser and queries (#5626)
-rw-r--r--lockfile.json3
-rw-r--r--lua/nvim-treesitter/parsers.lua8
-rw-r--r--queries/purescript/highlights.scm152
-rw-r--r--queries/purescript/injections.scm2
-rw-r--r--queries/purescript/locals.scm4
5 files changed, 169 insertions, 0 deletions
diff --git a/lockfile.json b/lockfile.json
index 0f623b2a9..bbff16fa8 100644
--- a/lockfile.json
+++ b/lockfile.json
@@ -476,6 +476,9 @@
"puppet": {
"revision": "9ce9a5f7d64528572aaa8d59459ba869e634086b"
},
+ "purescript": {
+ "revision": "e055b28b2f81db9fdd277b07bff3329c3680943e"
+ },
"pymanifest": {
"revision": "8953f91d733dd92c1ac43b3d58a7a2f43fa62dae"
},
diff --git a/lua/nvim-treesitter/parsers.lua b/lua/nvim-treesitter/parsers.lua
index 9c4ac31f9..2671a7ae7 100644
--- a/lua/nvim-treesitter/parsers.lua
+++ b/lua/nvim-treesitter/parsers.lua
@@ -1418,6 +1418,14 @@ list.puppet = {
maintainers = { "@amaanq" },
}
+list.purescript = {
+ install_info = {
+ url = "https://github.com/postsolar/tree-sitter-purescript",
+ files = { "src/parser.c", "src/scanner.c" },
+ },
+ maintainers = { "@postsolar" },
+}
+
list.pymanifest = {
install_info = {
url = "https://github.com/ObserverOfTime/tree-sitter-pymanifest",
diff --git a/queries/purescript/highlights.scm b/queries/purescript/highlights.scm
new file mode 100644
index 000000000..3e3ec3cb8
--- /dev/null
+++ b/queries/purescript/highlights.scm
@@ -0,0 +1,152 @@
+; ----------------------------------------------------------------------------
+; Literals and comments
+
+[
+ (integer)
+ (exp_negation)
+] @number
+ (exp_literal (number)) @float
+ (char) @character
+ [
+ (string)
+ (triple_quote_string)
+ ] @string
+
+ (comment) @comment @spell
+
+; ----------------------------------------------------------------------------
+; Punctuation
+
+ [
+ "("
+ ")"
+ "{"
+ "}"
+ "["
+ "]"
+ ] @punctuation.bracket
+
+ [
+ (comma)
+ ";"
+ (qualified_module) ; grabs the `.` (dot), ex: import System.IO
+ "."
+ ] @punctuation.delimiter
+
+
+; ----------------------------------------------------------------------------
+; Keywords, operators, includes
+
+ [
+ "if"
+ "then"
+ "else"
+ "case"
+ "of"
+ ] @conditional
+
+ [
+ "import"
+ "module"
+ ] @include
+
+ [
+ (operator)
+ (constructor_operator)
+ (type_operator)
+ (all_names)
+
+ "="
+ "|"
+ "::"
+ "∷"
+ "=>"
+ "⇒"
+ "<="
+ "⇐"
+ "->"
+ "→"
+ "<-"
+ "←"
+ "\\"
+ "`"
+ "@"
+ ] @operator
+
+ (qualified_module (module) @constructor)
+ (module) @namespace
+ (qualified_type (module) @namespace)
+ (qualified_variable (module) @namespace)
+ (import (module) @namespace)
+
+ [
+ (where)
+ "let"
+ "in"
+ "class"
+ "instance"
+ "derive"
+ "foreign"
+ "data"
+ "newtype"
+ "type"
+ "as"
+ "hiding"
+ "do"
+ "ado"
+ "forall"
+ "∀"
+ "infix"
+ "infixl"
+ "infixr"
+ ] @keyword
+
+ (class_instance "else" @keyword)
+
+ (type_role_declaration
+ "role" @keyword
+ role: (type_role) @type.qualifier)
+
+ (hole) @character.special
+
+ ; `_` wildcards in if-then-else and case-of expressions,
+ ; as well as record updates and operator sections
+ (wildcard) @parameter
+
+; ----------------------------------------------------------------------------
+; Functions and variables
+
+ (variable) @variable
+ (exp_apply . (exp_name (variable) @function))
+ (exp_apply . (exp_name (qualified_variable (variable) @function)))
+
+ (row_field (field_name) @field)
+ (record_field (field_name) @field)
+ (record_accessor (variable) @field)
+ (exp_record_access (variable) @field)
+
+ (signature name: (variable) @type)
+ (kind_declaration (class_name) @type)
+ (function name: (variable) @function)
+ (foreign_import (variable) @function)
+ (class_instance (instance_name) @function)
+ (derive_declaration (instance_name) @function)
+
+ ; true or false
+ ((variable) @boolean
+ (#any-of? @boolean "true" "false"))
+
+ ; The former one works for `tree-sitter highlight` but not in Helix/Kakoune.
+ ; The latter two work in Helix (but not Kakoune) and are a good compromise between not highlighting anything at all
+ ; as an operator and leaving it to the child nodes, and highlighting everything as an operator.
+ (exp_ticked (_) @operator)
+ (exp_ticked (exp_name (variable) @operator))
+ (exp_ticked (exp_name (qualified_variable (variable) @operator)))
+
+; ----------------------------------------------------------------------------
+; Types
+
+ (type) @type
+
+ (constructor) @constructor
+
diff --git a/queries/purescript/injections.scm b/queries/purescript/injections.scm
new file mode 100644
index 000000000..321c90add
--- /dev/null
+++ b/queries/purescript/injections.scm
@@ -0,0 +1,2 @@
+((comment) @injection.content
+ (#set! injection.language "comment"))
diff --git a/queries/purescript/locals.scm b/queries/purescript/locals.scm
new file mode 100644
index 000000000..d8219bf43
--- /dev/null
+++ b/queries/purescript/locals.scm
@@ -0,0 +1,4 @@
+(signature name: (variable)) @definition.type
+(function name: (variable)) @definition.function
+(pat_name (variable)) @definition
+(exp_name (variable)) @reference