224 lines
7.6 KiB
EmacsLisp
224 lines
7.6 KiB
EmacsLisp
;;; lsp-wat.el --- lsp-mode WAT integration -*- lexical-binding: t; -*-
|
|
|
|
;; Copyright (C) 2026 Pig Fang
|
|
;; Copyright (C) 2026 lsp-mode maintainers
|
|
|
|
;; Author: Pig Fang
|
|
;; Keywords: languages,tools
|
|
|
|
;; 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:
|
|
|
|
;; client for WebAssembly Text Format via wasm-language-tools
|
|
|
|
;;; Code:
|
|
|
|
(require 'lsp-mode)
|
|
|
|
(defgroup lsp-wat nil
|
|
"LSP support for WebAssembly Text Format."
|
|
:link '(url-link "https://github.com/g-plane/wasm-language-tools")
|
|
:group 'lsp-mode)
|
|
|
|
(defcustom lsp-wat-server-command '("wat_server")
|
|
"The wat_server command."
|
|
:group 'lsp-wat
|
|
:type 'string)
|
|
|
|
(defcustom lsp-wat-format-split-closing-parens nil
|
|
"Control whether closing parentheses should be splitted into different lines."
|
|
:group 'lsp-wat
|
|
:type 'boolean)
|
|
|
|
(defcustom lsp-wat-format-wrap-before-locals "always"
|
|
"Control whether to insert line break before function locals."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "never")
|
|
(const "overflow")
|
|
(const "multiOnly")
|
|
(const "always")))
|
|
|
|
(defcustom lsp-wat-format-wrap-before-fields "multiOnly"
|
|
"Control whether to insert line break before struct fields."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "never")
|
|
(const "overflow")
|
|
(const "multiOnly")
|
|
(const "always")))
|
|
|
|
(defcustom lsp-wat-format-wrap-before-const-expr "always"
|
|
"Control whether to insert line break before constant expression."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "never")
|
|
(const "overflow")
|
|
(const "multiOnly")
|
|
(const "always")))
|
|
|
|
(defcustom lsp-wat-format-multi-line-locals "smart"
|
|
"Control how to insert whitespace between multiple locals in a function."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "never")
|
|
(const "overflow")
|
|
(const "smart")
|
|
(const "wrap")
|
|
(const "always")))
|
|
|
|
(defcustom lsp-wat-format-multi-line-fields "smart"
|
|
"Control how to insert whitespace between multiple fields in a struct."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "never")
|
|
(const "overflow")
|
|
(const "smart")
|
|
(const "wrap")
|
|
(const "always")))
|
|
|
|
(defcustom lsp-wat-format-format-comments nil
|
|
"Control whether whitespace should be inserted at the beginning and end of comments."
|
|
:group 'lsp-wat
|
|
:type 'boolean)
|
|
|
|
(defcustom lsp-wat-format-ignore-comment-directive "fmt-ignore"
|
|
"Text directive for ignoring formatting specific module or module field."
|
|
:group 'lsp-wat
|
|
:type 'string)
|
|
|
|
(defcustom lsp-wat-lint-unused "warn"
|
|
"Lint for detecting unused items."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-unread "warn"
|
|
"Lint for detecting unread locals."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-shadow "warn"
|
|
"Lint for detecting shadowing."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-implicit-module "allow"
|
|
"Lint for top-level module fields without declaring a module."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-multi-modules "deny"
|
|
"Lint for detecting multiple modules in a single file."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-unreachable "hint"
|
|
"Lint for detecting unreachable code."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-deprecated "warn"
|
|
"Lint for deprecated usage."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-needless-mut "warn"
|
|
"Lint for detecting mutable globals that are never mutated."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-needless-try-table "warn"
|
|
"Lint for detecting `try_table` block without catch clauses."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-lint-useless-catch "warn"
|
|
"Lint for detecting useless catch clauses."
|
|
:group 'lsp-wat
|
|
:type '(choice (const "allow")
|
|
(const "hint")
|
|
(const "warn")
|
|
(const "deny")))
|
|
|
|
(defcustom lsp-wat-inlay-hint-types t
|
|
"Inlay hints for indicating types."
|
|
:group 'lsp-wat
|
|
:type 'boolean)
|
|
|
|
(defcustom lsp-wat-inlay-hint-ending t
|
|
"Inlay hints that show at the end of blocks and functions."
|
|
:group 'lsp-wat
|
|
:type 'boolean)
|
|
|
|
(defcustom lsp-wat-inlay-hint-index t
|
|
"Inlay hints for showing idx."
|
|
:group 'lsp-wat
|
|
:type 'boolean)
|
|
|
|
(lsp-register-custom-settings
|
|
'(("wasmLanguageTools.format.splitClosingParens" lsp-wat-format-split-closing-parens)
|
|
("wasmLanguageTools.format.wrapBeforeLocals" lsp-wat-format-wrap-before-locals)
|
|
("wasmLanguageTools.format.wrapBeforeFields" lsp-wat-format-wrap-before-fields)
|
|
("wasmLanguageTools.format.wrapBeforeConstExpr" lsp-wat-format-wrap-before-const-expr)
|
|
("wasmLanguageTools.format.multiLineLocals" lsp-wat-format-multi-line-locals)
|
|
("wasmLanguageTools.format.multiLineFields" lsp-wat-format-multi-line-fields)
|
|
("wasmLanguageTools.format.formatComments" lsp-wat-format-format-comments)
|
|
("wasmLanguageTools.format.ignoreCommentDirective" lsp-wat-format-ignore-comment-directive)
|
|
("wasmLanguageTools.lint.unused" lsp-wat-lint-unused)
|
|
("wasmLanguageTools.lint.unread" lsp-wat-lint-unread)
|
|
("wasmLanguageTools.lint.shadow" lsp-wat-lint-shadow)
|
|
("wasmLanguageTools.lint.implicitModule" lsp-wat-lint-implicit-module)
|
|
("wasmLanguageTools.lint.multiModules" lsp-wat-lint-multi-modules)
|
|
("wasmLanguageTools.lint.unreachable" lsp-wat-lint-unreachable)
|
|
("wasmLanguageTools.lint.deprecated" lsp-wat-lint-deprecated)
|
|
("wasmLanguageTools.lint.needlessMut" lsp-wat-lint-needless-mut)
|
|
("wasmLanguageTools.lint.needlessTryTable" lsp-wat-lint-needless-try-table)
|
|
("wasmLanguageTools.lint.uselessCatch" lsp-wat-lint-useless-catch)
|
|
("wasmLanguageTools.inlayHint.types" lsp-wat-inlay-hint-types)
|
|
("wasmLanguageTools.inlayHint.ending" lsp-wat-inlay-hint-ending)
|
|
("wasmLanguageTools.inlayHint.index" lsp-wat-inlay-hint-index)))
|
|
|
|
(lsp-register-client
|
|
(make-lsp-client
|
|
:new-connection (lsp-stdio-connection (lambda () lsp-wat-server-command))
|
|
:activation-fn (lsp-activate-on "wat")
|
|
:server-id 'wat_server))
|
|
|
|
(lsp-consistency-check lsp-wat)
|
|
|
|
(provide 'lsp-wat)
|
|
;;; lsp-wat.el ends here
|