From aef37d43d7a943fdf58ade7df4d8defbef9a7ce0 Mon Sep 17 00:00:00 2001
From: Sam McCall <sam.mccall@gmail.com>
Date: Sat, 15 Oct 2022 01:01:11 +0200
Subject: [PATCH] c/c++ highlighting: various tweaks

- treat `restrict`/`_Atomic` like `const`/`volatile` => @keyword.storage.modifier
- highlight `unsigned int` as builtin => @type.builtin
- recognize `static_cast` and friends => @keyword
- `template` is a kind of entity like `typename` => @keyword.storage.type
- many declaration modifiers have nothing to do with storage/types
  (explicit, friend, access specifiers, inline in C++) => @keyword
- fix floats highlighted as integer => @constant.numeric
---
 runtime/queries/c/highlights.scm   |  8 +++-----
 runtime/queries/cpp/highlights.scm | 22 ++++++++++++++++------
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/runtime/queries/c/highlights.scm b/runtime/queries/c/highlights.scm
index fe5dacaf..8122216d 100644
--- a/runtime/queries/c/highlights.scm
+++ b/runtime/queries/c/highlights.scm
@@ -8,11 +8,9 @@
 ] @keyword.storage.type
 
 [
-  "const"
   "extern"
-  "inline"
   "register"
-  "volatile"
+  (type_qualifier)
   (storage_class_specifier)
 ] @keyword.storage.modifier
 
@@ -107,7 +105,7 @@
 (system_lib_string) @string
 
 (null) @constant
-(number_literal) @constant.numeric.integer
+(number_literal) @constant.numeric
 (char_literal) @constant.character
 
 (call_expression
@@ -133,7 +131,7 @@
 (statement_identifier) @label
 (type_identifier) @type
 (primitive_type) @type.builtin
-(sized_type_specifier) @type
+(sized_type_specifier) @type.builtin
 
 ((identifier) @constant
   (#match? @constant "^[A-Z][A-Z\\d_]*$"))
diff --git a/runtime/queries/cpp/highlights.scm b/runtime/queries/cpp/highlights.scm
index 7bfccf72..8637489e 100644
--- a/runtime/queries/cpp/highlights.scm
+++ b/runtime/queries/cpp/highlights.scm
@@ -1,5 +1,11 @@
 ; Functions
 
+; These casts are parsed as function calls, but are not.
+((identifier) @keyword (#eq? @keyword "static_cast"))
+((identifier) @keyword (#eq? @keyword "dynamic_cast"))
+((identifier) @keyword (#eq? @keyword "reinterpret_cast"))
+((identifier) @keyword (#eq? @keyword "const_cast"))
+
 (call_expression
   function: (qualified_identifier
     name: (identifier) @function))
@@ -63,7 +69,6 @@
   "co_yield"
   "concept"
   "delete"
-  "final"
   "new"
   "operator"
   "requires"
@@ -95,22 +100,27 @@
   "class"  
   "namespace"
   "typename"
+  "template"
 ] @keyword.storage.type
 
 [
   "constexpr"
   "constinit"
   "consteval"
+  "mutable"
+] @keyword.storage.modifier
+
+; Modifiers that aren't plausibly type/storage related.
+[
   "explicit"
   "friend"
-  "mutable"
+  "virtual"
+  (virtual_specifier) ; override/final
   "private"
   "protected"
   "public"
-  "override"
-  "template"
-  "virtual"
-] @keyword.storage.modifier
+  "inline" ; C++ meaning differs from C!
+] @keyword
 
 ; Strings