Skip to content

Commit b2606d9

Browse files
authored
[semantic-tokens] Add support for semantic tokens faces overrides (#2826)
* Add support for semantic tokens faces overrides * Improve doc
1 parent d9aa843 commit b2606d9

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

clients/lsp-clojure.el

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ If there are more arguments expected after the line and column numbers."
273273
(make-lsp-client
274274
:download-server-fn (lambda (_client callback error-callback _update?)
275275
(lsp-package-ensure 'clojure-lsp callback error-callback))
276+
:semantic-tokens-faces-overrides '(:types (("macro" . font-lock-keyword-face)
277+
("keyword" . clojure-keyword-face)))
276278
:new-connection (lsp-stdio-connection
277279
(lambda ()
278280
(or lsp-clojure-custom-server-command

lsp-mode.el

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,6 +1416,8 @@ return value of `body' or nil if interrupted."
14161416
multi-root
14171417
;; Initialization options or a function that returns initialization options.
14181418
initialization-options
1419+
;; Overrides semantic tokens faces for specific clients
1420+
semantic-tokens-faces-overrides
14191421
;; Provides support for registering LSP Server specific capabilities.
14201422
custom-capabilities
14211423
;; Function which returns the folders that are considered to be not projects but library files.

lsp-semantic-tokens.el

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,23 @@ IS-RANGE-PROVIDER is non-nil when server supports range requests."
378378
(lsp-warn "No face has been associated to the %s '%s': consider adding a corresponding definition to %s"
379379
category id varname)) maybe-face)) identifiers)))
380380

381+
(defun lsp-semantic-tokens--replace-alist-values (a b)
382+
"Replace alist A values with B ones where available."
383+
(-map
384+
(-lambda ((ak . av))
385+
(cons ak (alist-get ak b av nil #'string=)))
386+
a))
387+
388+
(defun lsp-semantic-tokens--type-faces-for (client)
389+
"Return the semantic token type faces for CLIENT."
390+
(lsp-semantic-tokens--replace-alist-values lsp-semantic-token-faces
391+
(plist-get (lsp--client-semantic-tokens-faces-overrides client) :types)))
392+
393+
(defun lsp-semantic-tokens--modifier-faces-for (client)
394+
"Return the semantic token type faces for CLIENT."
395+
(lsp-semantic-tokens--replace-alist-values lsp-semantic-token-modifier-faces
396+
(plist-get (lsp--client-semantic-tokens-faces-overrides client) :modifiers)))
397+
381398
;;;###autoload
382399
(defun lsp--semantic-tokens-initialize-workspace (workspace)
383400
"Initialize semantic tokens for WORKSPACE."
@@ -389,15 +406,16 @@ IS-RANGE-PROVIDER is non-nil when server supports range requests."
389406
(lsp--registered-capability-options))
390407
(lsp:server-capabilities-semantic-tokens-provider?
391408
(lsp--workspace-server-capabilities workspace)))))
392-
(-let* (((&SemanticTokensOptions :legend) token-capabilities))
409+
(-let* (((&SemanticTokensOptions :legend) token-capabilities)
410+
(client (lsp--workspace-client workspace)))
393411
(setf (lsp--workspace-semantic-tokens-faces workspace)
394412
(lsp--semantic-tokens-build-face-map (lsp:semantic-tokens-legend-token-types legend)
395-
lsp-semantic-token-faces
413+
(lsp-semantic-tokens--type-faces-for client)
396414
"semantic token"
397415
"lsp-semantic-token-faces"))
398416
(setf (lsp--workspace-semantic-tokens-modifier-faces workspace)
399417
(lsp--semantic-tokens-build-face-map (lsp:semantic-tokens-legend-token-modifiers legend)
400-
lsp-semantic-token-modifier-faces
418+
(lsp-semantic-tokens--modifier-faces-for client)
401419
"semantic token modifier"
402420
"lsp-semantic-token-modifier-faces")))))
403421

0 commit comments

Comments
 (0)