aboutsummaryrefslogtreecommitdiffstats
path: root/elpa/lsp-mode-20220505.630/lsp-elixir.el
diff options
context:
space:
mode:
Diffstat (limited to 'elpa/lsp-mode-20220505.630/lsp-elixir.el')
-rw-r--r--elpa/lsp-mode-20220505.630/lsp-elixir.el213
1 files changed, 213 insertions, 0 deletions
diff --git a/elpa/lsp-mode-20220505.630/lsp-elixir.el b/elpa/lsp-mode-20220505.630/lsp-elixir.el
new file mode 100644
index 0000000..a5fb7fc
--- /dev/null
+++ b/elpa/lsp-mode-20220505.630/lsp-elixir.el
@@ -0,0 +1,213 @@
+;;; lsp-elixir.el --- description -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2021 emacs-lsp maintainers
+
+;; Author: emacs-lsp maintainers
+;; Keywords: lsp, elixir
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; LSP Clients for the Elixir Programming Language.
+
+;;; Code:
+
+(require 'lsp-mode)
+(require 'ht)
+
+(defcustom lsp-elixir-dialyzer-enabled t
+ "Run ElixirLS's rapid Dialyzer when code is saved."
+ :type 'boolean
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-dialyzer-warn-opts '()
+ "Dialyzer options to enable or disable warnings.
+
+See Dialyzer's documentation for options. Note that the \"race_conditions\"
+option is unsupported"
+ :type '(repeat string)
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-dialyzer-format "dialyxir_long"
+ "Formatter to use for Dialyzer warnings."
+ :type 'string
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-mix-env "test"
+ "Mix environment to use for compilation."
+ :type 'string
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-mix-target nil
+ "Mix target to use for compilation (requires Elixir >= 1.8)."
+ :type 'string
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-project-dir nil
+ "Subdirectory containing Mix project if not in the project root.
+
+If value is `\"\"` then defaults to the workspace rootUri."
+ :type 'string
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-fetch-deps t
+ "Automatically fetch project dependencies when compiling."
+ :type 'boolean
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-suggest-specs t
+ "Suggest @spec annotations inline using Dialyzer's inferred success typings.
+This requires Dialyzer."
+ :type 'boolean
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-signature-after-complete t
+ "Show signature help after confirming autocomplete."
+ :type 'boolean
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defgroup lsp-elixir nil
+ "LSP support for Elixir, using elixir-ls."
+ :group 'lsp-mode
+ :link '(url-link "https://github.com/elixir-lsp/elixir-ls"))
+
+(define-obsolete-variable-alias 'lsp-clients-elixir-server-executable 'lsp-elixir-server-command "2021-04-05")
+
+(defcustom lsp-elixir-server-command
+ (if (equal system-type 'windows-nt)
+ '("language_server.bat")
+ '("language_server.sh"))
+ "Command to start elixir-ls.
+
+Leave as default to let `executable-find' search for it."
+ :group 'lsp-elixir
+ :type '(repeat string)
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-ls-version "v0.9.0"
+ "Elixir-Ls version to download.
+It has to be set before `lsp-elixir.el' is loaded and it has to
+be available here: https://github.com/elixir-lsp/elixir-ls/releases/"
+ :type 'string
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.1"))
+
+(defcustom lsp-elixir-ls-download-url
+ (format "https://github.com/elixir-lsp/elixir-ls/releases/download/%s/elixir-ls.zip"
+ lsp-elixir-ls-version)
+ "Automatic download url for elixir-ls"
+ :type 'string
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.1"))
+
+
+(defconst lsp-elixir-ls-server-dir
+ (f-join lsp-server-install-dir "elixir-ls")
+ "Elixir-ls local server Directory.")
+
+(defcustom lsp-elixir-local-server-command
+ (f-join lsp-elixir-ls-server-dir
+ (cl-first lsp-elixir-server-command))
+ "Command to start local elixir-ls binary."
+ :group 'lsp-elixir
+ :type '(repeat string)
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defcustom lsp-elixir-enable-test-lenses t
+ "Suggest Tests."
+ :type 'boolean
+ :group 'lsp-elixir
+ :package-version '(lsp-mode . "8.0.0"))
+
+(defun lsp-elixir--build-test-command (argument)
+ "Builds the test command from the ARGUMENT."
+ (let ((test-name (lsp-get argument :testName))
+ (module (lsp-get argument :module))
+ (describe (lsp-get argument :describe)))
+ (cond (module (concat "\"" "module:" module "\""))
+ ((not test-name) (concat "\"" "describe:" describe "\""))
+ (describe (concat "\"" "test:test " describe " " test-name "\"" ))
+ (t (concat "\"" "test:test " test-name "\"" )))))
+
+(lsp-defun lsp-elixir--run-test ((&Command :arguments?))
+ "Runs tests."
+ (let* ((argument (lsp-seq-first arguments?))
+ (file-path (lsp-get argument :filePath))
+ (test-command (lsp-elixir--build-test-command argument)))
+ (compile
+ (concat "cd " (lsp-workspace-root file-path) " && "
+ "mix test --exclude test --include " test-command " " file-path
+ " --no-color"))
+ file-path))
+
+(lsp-dependency
+ 'elixir-ls
+ `(:download :url lsp-elixir-ls-download-url
+ :decompress :zip
+ :store-path ,(f-join lsp-server-install-dir "elixir-ls" "elixir-ls.zip")
+ :binary-path lsp-elixir-server-command
+ :set-executable? t))
+
+(lsp-register-custom-settings
+ '(("elixirLS.dialyzerEnabled" lsp-elixir-dialyzer-enabled t)
+ ("elixirLS.dialyzerWarnOpts" lsp-elixir-dialyzer-warn-opts)
+ ("elixirLS.dialyzerFormat" lsp-elixir-dialyzer-format)
+ ("elixirLS.mixEnv" lsp-elixir-mix-env)
+ ("elixirLS.mixTarget" lsp-elixir-mix-target)
+ ("elixirLS.projectDir" lsp-elixir-project-dir)
+ ("elixirLS.fetchDeps" lsp-elixir-fetch-deps t)
+ ("elixirLS.suggestSpecs" lsp-elixir-suggest-specs t)
+ ("elixirLS.signatureAfterComplete" lsp-elixir-signature-after-complete t)
+ ("elixirLS.enableTestLenses" lsp-elixir-enable-test-lenses t)))
+
+(lsp-register-client
+ (make-lsp-client :new-connection (lsp-stdio-connection
+ (lambda ()
+ `(,(or (when (f-exists? lsp-elixir-local-server-command)
+ lsp-elixir-local-server-command)
+ (or (executable-find
+ (cl-first lsp-elixir-server-command))
+ (lsp-package-path 'elixir-ls))
+ "language_server.bat")
+ ,@(cl-rest lsp-elixir-server-command))))
+ :major-modes '(elixir-mode)
+ :priority -1
+ :server-id 'elixir-ls
+ :action-handlers (ht ("elixir.lens.test.run" 'lsp-elixir--run-test))
+ :download-server-fn (lambda (_client callback error-callback _update?)
+ (lsp-package-ensure 'elixir-ls callback error-callback))
+ :initialized-fn (lambda (workspace)
+ (with-lsp-workspace workspace
+ (lsp--set-configuration
+ (lsp-configuration-section "elixirLS")))
+ (puthash
+ "textDocumentSync"
+ (ht ("save" t)
+ ("change" 2))
+ (lsp--workspace-server-capabilities workspace)))))
+
+(lsp-consistency-check lsp-elixir)
+
+(provide 'lsp-elixir)
+;;; lsp-elixir.el ends here