From d08877b09270e245683c464f9a4b9243fef4f845 Mon Sep 17 00:00:00 2001 From: Alan Zimmerman Date: Sat, 9 Sep 2023 14:05:50 +0100 Subject: [PATCH] lsp-erlang: Add semantic token support for erlang-language-platform Supporting "bound" default :underline, bound variable in pattern "exported_function" default :underline "deprecated_function" default :strike-through --- CHANGELOG.org | 1 + clients/lsp-erlang.el | 63 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/CHANGELOG.org b/CHANGELOG.org index 185b0edffa5..7da510ee2cb 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -1,5 +1,6 @@ * Changelog ** Unreleased 8.0.1 + * Add semantic token support for [[https://github.com/WhatsApp/erlang-language-platform][erlang-language-platform]] in lsp-erlang client. * Add [[https://github.com/WhatsApp/erlang-language-platform][erlang-language-platform]] support in lsp-erlang client. * Add [[https://github.com/elixir-tools/credo-language-server][credo-language-server]] * Add support for clojure-ts-mode in clojure-lsp client diff --git a/clients/lsp-erlang.el b/clients/lsp-erlang.el index 4f96642de74..5bf551863db 100644 --- a/clients/lsp-erlang.el +++ b/clients/lsp-erlang.el @@ -25,6 +25,7 @@ ;;; Code: (require 'lsp-mode) +(require 'lsp-semantic-tokens) (defgroup lsp-erlang nil "LSP support for the Erlang programming language. @@ -41,6 +42,12 @@ It can use erlang-ls or erlang-language-platform (ELP)." :group 'lsp-mode :link '(url-link "https://github.com/WhatsApp/erlang-language-platform")) +(defgroup lsp-erlang-elp-semantic-tokens nil + "LSP semantic tokens support for ELP." + :group 'lsp-erlang-elp + :link '(url-link "https://github.com/WhatsApp/erlang-language-platform") + :package-version '(lsp-mode . "8.0.1")) + (defcustom lsp-erlang-server 'erlang-ls "Choose LSP server." :type '(choice (const :tag "erlang-ls" erlang-ls) @@ -119,6 +126,59 @@ It can use erlang-ls or erlang-language-platform (ELP)." :set-executable? t) '(:system "elp")) +;; Semantic tokens + +;; Modifier faces + +(defface lsp-erlang-elp-bound-modifier-face + '((t :underline t)) + "The face modification to use for bound variables in patterns." + :group 'lsp-erlang-elp-semantic-tokens) + +(defface lsp-erlang-elp-exported-function-modifier-face + '((t :underline t)) + "The face modification to use for exported functions." + :group 'lsp-erlang-elp-semantic-tokens) + +(defface lsp-erlang-elp-deprecated-function-modifier-face + '((t :strike-through t)) + "The face modification to use for deprecated functions." + :group 'lsp-erlang-elp-semantic-tokens) + + +;; --------------------------------------------------------------------- +;; Semantic token modifier face customization + +(defcustom lsp-erlang-elp-bound-modifier 'lsp-erlang-elp-bound-modifier-face + "Face for semantic token modifier for `bound' attribute." + :type 'face + :group 'lsp-erlang-elp-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-erlang-elp-exported-function-modifier 'lsp-erlang-elp-exported-function-modifier-face + "Face for semantic token modifier for `exported_function' attribute." + :type 'face + :group 'lsp-erlang-elp-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +(defcustom lsp-erlang-elp-deprecated-function-modifier 'lsp-erlang-elp-deprecated-function-modifier-face + "Face for semantic token modifier for `deprecated_function' attribute." + :type 'face + :group 'lsp-erlang-elp-semantic-tokens + :package-version '(lsp-mode . "8.0.1")) + +;; --------------------------------------------------------------------- + +(defun lsp-erlang-elp--semantic-modifiers () + "Mapping between rust-analyzer keywords and fonts to apply. +The keywords are sent in the initialize response, in the semantic +tokens legend." + `( + ("bound" . ,lsp-erlang-elp-bound-modifier) + ("exported_function" . ,lsp-erlang-elp-exported-function-modifier) + ("deprecated_function" . ,lsp-erlang-elp-deprecated-function-modifier))) + +;; --------------------------------------------------------------------- ;; Client (lsp-register-client @@ -132,6 +192,9 @@ It can use erlang-ls or erlang-language-platform (ELP)." ,@(cl-rest lsp-erlang-elp-server-command)))) :activation-fn (lsp-activate-on "erlang") :priority (if (eq lsp-erlang-server 'erlang-language-platform) 1 -2) + :semantic-tokens-faces-overrides `(:discard-default-modifiers t + :modifiers + ,(lsp-erlang-elp--semantic-modifiers)) :server-id 'elp :custom-capabilities `((experimental . ((snippetTextEdit . ,(and lsp-enable-snippet (featurep 'yasnippet)))))) :download-server-fn (lambda (_client callback error-callback _update?)