diff options
Diffstat (limited to 'lua')
10 files changed, 112 insertions, 2 deletions
diff --git a/lua/nvim-lsp-installer/_generated/filetype_map.lua b/lua/nvim-lsp-installer/_generated/filetype_map.lua index 43a83076..4de77a36 100644 --- a/lua/nvim-lsp-installer/_generated/filetype_map.lua +++ b/lua/nvim-lsp-installer/_generated/filetype_map.lua @@ -77,7 +77,7 @@ return { ocaml = { "ocamlls" }, opencl = { "opencl_ls" }, org = { "ltex" }, - php = { "intelephense", "phpactor", "tailwindcss" }, + php = { "intelephense", "phpactor", "psalm", "tailwindcss" }, plaintex = { "ltex" }, postcss = { "tailwindcss" }, prisma = { "prismals" }, diff --git a/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua b/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua index 9a234af9..995ab5f3 100644 --- a/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua +++ b/lua/nvim-lsp-installer/_generated/language_autocomplete_map.lua @@ -22,7 +22,7 @@ return { nix = { "rnix" }, ["objective-c"] = { "ccls" }, openapi = { "spectral" }, - php = { "intelephense", "phpactor" }, + php = { "intelephense", "phpactor", "psalm" }, python = { "jedi_language_server", "pylsp", "pyright" }, ruby = { "solargraph", "sorbet" }, solidity = { "solang", "solc", "solidity_ls" }, diff --git a/lua/nvim-lsp-installer/_generated/metadata.lua b/lua/nvim-lsp-installer/_generated/metadata.lua index 13dba9c5..ec70cd9e 100644 --- a/lua/nvim-lsp-installer/_generated/metadata.lua +++ b/lua/nvim-lsp-installer/_generated/metadata.lua @@ -154,6 +154,9 @@ return { prismals = { filetypes = { "prisma" } }, + psalm = { + filetypes = { "php" } + }, puppet = { filetypes = { "puppet" } }, diff --git a/lua/nvim-lsp-installer/_generated/schemas/psalm.lua b/lua/nvim-lsp-installer/_generated/schemas/psalm.lua new file mode 100644 index 00000000..5ceb23e8 --- /dev/null +++ b/lua/nvim-lsp-installer/_generated/schemas/psalm.lua @@ -0,0 +1,3 @@ +-- THIS FILE IS GENERATED. DO NOT EDIT MANUALLY. +-- stylua: ignore start +return {properties = {["psalm.analyzedFileExtensions"] = {default = { {language = "php",scheme = "file"}, {language = "php",scheme = "untitled"} },description = "A list of file extensions to request Psalm to analyze. By default, this only includes 'php' (Modifying requires VSCode reload)",type = "array"},["psalm.configPaths"] = {default = { "psalm.xml", "psalm.xml.dist" },description = "A list of files to checkup for psalm configuration (relative to the workspace directory)",items = {type = "string"},type = "array"},["psalm.connectToServerWithTcp"] = {default = false,description = "If this is set to true, this VSCode extension will use TCP instead of the default STDIO to communicate with the Psalm language server. (Modifying requires VSCode reload)",type = "boolean"},["psalm.disableAutoComplete"] = {default = false,description = "Enable to disable autocomplete on methods and properties (Modifying requires VSCode reload)",type = "boolean"},["psalm.enableDebugLog"] = {default = false,deprecationMessage = "Deprecated: Please use psalm.enableVerbose, psalm.logLevel or psalm.trace.server instead.",description = "Enable this to print messages to the debug console when developing or debugging this VS Code extension. (Modifying requires VSCode reload)",type = "boolean"},["psalm.enableUseIniDefaults"] = {default = false,description = "Enable this to use PHP-provided ini defaults for memory and error display. (Modifying requires restart)",type = "boolean"},["psalm.enableVerbose"] = {default = false,description = "Enable --verbose mode on the Psalm Language Server (Modifying requires VSCode reload)",type = "boolean"},["psalm.hideStatusMessageWhenRunning"] = {default = true,description = "This will hide the Psalm status from the status bar when it is started and running. This is useful to clear up a cluttered status bar.",type = "boolean"},["psalm.logLevel"] = {default = "INFO",description = "Traces the communication between VSCode and the Psalm language server.",enum = { "NONE", "ERROR", "WARN", "INFO", "DEBUG", "TRACE" },scope = "window",type = "string"},["psalm.maxRestartCount"] = {default = 5,description = "The number of times the Language Server is allowed to crash and restart before it will no longer try to restart (Modifying requires VSCode reload)",type = "number"},["psalm.phpExecutableArgs"] = {default = { "-dxdebug.remote_autostart=0", "-dxdebug.remote_enable=0", "-dxdebug_profiler_enable=0" },description = "Optional (Advanced), default is '-dxdebug.remote_autostart=0 -dxdebug.remote_enable=0 -dxdebug_profiler_enable=0'. Additional PHP executable CLI arguments to use. (Modifying requires VSCode reload)",items = {type = "string"},type = "array"},["psalm.phpExecutablePath"] = {default = vim.NIL,description = 'Optional, defaults to searching for "php". The path to a PHP 7.0+ executable to use to execute the Psalm server. The PHP 7.0+ installation should preferably include and enable the PHP module `pcntl`. (Modifying requires VSCode reload)',type = "string"},["psalm.psalmClientScriptPath"] = {default = vim.NIL,deprecationMessage = "Deprecated: Please use psalm.psalmScriptPath instead.",description = "Optional (Advanced). If provided, this overrides the Psalm script to use, e.g. vendor/bin/psalm. (Modifying requires VSCode reload)",markdownDeprecationMessage = "**Deprecated**: Please use `#psalm.psalmScriptPath#` instead.",type = "string"},["psalm.psalmScriptArgs"] = {default = {},description = "Optional (Advanced). Additional arguments to the Psalm language server. (Modifying requires VSCode reload)",items = {type = "string"},type = "array"},["psalm.psalmScriptPath"] = {default = vim.NIL,description = "Optional (Advanced). If provided, this overrides the Psalm script to use, e.g. vendor/bin/psalm-language-server. (Modifying requires VSCode reload)",type = "string"},["psalm.trace.server"] = {default = "off",description = "Traces the communication between VSCode and the Psalm language server.",enum = { "off", "messages", "verbose" },scope = "window",type = "string"},["psalm.unusedVariableDetection"] = {default = false,description = "Enable this to enable unused variable and parameter detection",type = "boolean"}},title = "PHP - Psalm Analyzer",type = "object"}
\ No newline at end of file diff --git a/lua/nvim-lsp-installer/core/receipt.lua b/lua/nvim-lsp-installer/core/receipt.lua index c29ebde7..d430d9dc 100644 --- a/lua/nvim-lsp-installer/core/receipt.lua +++ b/lua/nvim-lsp-installer/core/receipt.lua @@ -117,6 +117,7 @@ InstallReceiptBuilder.gem = package_source "gem" InstallReceiptBuilder.go = package_source "go" InstallReceiptBuilder.dotnet = package_source "dotnet" InstallReceiptBuilder.cargo = package_source "cargo" +InstallReceiptBuilder.composer = package_source "composer" InstallReceiptBuilder.unmanaged = { type = "unmanaged" } diff --git a/lua/nvim-lsp-installer/installers/composer.lua b/lua/nvim-lsp-installer/installers/composer.lua index 1e8a1717..26e4e7be 100644 --- a/lua/nvim-lsp-installer/installers/composer.lua +++ b/lua/nvim-lsp-installer/installers/composer.lua @@ -2,6 +2,11 @@ local installers = require "nvim-lsp-installer.installers" local std = require "nvim-lsp-installer.installers.std" local platform = require "nvim-lsp-installer.platform" local process = require "nvim-lsp-installer.process" +local fs = require "nvim-lsp-installer.fs" +local path = require "nvim-lsp-installer.path" +local Data = require "nvim-lsp-installer.data" + +local list_copy = Data.list_copy local M = {} @@ -18,6 +23,37 @@ local function ensure_composer(installer) } end +---@param packages string[] The composer packages to install. The first item in this list will be the recipient of the server version, should the user request a specific one. +function M.require(packages) + return ensure_composer( + ---@type ServerInstallerFunction + function(_, callback, ctx) + local pkgs = list_copy(packages) + local c = process.chain { + cwd = ctx.install_dir, + stdio_sink = ctx.stdio_sink, + } + + ctx.receipt:with_primary_source(ctx.receipt.composer(pkgs[1])) + for i = 2, #pkgs do + ctx.receipt:with_secondary_source(ctx.receipt.composer(pkgs[i])) + end + + if not (fs.file_exists(path.concat { ctx.install_dir, "composer.json" })) then + c.run(M.composer_cmd, { "init", "--no-interaction", "--stability=stable" }) + end + + if ctx.requested_server_version then + -- The "head" package is the recipient for the requested version. It's.. by design... don't ask. + pkgs[1] = ("%s:%s"):format(pkgs[1], ctx.requested_server_version) + end + + c.run(M.composer_cmd, vim.list_extend({ "require" }, pkgs)) + c.spawn(callback) + end + ) +end + function M.install() return ensure_composer( ---@type ServerInstallerFunction @@ -37,4 +73,11 @@ function M.install() ) end +---@param root_dir string The directory to resolve the executable from. +function M.env(root_dir) + return { + PATH = process.extend_path { path.concat { root_dir, "vendor", "bin" } }, + } +end + return M diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/composer.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/composer.lua new file mode 100644 index 00000000..b8e75424 --- /dev/null +++ b/lua/nvim-lsp-installer/jobs/outdated-servers/composer.lua @@ -0,0 +1,42 @@ +local process = require "nvim-lsp-installer.process" +local composer = require "nvim-lsp-installer.installers.composer" +local VersionCheckResult = require "nvim-lsp-installer.jobs.outdated-servers.version-check-result" + +---@param server Server +---@param source InstallReceiptSource +---@param on_check_complete fun(result: VersionCheckResult) +local function composer_checker(server, source, on_check_complete) + local stdio = process.in_memory_sink() + process.spawn(composer.composer_cmd, { + args = { "outdated", "--no-interaction", "--format=json" }, + cwd = server.root_dir, + stdio_sink = stdio.sink, + }, function(success) + if not success then + return on_check_complete(VersionCheckResult.fail(server)) + end + ---@type {installed: {name: string, version: string, latest: string}[]} + local decode_ok, outdated_json = pcall(vim.json.decode, table.concat(stdio.buffers.stdout, "")) + + if not decode_ok then + return on_check_complete(VersionCheckResult.fail(server)) + end + + ---@type OutdatedPackage[] + local outdated_packages = {} + + for _, outdated_package in ipairs(outdated_json.installed) do + if outdated_package.name == source.package and outdated_package.version ~= outdated_package.latest then + table.insert(outdated_packages, { + name = outdated_package.name, + current_version = outdated_package.version, + latest_version = outdated_package.latest, + }) + end + end + + on_check_complete(VersionCheckResult.success(server, outdated_packages)) + end) +end + +return composer_checker diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua index c2c45178..8e4548f7 100644 --- a/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua +++ b/lua/nvim-lsp-installer/jobs/outdated-servers/init.lua @@ -10,6 +10,7 @@ local git_check = require "nvim-lsp-installer.jobs.outdated-servers.git" local github_release_file_check = require "nvim-lsp-installer.jobs.outdated-servers.github_release_file" local github_tag_check = require "nvim-lsp-installer.jobs.outdated-servers.github_tag" local jdtls = require "nvim-lsp-installer.jobs.outdated-servers.jdtls" +local composer_check = require "nvim-lsp-installer.jobs.outdated-servers.composer" local M = {} @@ -26,6 +27,7 @@ local checkers = { ["pip3"] = pip3_check, ["cargo"] = cargo_check, ["gem"] = gem_check, + ["composer"] = composer_check, ["go"] = noop, -- TODO ["dotnet"] = noop, -- TODO ["unmanaged"] = noop, diff --git a/lua/nvim-lsp-installer/servers/init.lua b/lua/nvim-lsp-installer/servers/init.lua index 3a91adfb..114e6635 100644 --- a/lua/nvim-lsp-installer/servers/init.lua +++ b/lua/nvim-lsp-installer/servers/init.lua @@ -82,6 +82,7 @@ local CORE_SERVERS = Data.set_of { "phpactor", "powershell_es", "prismals", + "psalm", "puppet", "purescriptls", "pylsp", diff --git a/lua/nvim-lsp-installer/servers/psalm/init.lua b/lua/nvim-lsp-installer/servers/psalm/init.lua new file mode 100644 index 00000000..3b3d4721 --- /dev/null +++ b/lua/nvim-lsp-installer/servers/psalm/init.lua @@ -0,0 +1,15 @@ +local server = require "nvim-lsp-installer.server" +local composer = require "nvim-lsp-installer.installers.composer" + +return function(name, root_dir) + return server.Server:new { + name = name, + root_dir = root_dir, + homepage = "https://psalm.dev/", + languages = { "php" }, + installer = composer.require { "vimeo/psalm" }, + default_options = { + cmd_env = composer.env(root_dir), + }, + } +end |
