From 2bd8bc8d8484a4a8852280f16888a819acbfde7a Mon Sep 17 00:00:00 2001
From: Matthias Q <35303817+matthias-Q@users.noreply.github.com>
Date: Fri, 3 Mar 2023 20:12:37 +0100
Subject: [PATCH] feat(prql): add prql support (#6126)

---
 book/src/generated/lang-support.md  |   1 +
 languages.toml                      |  13 +++
 runtime/queries/prql/highlights.scm | 136 ++++++++++++++++++++++++++++
 runtime/queries/prql/injections.scm |   8 ++
 4 files changed, 158 insertions(+)
 create mode 100644 runtime/queries/prql/highlights.scm
 create mode 100644 runtime/queries/prql/injections.scm

diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index e997b3e8..cf8e5023 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -104,6 +104,7 @@
 | prisma | ✓ |  |  | `prisma-language-server` |
 | prolog |  |  |  | `swipl` |
 | protobuf | ✓ |  | ✓ |  |
+| prql | ✓ |  |  |  |
 | purescript | ✓ |  |  | `purescript-language-server` |
 | python | ✓ | ✓ | ✓ | `pylsp` |
 | qml | ✓ |  | ✓ | `qmlls` |
diff --git a/languages.toml b/languages.toml
index 006db633..b0a34be0 100644
--- a/languages.toml
+++ b/languages.toml
@@ -2208,6 +2208,19 @@ indent = { tab-width = 2, unit = "  " }
 name = "yuck"
 source = { git = "https://github.com/Philipp-M/tree-sitter-yuck", rev = "9e97da5773f82123a8c8cccf8f7e795d140ed7d1" }
 
+[[language]]
+name = "prql"
+scope = "source.prql"
+injection-regex = "prql"
+file-types = ["prql"]
+roots = []
+comment-token = "#"
+indent = { tab-width = 4, unit = "    " }
+
+[[grammar]]
+name = "prql"
+source = { git = "https://github.com/PRQL/tree-sitter-prql", rev = "3f27cac466f030ee7d985d91eba5470e01dd21ea" }
+
 [[language]]
 name = "po"
 scope = "source.po"
diff --git a/runtime/queries/prql/highlights.scm b/runtime/queries/prql/highlights.scm
new file mode 100644
index 00000000..5cfedee4
--- /dev/null
+++ b/runtime/queries/prql/highlights.scm
@@ -0,0 +1,136 @@
+[
+  (keyword_from)
+  (keyword_filter)
+  (keyword_derive)
+  (keyword_group)
+  (keyword_aggregate)
+  (keyword_sort)
+  (keyword_take)
+  (keyword_window)
+  (keyword_join)
+  (keyword_select)
+  (keyword_switch)
+  (keyword_append)
+  (keyword_remove)
+  (keyword_intersect)
+  (keyword_rolling)
+  (keyword_rows)
+  (keyword_expanding)
+  (keyword_let)
+  (keyword_prql)
+  (keyword_from_text)
+] @keyword
+
+(literal) @string
+
+(assignment
+  alias: (field) @variable.other.member)
+
+alias: (identifier) @variable.other.member
+
+(f_string) @string.special
+(s_string) @string.special
+
+(comment) @comment
+
+(keyword_func) @keyword.function
+
+(function_call
+  (identifier) @function)
+
+[
+  "+"
+  "-"
+  "*"
+  "/"
+  "="
+  "=="
+  "<"
+  "<="
+  "!="
+  ">="
+  ">"
+  "->"
+  (bang)
+] @operator
+
+[
+  "("
+  ")"
+  "["
+  "]"
+] @punctuation.bracket
+
+[
+  ","
+  "."
+  (pipe)
+] @punctuation.delimiter
+
+(literal
+  (integer) @constant.numeric.integer)
+
+(integer) @constant.numeric.integer
+
+(literal
+  (decimal_number) @constant.numeric.float)
+
+(decimal_number) @constant.numeric.float
+
+[
+  (keyword_min)
+  (keyword_max)
+  (keyword_count)
+  (keyword_count_distinct)
+  (keyword_average)
+  (keyword_avg)
+  (keyword_sum)
+  (keyword_stddev)
+  (keyword_count)
+] @function
+
+[
+ (keyword_side)
+ (keyword_version)
+ (keyword_target)
+ (keyword_null)
+ (keyword_format)
+] @attribute
+
+(target) @function.builtin
+
+ [
+  (date)
+  (time)
+  (timestamp)
+] @string.special
+
+[
+  (keyword_left)
+  (keyword_inner)
+  (keyword_right)
+  (keyword_full)
+  (keyword_csv)
+  (keyword_json)
+] @function.method
+
+[
+  (keyword_true)
+  (keyword_false)
+] @constant.builtin.boolean
+
+[
+ (keyword_and)
+ (keyword_or)
+] @keyword.operator
+
+(function_definition
+  (keyword_func)
+  name: (identifier) @function)
+
+(parameter
+  (identifier) @variable.parameter)
+
+(variable
+  (keyword_let)
+  name: (identifier) @constant)
diff --git a/runtime/queries/prql/injections.scm b/runtime/queries/prql/injections.scm
new file mode 100644
index 00000000..02a8919f
--- /dev/null
+++ b/runtime/queries/prql/injections.scm
@@ -0,0 +1,8 @@
+((s_string) @injection.content
+ (#set! injection.language "sql"))
+
+(from_text
+  (keyword_from_text)
+  (keyword_json)
+  (literal) @injection.content
+  (#set! injection.language "json"))