From d76082da598667a7555e737340ea12153f277b3c Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 2 May 2024 15:07:28 +0200 Subject: [PATCH] Lua: Make FilePath:searchInPath async Change-Id: Ida94856c26bab38d95753fb4d5475d57e3315212 Reviewed-by: David Schulz --- src/plugins/lua/bindings/utils.cpp | 61 ++++++++++++++++++------------ src/plugins/lua/meta/utils.lua | 2 +- src/plugins/lualsp/lualsp/init.lua | 6 +-- 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/plugins/lua/bindings/utils.cpp b/src/plugins/lua/bindings/utils.cpp index 970eef3440c..d8f860cc68a 100644 --- a/src/plugins/lua/bindings/utils.cpp +++ b/src/plugins/lua/bindings/utils.cpp @@ -34,40 +34,52 @@ void addUtilsModule() timer->start(); }); - auto dirEntries_cb = [&futureSync]( - const FilePath &p, - const sol::table &options, - const sol::function &cb) { - const QStringList nameFilters = options.get_or("nameFilters", {}); - QDir::Filters fileFilters - = (QDir::Filters) options.get_or("fileFilters", QDir::NoFilter); - QDirIterator::IteratorFlags flags - = (QDirIterator::IteratorFlags) - options.get_or("flags", QDirIterator::NoIteratorFlags); + auto dirEntries_cb = + [&futureSync](const FilePath &p, const sol::table &options, const sol::function &cb) { + const QStringList nameFilters = options.get_or("nameFilters", {}); + QDir::Filters fileFilters + = (QDir::Filters) options.get_or("fileFilters", QDir::NoFilter); + QDirIterator::IteratorFlags flags + = (QDirIterator::IteratorFlags) + options.get_or("flags", QDirIterator::NoIteratorFlags); - FileFilter filter(nameFilters, fileFilters, flags); + FileFilter filter(nameFilters, fileFilters, flags); - QFuture future = Utils::asyncRun([p, filter](QPromise &promise) { - p.iterateDirectory( - [&promise](const FilePath &item) { - if (promise.isCanceled()) - return IterationPolicy::Stop; + QFuture future = Utils::asyncRun( + [p, filter](QPromise &promise) { + p.iterateDirectory( + [&promise](const FilePath &item) { + if (promise.isCanceled()) + return IterationPolicy::Stop; - promise.addResult(item); - return IterationPolicy::Continue; - }, - filter); - }); + promise.addResult(item); + return IterationPolicy::Continue; + }, + filter); + }); + + futureSync.addFuture(future); + + Utils::onFinished( + future, &LuaEngine::instance(), [cb](const QFuture &future) { + cb(future.results()); + }); + }; + + auto searchInPath_cb = [&futureSync](const FilePath &p, const sol::function &cb) { + QFuture future = Utils::asyncRun( + [p](QPromise &promise) { promise.addResult(p.searchInPath()); }); futureSync.addFuture(future); Utils::onFinished( future, &LuaEngine::instance(), [cb](const QFuture &future) { - cb(future.results()); + cb(future.result()); }); }; utils.set_function("__dirEntries_cb__", dirEntries_cb); + utils.set_function("__searchInPath_cb__", searchInPath_cb); sol::function wrap = async["wrap"].get(); @@ -96,8 +108,6 @@ void addUtilsModule() &FilePath::toUserOutput, "fromUserInput", &FilePath::fromUserInput, - "searchInPath", - [](const FilePath &self) { return self.searchInPath(); }, "exists", &FilePath::exists, "resolveSymlinks", @@ -124,6 +134,9 @@ void addUtilsModule() utils["FilePath"]["dirEntries_cb"] = utils["__dirEntries_cb__"]; utils["FilePath"]["dirEntries"] = wrap(utils["__dirEntries_cb__"]); + utils["FilePath"]["searchInPath_cb"] = utils["__searchInPath_cb__"]; + utils["FilePath"]["searchInPath"] = wrap(utils["__searchInPath_cb__"]); + return utils; }); } diff --git a/src/plugins/lua/meta/utils.lua b/src/plugins/lua/meta/utils.lua index 01d291c5789..083b87adc10 100644 --- a/src/plugins/lua/meta/utils.lua +++ b/src/plugins/lua/meta/utils.lua @@ -20,7 +20,7 @@ utils.FilePath = {} function utils.FilePath.fromUserInput(path) end ---@return FilePath The new absolute path ----Searches for the path inside the PATH environment variable +---Searches for the path inside the PATH environment variable. Call `a.wait` on the returned value to get the result. function utils.FilePath:searchInPath() end ---@class (exact) DirEntriesOptions diff --git a/src/plugins/lualsp/lualsp/init.lua b/src/plugins/lualsp/lualsp/init.lua index 85812543103..75162c95c00 100644 --- a/src/plugins/lualsp/lualsp/init.lua +++ b/src/plugins/lualsp/lualsp/init.lua @@ -146,15 +146,15 @@ local function setup(parameters) print("Setting up Lua Language Server ...") setupAspect() local serverPath = Utils.FilePath.fromUserInput("lua-language-server") - local absolute = serverPath:searchInPath():resolveSymlinks() + local absolute = a.wait(serverPath:searchInPath()):resolveSymlinks() if absolute:isExecutableFile() == true then Settings.binary.defaultPath = absolute else - a.sync(installServer)() + installServer() end setupClient() end return { - setup = setup, + setup = function() a.sync(setup)() end, }