config

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

lsp-golangci-lint.el (6511B)


      1 ;;; lsp-golangci-lint.el --- golangci-lint-langserver Client settings -*- lexical-binding: t; -*-
      2 
      3 ;; Copyright (C) 2023  Jim Myhrberg
      4 
      5 ;; Author: Jim Myhrberg
      6 ;; Keywords: lsp, go, golang, golangci-lint
      7 
      8 ;; This file is not part of GNU Emacs
      9 
     10 ;;; License:
     11 ;;
     12 ;; This program is free software: you can redistribute it and/or modify
     13 ;; it under the terms of the GNU General Public License as published by
     14 ;; the Free Software Foundation, either version 3 of the License, or
     15 ;; (at your option) any later version.
     16 ;;
     17 ;; This program is distributed in the hope that it will be useful,
     18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     20 ;; GNU General Public License for more details.
     21 ;;
     22 ;; You should have received a copy of the GNU General Public License
     23 ;; along with this program.  If not, see <https://www.gnu.org/licenses/>.
     24 
     25 ;;; Commentary:
     26 ;;
     27 ;; lsp-golangci-lint client
     28 
     29 ;;; Code:
     30 
     31 (require 'lsp-mode)
     32 (require 'lsp-go)
     33 (require 'cl-lib)
     34 
     35 (defgroup lsp-golangci-lint nil
     36   "Configuration options for lsp-golangci-lint."
     37   :group 'lsp-mode
     38   :link '(url-link "https://github.com/nametake/golangci-lint-langserver")
     39   :package-version '(lsp-mode . "9.0.0"))
     40 
     41 (defcustom lsp-golangci-lint-server-path "golangci-lint-langserver"
     42   "Command to run golangci-lint-langserver."
     43   :type 'string
     44   :package-version '(lsp-mode . "9.0.0"))
     45 
     46 (defcustom lsp-golangci-lint-server-debug nil
     47   "Whether to run golangci-lint-langserver in debug mode or not."
     48   :type 'boolean
     49   :package-version '(lsp-mode . "9.0.0"))
     50 
     51 (defcustom lsp-golangci-lint-server-args nil
     52   "Arguments to pass to golangci-lint-langserver."
     53   :type '(repeat string)
     54   :package-version '(lsp-mode . "9.0.0"))
     55 
     56 (defcustom lsp-golangci-lint-path "golangci-lint"
     57   "Command to run golangci-lint."
     58   :type 'string
     59   :package-version '(lsp-mode . "9.0.0"))
     60 
     61 (defcustom lsp-golangci-lint-allow-parallel-runners t
     62   "If not nil, pass --allow-parallel-runners flag to golangci-lint run."
     63   :type 'boolean
     64   :package-version '(lsp-mode . "9.0.0"))
     65 
     66 (defcustom lsp-golangci-lint-build-tags nil
     67   "If non-empty list, pass as --build-tags flag value to golangci-lint run."
     68   :type '(repeat string)
     69   :package-version '(lsp-mode . "9.0.0"))
     70 
     71 (defcustom lsp-golangci-lint-fast nil
     72   "If not nil, pass --fast flag to golangci-lint run."
     73   :type 'boolean
     74   :package-version '(lsp-mode . "9.0.0"))
     75 
     76 (defcustom lsp-golangci-lint-enable-all nil
     77   "If not nil, pass --enable-all flag to golangci-lint run."
     78   :type 'boolean
     79   :package-version '(lsp-mode . "9.0.0"))
     80 
     81 (defcustom lsp-golangci-lint-enable nil
     82   "If non-empty list, pass as --enable flag value to golangci-lint run."
     83   :type '(repeat string)
     84   :package-version '(lsp-mode . "9.0.0"))
     85 
     86 (defcustom lsp-golangci-lint-disable-all nil
     87   "If not nil, pass --disable-all to golangci-lint run."
     88   :type 'boolean
     89   :package-version '(lsp-mode . "9.0.0"))
     90 
     91 (defcustom lsp-golangci-lint-disable nil
     92   "If non-empty list, pass as --disable flag value to golangci-lint run."
     93   :type '(repeat string)
     94   :package-version '(lsp-mode . "9.0.0"))
     95 
     96 (defcustom lsp-golangci-lint-config nil
     97   "If set, pass value as --config flag to golangci-lint run."
     98   :type 'string
     99   :package-version '(lsp-mode . "9.0.0"))
    100 
    101 (defcustom lsp-golangci-lint-no-config nil
    102   "If not nil, pass --no-config flag to golangci-lint run."
    103   :type 'boolean
    104   :package-version '(lsp-mode . "9.0.0"))
    105 
    106 (defcustom lsp-golangci-lint-run-args nil
    107   "Arguments to pass to golangci-lint run command."
    108   :type '(repeat string)
    109   :package-version '(lsp-mode . "9.0.0"))
    110 
    111 (defun lsp-golangci-lint-server--stdio-command ()
    112   "Return the command and args to start golangci-lint-langserver."
    113   (let ((args (list lsp-golangci-lint-server-path)))
    114     (when (and (listp lsp-golangci-lint-server-args)
    115                (> (length lsp-golangci-lint-server-args) 0))
    116       (setq args (append args lsp-golangci-lint-server-args)))
    117     (when lsp-golangci-lint-server-debug
    118       (setq args (append args '("-debug"))))
    119     args))
    120 
    121 (defun lsp-golangci-lint--run-args ()
    122   "Return the arguments to pass to golangci-lint run command."
    123   (let* ((tags (string-join lsp-golangci-lint-build-tags " "))
    124          (enable (string-join lsp-golangci-lint-enable ","))
    125          (disable (string-join lsp-golangci-lint-disable ","))
    126          (args (cl-loop for (condition flag value) in
    127                         `((,lsp-golangci-lint-fast "--fast" nil)
    128                           (,(not (string-empty-p tags)) "--build-tags" ,tags)
    129                           (,lsp-golangci-lint-enable-all "--enable-all" nil)
    130                           (,lsp-golangci-lint-disable-all "--disable-all" nil)
    131                           (,(not (string-empty-p enable)) "--enable" ,enable)
    132                           (,(not (string-empty-p disable)) "--disable" ,disable)
    133                           (,lsp-golangci-lint-allow-parallel-runners
    134                            "--allow-parallel-runners" nil)
    135                           (,(and (stringp lsp-golangci-lint-config)
    136                                  (not (string-empty-p lsp-golangci-lint-config)))
    137                            "--config" lsp-golangci-lint-config))
    138                         when condition
    139                         append (if value (list flag value) (list flag)))))
    140     (when (and (listp lsp-golangci-lint-run-args)
    141                (> (length lsp-golangci-lint-run-args) 0))
    142       (setq args (append args lsp-golangci-lint-run-args)))
    143     args))
    144 
    145 (defun lsp-golangci-lint--get-initialization-options ()
    146   "Return initialization options for golangci-lint-langserver."
    147   (let ((opts (make-hash-table :test 'equal))
    148         (command (vconcat `(,lsp-golangci-lint-path)
    149                           ["run" "--out-format=json" "--issues-exit-code=1"]
    150                           (lsp-golangci-lint--run-args))))
    151     (puthash "command" command opts)
    152     opts))
    153 
    154 (lsp-register-client
    155  (make-lsp-client :new-connection (lsp-stdio-connection
    156                                    #'lsp-golangci-lint-server--stdio-command)
    157                   :activation-fn (lsp-activate-on "go")
    158                   :language-id "go"
    159                   :priority 0
    160                   :server-id 'golangci-lint
    161                   :add-on? t
    162                   :library-folders-fn #'lsp-go--library-default-directories
    163                   :initialization-options #'lsp-golangci-lint--get-initialization-options))
    164 
    165 (lsp-consistency-check lsp-golangci-lint)
    166 
    167 (provide 'lsp-golangci-lint)
    168 ;;; lsp-golangci-lint.el ends here