Skip to content

Commit

Permalink
lsp-erlang: Add semantic token support for erlang-language-platform (#…
Browse files Browse the repository at this point in the history
…4166)

Supporting
"bound"               default :underline, bound variable in pattern
"exported_function"   default :underline
"deprecated_function" default :strike-through
  • Loading branch information
alanz authored Sep 11, 2023
1 parent e31cacc commit 266945b
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.org
Original file line number Diff line number Diff line change
@@ -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.
* Update [[https://github.com/WhatsApp/erlang-language-platform][erlang-language-platform]] download file names to match new upstream names.
* 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]]
Expand Down
63 changes: 63 additions & 0 deletions clients/lsp-erlang.el
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
;;; Code:

(require 'lsp-mode)
(require 'lsp-semantic-tokens)

(defgroup lsp-erlang nil
"LSP support for the Erlang programming language.
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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?)
Expand Down

0 comments on commit 266945b

Please sign in to comment.