From 8c29b76bccc51c19c90f7c9ee156fe2cb6f52e2c Mon Sep 17 00:00:00 2001
From: Sebastian Neubauer
Date: Wed, 29 Dec 2021 10:30:44 +0100
Subject: Improve llvm highlighting and queries (#1388)

* Improve llvm highlighting and queries

The llvm tree-sitter parser was updated to support scopes and more
accurate highlighting.

* Group highlight expressions better---
 runtime/queries/llvm/highlights.scm  | 162 +++++++++++++++++++++++++++++++++--
 runtime/queries/llvm/indents.toml    |   8 ++
 runtime/queries/llvm/locals.scm      |  14 +++
 runtime/queries/llvm/textobjects.scm |  16 ++++
 4 files changed, 191 insertions(+), 9 deletions(-)
 create mode 100644 runtime/queries/llvm/indents.toml
 create mode 100644 runtime/queries/llvm/locals.scm
 create mode 100644 runtime/queries/llvm/textobjects.scm

(limited to 'runtime')

diff --git a/runtime/queries/llvm/highlights.scm b/runtime/queries/llvm/highlights.scm
index 73afe85e..cb705197 100644
--- a/runtime/queries/llvm/highlights.scm
+++ b/runtime/queries/llvm/highlights.scm
@@ -1,14 +1,158 @@
 (type) @type
-(statement) @keyword.operator
+(type_keyword) @type.builtin
+
+(type [
+    (local_var)
+    (global_var)
+  ] @type)
+
+(argument) @variable.parameter
+
+(_ inst_name: _ @keyword.operator)
+
+[
+  "catch"
+  "filter"
+] @keyword.operator
+
+[
+  "to"
+  "nuw"
+  "nsw"
+  "exact"
+  "unwind"
+  "from"
+  "cleanup"
+  "swifterror"
+  "volatile"
+  "inbounds"
+  "inrange"
+  (icmp_cond)
+  (fcmp_cond)
+  (fast_math)
+] @keyword.control
+
+(_ callee: _ @function)
+(function_header name: _ @function)
+
+[
+  "declare"
+  "define"
+  (calling_conv)
+] @keyword.function
+
+[
+  "target"
+  "triple"
+  "datalayout"
+  "source_filename"
+  "addrspace"
+  "blockaddress"
+  "align"
+  "syncscope"
+  "within"
+  "uselistorder"
+  "uselistorder_bb"
+  "module"
+  "asm"
+  "sideeffect"
+  "alignstack"
+  "inteldialect"
+  "unwind"
+  "type"
+  "global"
+  "constant"
+  "externally_initialized"
+  "alias"
+  "ifunc"
+  "section"
+  "comdat"
+  "thread_local"
+  "localdynamic"
+  "initialexec"
+  "localexec"
+  "any"
+  "exactmatch"
+  "largest"
+  "nodeduplicate"
+  "samesize"
+  "distinct"
+  "attributes"
+  "vscale"
+  "no_cfi"
+  (linkage_aux)
+  (dso_local)
+  (visibility)
+  (dll_storage_class)
+  (unnamed_addr)
+  (attribute_name)
+] @keyword
+
+
+(function_header [
+    (linkage)
+    (calling_conv)
+    (unnamed_addr)
+  ] @keyword.function)
+
+[
+  (string)
+  (cstring)
+] @string
+
 (number) @constant.numeric.integer
 (comment) @comment
-(string) @string
 (label) @label
-(keyword) @keyword
-"ret" @keyword.control.return
-(boolean) @constant.builtin.boolean
+(_ inst_name: "ret" @keyword.control.return)
 (float) @constant.numeric.float
-(constant) @constant
-(identifier) @variable
-(symbol) @punctuation.delimiter
-(bracket) @punctuation.bracket
+
+[
+  (local_var)
+  (global_var)
+] @variable
+
+[
+  (struct_value)
+  (array_value)
+  (vector_value)
+] @constructor
+
+[
+  "("
+  ")"
+  "["
+  "]"
+  "{"
+  "}"
+  "<"
+  ">"
+  "<{"
+  "}>"
+] @punctuation.bracket
+
+[
+  ","
+  ":"
+] @punctuation.delimiter
+
+[
+  "="
+  "|"
+  "x"
+  "..."
+] @operator
+
+[
+  "true"
+  "false"
+] @constant.builtin.boolean
+
+[
+  "undef"
+  "poison"
+  "null"
+  "none"
+  "zeroinitializer"
+] @constant.builtin
+
+(ERROR) @error
diff --git a/runtime/queries/llvm/indents.toml b/runtime/queries/llvm/indents.toml
new file mode 100644
index 00000000..8cd603c8
--- /dev/null
+++ b/runtime/queries/llvm/indents.toml
@@ -0,0 +1,8 @@
+indent = [
+ "function_body",
+ "instruction",
+]
+
+outdent = [
+ "}",
+]
diff --git a/runtime/queries/llvm/locals.scm b/runtime/queries/llvm/locals.scm
new file mode 100644
index 00000000..1946c287
--- /dev/null
+++ b/runtime/queries/llvm/locals.scm
@@ -0,0 +1,14 @@
+; Scopes
+
+(function_body) @local.scope
+
+; Definitions
+
+(argument
+  (value (var (local_var) @local.definition)))
+
+(instruction
+  (local_var) @local.definition)
+
+; References
+(local_var) @local.reference
diff --git a/runtime/queries/llvm/textobjects.scm b/runtime/queries/llvm/textobjects.scm
new file mode 100644
index 00000000..3738a3bb
--- /dev/null
+++ b/runtime/queries/llvm/textobjects.scm
@@ -0,0 +1,16 @@
+(define
+  body: (_) @function.inside) @function.around
+
+(struct_type
+  (struct_body) @class.inside) @class.around
+
+(packed_struct_type
+  (struct_body) @class.inside) @class.around
+
+(array_type
+  (array_vector_body) @class.inside) @class.around
+
+(vector_type
+  (array_vector_body) @class.inside) @class.around
+
+(argument) @parameter.inside
-- 
cgit v1.2.3-70-g09d2