From ac2a7731a6d04b8b913f49531058c7e2a843efd5 Mon Sep 17 00:00:00 2001
From: angelodlfrtr <angelo.delefortrie@gmail.com>
Date: Sat, 18 Mar 2023 15:17:02 +0100
Subject: [PATCH] =?UTF-8?q?Add=20language=20support=20for=20Cap=E2=80=99n?=
 =?UTF-8?q?=20Proto=20format=20(#6325)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 book/src/generated/lang-support.md   |   1 +
 languages.toml                       |  13 +++
 runtime/queries/capnp/folds.scm      |  14 +++
 runtime/queries/capnp/highlights.scm | 141 +++++++++++++++++++++++++++
 runtime/queries/capnp/indents.scm    |  19 ++++
 runtime/queries/capnp/injections.scm |   2 +
 runtime/queries/capnp/locals.scm     |  96 ++++++++++++++++++
 7 files changed, 286 insertions(+)
 create mode 100644 runtime/queries/capnp/folds.scm
 create mode 100644 runtime/queries/capnp/highlights.scm
 create mode 100644 runtime/queries/capnp/indents.scm
 create mode 100644 runtime/queries/capnp/injections.scm
 create mode 100644 runtime/queries/capnp/locals.scm

diff --git a/book/src/generated/lang-support.md b/book/src/generated/lang-support.md
index 8aefe581..f62b147f 100644
--- a/book/src/generated/lang-support.md
+++ b/book/src/generated/lang-support.md
@@ -10,6 +10,7 @@
 | c | ✓ | ✓ | ✓ | `clangd` |
 | c-sharp | ✓ | ✓ |  | `OmniSharp` |
 | cairo | ✓ |  |  |  |
+| capnp | ✓ |  | ✓ |  |
 | clojure | ✓ |  |  | `clojure-lsp` |
 | cmake | ✓ | ✓ | ✓ | `cmake-language-server` |
 | comment | ✓ |  |  |  |
diff --git a/languages.toml b/languages.toml
index 42ebf154..73114a19 100644
--- a/languages.toml
+++ b/languages.toml
@@ -2328,3 +2328,16 @@ roots = []
 [[grammar]]
 name = "rst"
 source = { git = "https://github.com/stsewd/tree-sitter-rst", rev = "25e6328872ac3a764ba8b926aea12719741103f1" }
+
+[[language]]
+name = "capnp"
+scope = "source.capnp"
+injection-regex = "capnp"
+file-types = ["capnp"]
+roots = []
+comment-token = "#"
+indent = { tab-width = 2, unit = "  " }
+
+[[grammar]]
+name = "capnp"
+source = { git = "https://github.com/amaanq/tree-sitter-capnp", rev = "fc6e2addf103861b9b3dffb82c543eb6b71061aa" }
diff --git a/runtime/queries/capnp/folds.scm b/runtime/queries/capnp/folds.scm
new file mode 100644
index 00000000..6e3f9c18
--- /dev/null
+++ b/runtime/queries/capnp/folds.scm
@@ -0,0 +1,14 @@
+[
+  (annotation_targets)
+  (const_list)
+  (enum)
+  (interface)
+  (implicit_generics)
+  (generics)
+  (group)
+  (method_parameters)
+  (named_return_types)
+  (struct)
+  (struct_shorthand)
+  (union)
+] @fold
diff --git a/runtime/queries/capnp/highlights.scm b/runtime/queries/capnp/highlights.scm
new file mode 100644
index 00000000..27ddf8e2
--- /dev/null
+++ b/runtime/queries/capnp/highlights.scm
@@ -0,0 +1,141 @@
+; Preproc
+
+(unique_id) @keyword.directive
+(top_level_annotation_body) @keyword.directive
+
+; Includes
+
+[
+  "import"
+  "$import"
+  "embed"
+] @keyword.control.import
+
+(import_path) @string
+
+; Builtins
+
+[
+  (primitive_type)
+  "List"
+] @type.builtin
+
+; Typedefs
+
+(type_definition) @type
+
+; Labels (@number, @number!)
+
+(field_version) @label
+
+; Methods
+
+(annotation_definition_identifier) @function.method
+(method_identifier) @function.method
+
+; Fields
+
+(field_identifier) @variable.other.member
+
+; Properties
+
+(property) @label
+
+; Parameters
+
+(param_identifier) @variable.parameter
+(return_identifier) @variable.parameter
+
+; Constants
+
+(const_identifier) @variable
+(local_const) @constant
+(enum_member) @type.enum.variant
+
+(void) @constant.builtin
+
+; Types
+
+(enum_identifier) @type.enum
+(extend_type) @type
+(type_identifier) @type
+
+; Attributes
+
+(annotation_identifier) @attribute
+(attribute) @attribute
+
+; Operators
+
+[
+ ; @ ! -
+  "="
+] @operator
+
+; Keywords
+
+
+[
+  "annotation"
+  "enum"
+  "group"
+  "interface"
+  "struct"
+  "union"
+] @keyword.storage.type
+
+[
+  "extends"
+  "namespace"
+  "using"
+  (annotation_target)
+] @special
+
+; Literals
+
+[
+  (string)
+  (concatenated_string)
+  (block_text)
+  (namespace)
+] @string
+
+(escape_sequence) @constant.character.escape
+
+(data_string) @string.special
+
+(number) @constant.numeric.integer
+
+(float) @constant.numeric.float
+
+(boolean) @constant.builtin.boolean
+
+; Misc
+
+[
+  "const"
+] @keyword.storage.modifier
+
+[
+  "*"
+  "$"
+  ":"
+] @string.special.symbol
+
+["{" "}"] @punctuation.bracket
+
+["(" ")"] @punctuation.bracket
+
+["[" "]"] @punctuation.bracket
+
+[
+  ","
+  ";"
+  "->"
+] @punctuation.delimiter
+
+(data_hex) @constant
+
+; Comments
+
+(comment) @comment.line
diff --git a/runtime/queries/capnp/indents.scm b/runtime/queries/capnp/indents.scm
new file mode 100644
index 00000000..9adaf34f
--- /dev/null
+++ b/runtime/queries/capnp/indents.scm
@@ -0,0 +1,19 @@
+[
+  (annotation_targets)
+  (const_list)
+  (enum)
+  (interface)
+  (implicit_generics)
+  (generics)
+  (group)
+  (method_parameters)
+  (named_return_types)
+  (struct)
+  (struct_shorthand)
+  (union)
+] @indent
+
+[
+  "}"
+  ")"
+] @outdent
diff --git a/runtime/queries/capnp/injections.scm b/runtime/queries/capnp/injections.scm
new file mode 100644
index 00000000..321c90ad
--- /dev/null
+++ b/runtime/queries/capnp/injections.scm
@@ -0,0 +1,2 @@
+((comment) @injection.content
+ (#set! injection.language "comment"))
diff --git a/runtime/queries/capnp/locals.scm b/runtime/queries/capnp/locals.scm
new file mode 100644
index 00000000..e98ce260
--- /dev/null
+++ b/runtime/queries/capnp/locals.scm
@@ -0,0 +1,96 @@
+; Scopes
+
+[
+  (message)
+  (annotation_targets)
+  (const_list)
+  (enum)
+  (interface)
+  (implicit_generics)
+  (generics)
+  (group)
+  (method_parameters)
+  (named_return_types)
+  (struct)
+  (struct_shorthand)
+  (union)
+] @local.scope
+
+; References
+
+[
+  (extend_type)
+  (field_type)
+] @local.reference
+(custom_type (type_identifier) @local.reference)
+(custom_type
+  (generics
+    (generic_parameters 
+      (generic_identifier) @local.reference)))
+
+; Definitions
+
+(annotation_definition_identifier) @local.definition
+
+(const_identifier) @local.definition
+
+(enum (enum_identifier) @local.definition)
+
+[
+  (enum_member)
+  (field_identifier)
+] @local.definition
+
+(method_identifier) @local.definition
+
+(namespace) @local.definition
+
+[
+  (param_identifier)
+  (return_identifier)
+] @local.definition
+
+(group (type_identifier) @local.definition)
+
+(struct (type_identifier) @local.definition)
+
+(union (type_identifier) @local.definition)
+
+(interface (type_identifier) @local.definition)
+
+; Generics Related (don't know how to combine these)
+
+(struct
+  (generics
+    (generic_parameters
+      (generic_identifier) @local.definition)))
+
+(interface
+  (generics
+    (generic_parameters
+      (generic_identifier) @local.definition)))
+
+(method
+  (implicit_generics
+    (implicit_generic_parameters
+      (generic_identifier) @local.definition)))
+
+(method
+  (generics
+    (generic_parameters
+      (generic_identifier) @local.definition)))
+
+(annotation
+  (generics
+    (generic_parameters
+      (generic_identifier) @local.definition)))
+
+(replace_using
+  (generics
+    (generic_parameters
+      (generic_identifier) @local.definition)))
+
+(return_type
+  (generics
+    (generic_parameters
+      (generic_identifier) @local.definition)))