cpp: Improve syntax highlighting (#13922)

Fernando Tagawa created

* Added some missing operators, delimeters and keywords
* Highlight destructor, and operator overload as `@function`
* Moved `(field_identifier)` to the top, as it was highlighting methods
as `@property`

There are still some problems with something like `n1::n2::foo(...)`,
`foo` is not properly highlighted as a function

Release Notes:

- Improved C++ syntax highlighting

Change summary

crates/languages/src/cpp/highlights.scm | 54 ++++++++++++++++++++++----
1 file changed, 45 insertions(+), 9 deletions(-)

Detailed changes

crates/languages/src/cpp/highlights.scm 🔗

@@ -1,4 +1,5 @@
 (identifier) @variable
+(field_identifier) @property
 
 (call_expression
   function: (qualified_identifier
@@ -30,6 +31,11 @@
 (function_declarator
   declarator: (field_identifier) @function)
 
+(operator_name
+  (identifier)? @operator) @function
+
+(destructor_name (identifier) @function)
+
 ((namespace_identifier) @type
  (#match? @type "^[A-Z]"))
 
@@ -39,11 +45,13 @@
 ((identifier) @constant
  (#match? @constant "^_*[A-Z][A-Z\\d_]*$"))
 
-(field_identifier) @property
 (statement_identifier) @label
 (this) @variable.special
+("static_assert") @function.builtin
 
 [
+  "alignas"
+  "alignof"
   "break"
   "case"
   "catch"
@@ -51,9 +59,10 @@
   "co_await"
   "co_return"
   "co_yield"
-  "const"
+  "concept"
   "constexpr"
   "continue"
+  "decltype"
   "default"
   "delete"
   "do"
@@ -65,9 +74,7 @@
   "for"
   "friend"
   "if"
-  "if"
   "inline"
-  "mutable"
   "namespace"
   "new"
   "noexcept"
@@ -75,9 +82,9 @@
   "private"
   "protected"
   "public"
+  "requires"
   "return"
   "sizeof"
-  "static"
   "struct"
   "switch"
   "template"
@@ -87,10 +94,10 @@
   "typename"
   "union"
   "using"
-  "volatile"
   "while"
   (primitive_type)
   (sized_type_specifier)
+  (storage_class_specifier)
   (type_qualifier)
   (virtual)
 ] @keyword
@@ -126,7 +133,9 @@
 ] @string
 
 [
-  "."
+  ","
+  ":"
+  "::"
   ";"
 ] @punctuation.delimiter
 
@@ -140,20 +149,47 @@
 ] @punctuation.bracket
 
 [
-  "--"
+  "."
+  ".*"
+  "->*"
+  "~"
   "-"
+  "--"
   "-="
   "->"
   "="
+  "!"
   "!="
-  "*"
+  "|"
+  "|="
+  "||"
+  "^"
+  "^="
   "&"
+  "&="
   "&&"
   "+"
   "++"
   "+="
+  "*"
+  "*="
+  "/"
+  "/="
+  "%"
+  "%="
+  "<<"
+  "<<="
+  ">>"
+  ">>="
   "<"
   "=="
   ">"
+  "<="
+  ">="
+  "<=>"
   "||"
+  "?"
 ] @operator
+
+(conditional_expression ":" @operator)
+(user_defined_literal (literal_suffix) @operator)