Add a new completion API for experimental plugins feature. (#5000)

Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
This commit is contained in:
Mm2PL
2023-12-10 14:41:05 +01:00
committed by GitHub
parent e4258160cd
commit fd4cac2c2c
13 changed files with 448 additions and 16 deletions
+44
View File
@@ -4,6 +4,7 @@
# include "common/Channel.hpp"
# include "common/QLogging.hpp"
# include "controllers/commands/CommandContext.hpp"
# include "controllers/plugins/LuaAPI.hpp"
# include <lauxlib.h>
# include <lua.h>
@@ -75,6 +76,9 @@ QString humanErrorText(lua_State *L, int errCode)
case LUA_ERRFILE:
errName = "(file error)";
break;
case ERROR_BAD_PEEK:
errName = "(unable to convert value to c++)";
break;
default:
errName = "(unknown error type)";
}
@@ -111,6 +115,7 @@ StackIdx push(lua_State *L, const std::string &str)
StackIdx push(lua_State *L, const CommandContext &ctx)
{
StackGuard guard(L, 1);
auto outIdx = pushEmptyTable(L, 2);
push(L, ctx.words);
@@ -127,8 +132,27 @@ StackIdx push(lua_State *L, const bool &b)
return lua_gettop(L);
}
StackIdx push(lua_State *L, const int &b)
{
lua_pushinteger(L, b);
return lua_gettop(L);
}
bool peek(lua_State *L, bool *out, StackIdx idx)
{
StackGuard guard(L);
if (!lua_isboolean(L, idx))
{
return false;
}
*out = bool(lua_toboolean(L, idx));
return true;
}
bool peek(lua_State *L, double *out, StackIdx idx)
{
StackGuard guard(L);
int ok{0};
auto v = lua_tonumberx(L, idx, &ok);
if (ok != 0)
@@ -140,6 +164,7 @@ bool peek(lua_State *L, double *out, StackIdx idx)
bool peek(lua_State *L, QString *out, StackIdx idx)
{
StackGuard guard(L);
size_t len{0};
const char *str = lua_tolstring(L, idx, &len);
if (str == nullptr)
@@ -156,6 +181,7 @@ bool peek(lua_State *L, QString *out, StackIdx idx)
bool peek(lua_State *L, QByteArray *out, StackIdx idx)
{
StackGuard guard(L);
size_t len{0};
const char *str = lua_tolstring(L, idx, &len);
if (str == nullptr)
@@ -172,6 +198,7 @@ bool peek(lua_State *L, QByteArray *out, StackIdx idx)
bool peek(lua_State *L, std::string *out, StackIdx idx)
{
StackGuard guard(L);
size_t len{0};
const char *str = lua_tolstring(L, idx, &len);
if (str == nullptr)
@@ -186,6 +213,23 @@ bool peek(lua_State *L, std::string *out, StackIdx idx)
return true;
}
bool peek(lua_State *L, api::CompletionList *out, StackIdx idx)
{
StackGuard guard(L);
int typ = lua_getfield(L, idx, "values");
if (typ != LUA_TTABLE)
{
lua_pop(L, 1);
return false;
}
if (!lua::pop(L, &out->values, -1))
{
return false;
}
lua_getfield(L, idx, "hide_others");
return lua::pop(L, &out->hideOthers);
}
QString toString(lua_State *L, StackIdx idx)
{
size_t len{};