config

Personal configuration.
git clone git://code.dwrz.net/config
Log | Files | Refs

lsp-typespec.el (3062B)


      1 ;;; lsp-typespec.el --- Typespec Client settings -*- lexical-binding: t; -*-
      2 
      3 ;; Copyright (C) 2024  jeremy.ymeng@gmail.com
      4 
      5 ;; Author: Jeremy Meng  <jeremy.ymeng@gmail.com>
      6 ;; Keywords: languages,tools
      7 
      8 ;; This program is free software; you can redistribute it and/or modify
      9 ;; it under the terms of the GNU General Public License as published by
     10 ;; the Free Software Foundation, either version 3 of the License, or
     11 ;; (at your option) any later version.
     12 
     13 ;; This program is distributed in the hope that it will be useful,
     14 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 ;; GNU General Public License for more details.
     17 
     18 ;; You should have received a copy of the GNU General Public License
     19 ;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
     20 
     21 ;;; Commentary:
     22 
     23 ;; lsp-typespec client
     24 
     25 ;;; Code:
     26 
     27 (require 'lsp-mode)
     28 (require 'lsp-semantic-tokens)
     29 
     30 (defgroup lsp-typespec nil
     31   "LSP support for Typespec."
     32   :link '(url-link "https://github.com/microsoft/typespec/blob/9c95ccda8c84c7c6afa24b2f4b21cf1ecbe680dd/packages/compiler/cmd/tsp-server.js")
     33   :group 'lsp-mode
     34   :tag "Lsp Typespec")
     35 
     36 (defcustom lsp-typespec-custom-server-command nil
     37   "The typespec-lisp server command."
     38   :group 'lsp-typespec
     39   :risky t
     40   :type '(repeat string))
     41 
     42 (lsp-dependency
     43  'typespec-lsp
     44  '(:npm :package "@typespec/compiler"
     45         :path "tsp-server")
     46  '(:system "tsp-server"))
     47 
     48 (defun lsp-typespec--server-executable-path ()
     49   "Return the typespec-lsp server command."
     50   (or
     51    (when-let* ((workspace-folder (lsp-find-session-folder (lsp-session) default-directory)))
     52      (let ((tsp-server-local-path (f-join workspace-folder "node_modules" ".bin"
     53                                       (if (eq system-type 'windows-nt) "tsp-server.cmd" "tsp-server"))))
     54        (when (f-exists? tsp-server-local-path)
     55          tsp-server-local-path)))
     56    (executable-find "tsp-server")
     57    (lsp-package-path 'tsp-server)
     58    "tsp-server"))
     59 
     60 (lsp-register-client
     61  (make-lsp-client
     62   :semantic-tokens-faces-overrides '(:types (("docCommentTag" . font-lock-keyword-face)
     63                                              ("event" . default)))
     64   :new-connection (lsp-stdio-connection `(,(lsp-typespec--server-executable-path) "--stdio"))
     65   :activation-fn (lsp-activate-on "typespec")
     66   :major-modes '(typespec-mode)
     67   :server-id 'typespec-lsp))
     68 
     69 (lsp-consistency-check lsp-typespec)
     70 
     71 (defun lsp-typespec-semantic-tokens-refresh (&rest _)
     72   "Force refresh semantic tokens."
     73   (when-let* ((workspace (and lsp-semantic-tokens-enable
     74                              (lsp-find-workspace 'typespec-lsp (buffer-file-name)))))
     75     (--each (lsp--workspace-buffers workspace)
     76       (when (lsp-buffer-live-p it)
     77         (lsp-with-current-buffer it
     78           (lsp-semantic-tokens--enable))))))
     79 
     80 (with-eval-after-load 'typespec
     81   (when lsp-semantic-tokens-enable
     82     ;; refresh tokens
     83     (add-hook 'typespec-mode-hook #'lsp-typespec-semantic-tokens-refresh)))
     84 
     85 (provide 'lsp-typespec)
     86 ;;; lsp-typespec.el ends here
     87