Fix c++-ts-mode font-lock for latest c++ grammar (bug#73191)

* lisp/progmodes/c-ts-mode.el:
(c-ts-mode--keywords): Add "thread_local" keyword.
(c-ts-mode--test-virtual-named-p): New function.
(c-ts-mode--font-lock-settings): Use named/anonymous "virtual" depending
on the grammar.
This commit is contained in:
Yuan Fu 2024-09-14 11:07:28 -07:00
parent ffc00eac53
commit 21efdd5ef3
No known key found for this signature in database
GPG key ID: 56E19BC57664A442

View file

@ -574,7 +574,7 @@ MODE is either `c' or `cpp'."
"or_eq" "override" "private" "protected"
"public" "requires" "template" "throw"
"try" "typename" "using"
"xor" "xor_eq"))
"xor" "xor_eq" "thread_local"))
(append '("auto") c-keywords))))
(defvar c-ts-mode--type-keywords
@ -592,6 +592,11 @@ MODE is either `c' or `cpp'."
"LIVE_BUFFER" "FRAME"))
"A regexp matching all the variants of the FOR_EACH_* macro.")
(defun c-ts-mode--test-virtual-named-p ()
"Return t if the virtual keyword is a namded node, nil otherwise."
(ignore-errors
(progn (treesit-query-compile 'cpp "(virtual)" t) t)))
(defun c-ts-mode--font-lock-settings (mode)
"Tree-sitter font-lock settings.
MODE is either `c' or `cpp'."
@ -636,8 +641,13 @@ MODE is either `c' or `cpp'."
`([,@(c-ts-mode--keywords mode)] @font-lock-keyword-face
,@(when (eq mode 'cpp)
'((auto) @font-lock-keyword-face
(this) @font-lock-keyword-face
(virtual) @font-lock-keyword-face)))
(this) @font-lock-keyword-face))
,@(when (and (eq mode 'cpp)
(c-ts-mode--test-virtual-named-p))
'((virtual) @font-lock-keyword-face))
,@(when (and (eq mode 'cpp)
(not (c-ts-mode--test-virtual-named-p)))
'("virtual" @font-lock-keyword-face)))
:language mode
:feature 'operator