From a273990819ecfce9dea560068ac1e7174f6664c6 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 30 May 2024 09:58:28 +0200 Subject: [PATCH] Lua: Fix LSP Plugins Change-Id: I8d79d6c56ef4f0e54866a84f0e4535c7f507e963 Reviewed-by: David Schulz --- src/plugins/luals/luals/init.lua | 67 +++++++++++++++++++----------- src/plugins/rustls/rustls/init.lua | 46 +++++++++++++++----- 2 files changed, 77 insertions(+), 36 deletions(-) diff --git a/src/plugins/luals/luals/init.lua b/src/plugins/luals/luals/init.lua index 04c238197ad..de7883dd023 100644 --- a/src/plugins/luals/luals/init.lua +++ b/src/plugins/luals/luals/init.lua @@ -7,6 +7,7 @@ local S = require('Settings') local Gui = require('Gui') local a = require('async') local fetch = require('Fetch').fetch +local Install = require('Install') Settings = {} @@ -44,7 +45,6 @@ local function installOrUpdateServer() if type(data) == "table" and #data > 0 then local r = data[1] - Install = require('Install') local lspPkgInfo = Install.packageInfo("lua-language-server") if not lspPkgInfo or lspPkgInfo.version ~= r.tag_name then local osTr = { mac = "darwin", windows = "win32", linux = "linux" } @@ -83,7 +83,7 @@ local function installOrUpdateServer() binary = "bin/lua-language-server.exe" end - Settings.binary.defaultPath = lspPkgInfo.path:resolvePath(binary) + Settings.binary:setValue(lspPkgInfo.path:resolvePath(binary)) Settings:apply() return end @@ -138,31 +138,53 @@ local function layoutSettings() --- "using namespace Gui" local _ENV = using(Gui) - local installButton = {} - - if Settings.binary.expandedValue:isExecutableFile() == false then - installButton = { - "Language server not found:", - Row { - PushButton { - text = "Try to install lua language server", - onClicked = function() a.sync(installServer)() end, - }, - st - } - } - end local layout = Form { Settings.binary, br, Settings.developMode, br, Settings.showSource, br, Settings.showNode, br, - table.unpack(installButton) + Row { + PushButton { + text = "Update Lua Language Server", + onClicked = function() a.sync(installOrUpdateServer)() end, + }, + st + } } - return layout end +local function binaryFromPkg() + local lspPkgInfo = Install.packageInfo("lua-language-server") + if lspPkgInfo then + local binary = "bin/lua-language-server" + if Utils.HostOsInfo.isWindowsHost() then + binary = "bin/lua-language-server.exe" + end + local binaryPath = lspPkgInfo.path:resolvePath(binary) + if binaryPath:isExecutableFile() == true then + return binaryPath + end + end + + return nil +end + +local function findBinary() + local binary = binaryFromPkg() + if binary then + return binary + end + + -- Search for the binary in the PATH + local serverPath = Utils.FilePath.fromUserInput("lua-language-server") + local absolute = a.wait(serverPath:searchInPath()):resolveSymlinks() + if absolute:isExecutableFile() == true then + return absolute + end + return serverPath +end + local function setupAspect() ---@class Settings: AspectContainer Settings = S.AspectContainer.create({ @@ -176,14 +198,9 @@ local function setupAspect() labelText = "Binary:", toolTip = "The path to the lua-language-server binary.", expectedKind = S.Kind.ExistingCommand, - defaultPath = Utils.FilePath.fromUserInput("lua-language-server"), + defaultPath = findBinary(), }) - -- Search for the binary in the PATH - local serverPath = Settings.binary.defaultPath - local absolute = a.wait(serverPath:searchInPath()):resolveSymlinks() - if absolute:isExecutableFile() == true then - Settings.binary.defaultPath = absolute - end + Settings.developMode = S.BoolAspect.create({ settingsKey = "LuaCopilot.DevelopMode", displayName = "Enable Develop Mode", diff --git a/src/plugins/rustls/rustls/init.lua b/src/plugins/rustls/rustls/init.lua index c83d71ae5ff..474c368f3a9 100644 --- a/src/plugins/rustls/rustls/init.lua +++ b/src/plugins/rustls/rustls/init.lua @@ -8,6 +8,7 @@ local S = require('Settings') local Gui = require('Gui') local a = require('async') local fetch = require('Fetch').fetch +local Install = require('Install') Settings = {} @@ -39,7 +40,6 @@ local function installOrUpdateServer() if r.prerelease then r = data[2] end - Install = require('Install') local lspPkgInfo = Install.packageInfo("rust-analyzer") if not lspPkgInfo or lspPkgInfo.version ~= r.tag_name then local osTr = { mac = "apple-darwin", windows = "pc-windows-msvc", linux = "unknown-linux-gnu" } @@ -80,7 +80,7 @@ local function installOrUpdateServer() binary = "rust-analyzer.exe" end - Settings.binary.defaultPath = lspPkgInfo.path:resolvePath(binary) + Settings.binary:setValue(lspPkgInfo.path:resolvePath(binary)) Settings:apply() return end @@ -130,8 +130,8 @@ local function layoutSettings() Settings.binary, br, Row { PushButton { - text("Try to install Rust language server"), - onClicked(function() a.sync(installOrUpdateServer)() end), + text = "Try to install Rust language server", + onClicked = function() a.sync(installOrUpdateServer)() end, br, }, st @@ -141,6 +141,36 @@ local function layoutSettings() return layout end +local function binaryFromPkg() + local lspPkgInfo = Install.packageInfo("rust-analyzer") + if lspPkgInfo then + local binary = "rust-analyzer" + if Utils.HostOsInfo.isWindowsHost() then + binary = "rust-analyzer.exe" + end + local binaryPath = lspPkgInfo.path:resolvePath(binary) + if binaryPath:isExecutableFile() == true then + return binaryPath + end + end + + return nil +end + +local function findBinary() + local binary = binaryFromPkg() + if binary then + return binary + end + + -- Search for the binary in the PATH + local serverPath = Utils.FilePath.fromUserInput("rust-analyzer") + local absolute = a.wait(serverPath:searchInPath()):resolveSymlinks() + if absolute:isExecutableFile() == true then + return absolute + end + return serverPath +end local function setupAspect() ---@class Settings: AspectContainer Settings = S.AspectContainer.create({ @@ -154,14 +184,8 @@ local function setupAspect() labelText = "Binary:", toolTip = "The path to the rust analyzer binary.", expectedKind = S.Kind.ExistingCommand, - defaultPath = Utils.FilePath.fromUserInput("rust-analyzer"), + defaultPath = findBinary(), }) - -- Search for the binary in the PATH - local serverPath = Settings.binary.defaultPath - local absolute = a.wait(serverPath:searchInPath()):resolveSymlinks() - if absolute:isExecutableFile() == true then - Settings.binary.defaultPath = absolute - end return Settings end