From 4f987cb9841d1bd80d2c71c604103d78685b7acd Mon Sep 17 00:00:00 2001 From: Edmund Miller <20095261+edmundmiller@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:51:53 -0600 Subject: [PATCH] Add Nextflow Support (#4606) * feat: Copy lsp-groovy to lsp-nextflow * chore(nextflow): groovy => nextflow * chore(nextflow): Run lsp-generate-settings * fix(nextflow): Rework install logic * fix(nextflow): Update Nextflow language server installation logic * Add lsp-nextflow-test * chore: Try to start over with actionscript as a template * refactor: Use Nextflow lsp instead of vsix * fix: Add Nextflow-mode to lsp-clients and lsp-mode * fix: It's working? * fix: Reorder client creation and settings * feat: Add initialization function * chore: Bump lsp-mode version * fix: Enable multi-root Idk what this does, but it makes it work * chore: Add TODO * chore: Update formatting * chore: Update Changelog * style: Fix docstring wider than 80 characters * style(nextflow): Fix Summary line --- CHANGELOG.org | 1 + clients/lsp-nextflow.el | 139 ++++++++++++++++++++++++++++++++++++++++ docs/lsp-clients.json | 8 +++ lsp-mode.el | 3 +- mkdocs.yml | 1 + 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 clients/lsp-nextflow.el diff --git a/CHANGELOG.org b/CHANGELOG.org index 45cf126449..2682f60321 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -22,6 +22,7 @@ * Fix zls wrong bin path * Add support for buf CLI ([[https://github.com/bufbuild/buf/releases/tag/v1.43.0][beta]]) * Add fennel support + * Add support for [[https://github.com/nextflow-io/language-server][Nextflow]] ** 9.0.0 * Add language server config for QML (Qt Modeling Language) using qmlls. diff --git a/clients/lsp-nextflow.el b/clients/lsp-nextflow.el new file mode 100644 index 0000000000..917af21543 --- /dev/null +++ b/clients/lsp-nextflow.el @@ -0,0 +1,139 @@ +;;; lsp-nextflow.el --- lsp-mode nextflow integration -*- lexical-binding: t; -*- + +;; Copyright (C) 2024 Edmund Miller + +;; Author: Edmund Miller +;; Keywords: lsp, nextflow, groovy + +;; 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 . + +;;; Commentary: + +;; LSP Clients for the Nextflow Programming Language. + +;;; Code: + +(require 'lsp-mode) +(require 'f) + +(defgroup lsp-nextflow nil + "LSP support for nextflow, using nextflow-language-server." + :group 'lsp-mode + :link '(url-link "https://github.com/nextflow-io/language-server")) + +(defcustom lsp-nextflow-java-path "java" + "Path of the java executable." + :group 'lsp-nextflow + :type 'string) + +(defcustom lsp-nextflow-version "1.0.0" + "Version of Nextflow language server." + :type 'string + :group 'lsp-nextflow + :package-version '(lsp-mode . "9.0.0")) + +(defcustom lsp-nextflow-server-download-url + (format "https://github.com/nextflow-io/language-server/releases/download/v%s/language-server-all.jar" + lsp-nextflow-version) + "Automatic download url for lsp-nextflow." + :type 'string + :group 'lsp-nextflow + :package-version '(lsp-mode . "9.0.0")) + +(defcustom lsp-nextflow-server-file + (f-join lsp-server-install-dir "nextflow-language-server.jar") + "The path to the file in which `lsp-nextflow' will be stored." + :group 'lsp-nextflow + :risky t + :type 'file + :package-version '(lsp-mode . "9.0.0")) + +(defun lsp-nextflow-server-command () + "Startup command for Nextflow language server." + `("java" "-jar" ,(expand-file-name lsp-nextflow-server-file))) + +(lsp-dependency 'nextflow-lsp + '(:system lsp-nextflow-server-file) + `(:download :url lsp-nextflow-server-download-url + :store-path lsp-nextflow-server-file)) + +;; +;;; Settings + +;; (lsp-generate-settings "~/src/nf-core/vscode-language-nextflow/package.json" 'lsp-nextflow) + +(lsp-defcustom lsp-nextflow-debug nil + "Enable debug logging and debug information in hover hints." + :type 'boolean + :group 'lsp-nextflow + :package-version '(lsp-mode . "9.0.0") + :lsp-path "nextflow.debug") + +(lsp-defcustom lsp-nextflow-files-exclude [".git" ".nf-test" "work"] + "Configure glob patterns for excluding folders from being searched for +Nextflow scripts and configuration files." + :type 'lsp-string-vector + :group 'lsp-nextflow + :package-version '(lsp-mode . "9.0.0") + :lsp-path "nextflow.files.exclude") + +(lsp-defcustom lsp-nextflow-formatting-harshil-alignment nil + "Use the [Harshil Alignment™️](https://nf-co.re/docs/contributing/code_editors_and_styling/harshil_alignment) when formatting Nextflow scripts and config files. + +*Note: not all rules are supported yet*" + :type 'boolean + :group 'lsp-nextflow + :package-version '(lsp-mode . "9.0.0") + :lsp-path "nextflow.formatting.harshilAlignment") + +(lsp-defcustom lsp-nextflow-java-home nil + "Specifies the folder path to the JDK. Use this setting if the extension cannot +find Java automatically." + :type '(choice (const :tag "Auto" nil) + (directory :tag "Custom JDK path")) + :group 'lsp-nextflow + :package-version '(lsp-mode . "9.0.0") + :lsp-path "nextflow.java.home") + +(lsp-defcustom lsp-nextflow-suppress-future-warnings t + "Hide warnings for future changes, deprecations, and removals." + :type 'boolean + :group 'lsp-nextflow + :package-version '(lsp-mode . "9.0.0") + :lsp-path "nextflow.suppressFutureWarnings") + +;; +;;; Client + +(lsp-register-client + (make-lsp-client + ;; FIXME + ;; :download-server-fn (lambda (_client callback error-callback _update?) + ;; (lsp-package-ensure 'nextflow-lsp callback error-callback)) + :new-connection (lsp-stdio-connection #'lsp-nextflow-server-command) + :major-modes '(nextflow-mode) + :multi-root t + :activation-fn (lsp-activate-on "nextflow") + :priority -1 + :initialized-fn (lambda (workspace) + (with-lsp-workspace workspace + (lsp--set-configuration + (lsp-configuration-section "nextflow")))) + ;; TODO Handle preview dag + :server-id 'nextflow-lsp)) + +(lsp-consistency-check lsp-nextflow) + +(provide 'lsp-nextflow) +;;; lsp-nextflow.el ends here diff --git a/docs/lsp-clients.json b/docs/lsp-clients.json index b0b17a587d..0b6c2f7f48 100644 --- a/docs/lsp-clients.json +++ b/docs/lsp-clients.json @@ -677,6 +677,14 @@ "installation": "npm install -g @mdx-js/language-server", "debugger": "Not available" }, + { + "name": "nextflow", + "full-name": "Nextflow", + "server-name": "nextflow-language-server", + "server-url": "https://github.com/nextflow-io/language-server", + "installation-url": "https://github.com/nextflow-io/language-server#build", + "debugger": "Not available" + }, { "name": "nginx", "full-name": "Nginx", diff --git a/lsp-mode.el b/lsp-mode.el index f5c700dbf3..1dad7b75a0 100644 --- a/lsp-mode.el +++ b/lsp-mode.el @@ -182,7 +182,7 @@ As defined by the Language Server Protocol 3.16." lsp-graphql lsp-groovy lsp-hack lsp-haskell lsp-haxe lsp-idris lsp-java lsp-javascript lsp-jq lsp-json lsp-kotlin lsp-latex lsp-lisp lsp-ltex lsp-lua lsp-fennel lsp-magik lsp-markdown lsp-marksman lsp-mdx lsp-meson lsp-metals lsp-mint - lsp-mojo lsp-move lsp-mssql lsp-nginx lsp-nim lsp-nix lsp-nushell lsp-ocaml + lsp-mojo lsp-move lsp-mssql lsp-nextflow lsp-nginx lsp-nim lsp-nix lsp-nushell lsp-ocaml lsp-openscad lsp-pascal lsp-perl lsp-perlnavigator lsp-php lsp-pls lsp-purescript lsp-pwsh lsp-pyls lsp-pylsp lsp-pyright lsp-python-ms lsp-qml lsp-r lsp-racket lsp-remark lsp-rf lsp-roslyn lsp-rubocop lsp-ruby-lsp @@ -835,6 +835,7 @@ Changes take effect only when a new session is started." (java-ts-mode . "java") (jdee-mode . "java") (groovy-mode . "groovy") + (nextflow-mode . "nextflow") (python-mode . "python") (python-ts-mode . "python") (cython-mode . "python") diff --git a/mkdocs.yml b/mkdocs.yml index 2c7912e033..51df17aa94 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -118,6 +118,7 @@ nav: - Move: page/lsp-move.md - MDX: page/lsp-mdx.md - MSSQL: https://emacs-lsp.github.io/lsp-mssql + - Nextflow: page/lsp-nextflow.md - Nginx: page/lsp-nginx.md - Nim: page/lsp-nim.md - Nix (nixd-lsp): page/lsp-nix-nixd.md