mirror of
https://github.com/neovim/neovim.git
synced 2025-09-29 14:38:32 +00:00
refactor: format with uncrustify #15722
This commit is contained in:
@@ -1,33 +1,31 @@
|
||||
// This is an open source non-commercial project. Dear PVS-Studio, please check
|
||||
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||
|
||||
#include <assert.h>
|
||||
#include <lauxlib.h>
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "nvim/api/private/defs.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/assert.h"
|
||||
#include "nvim/func_attr.h"
|
||||
#include "nvim/memory.h"
|
||||
#include "nvim/assert.h"
|
||||
// FIXME: vim.h is not actually needed, but otherwise it states MAXPATHL is
|
||||
// redefined
|
||||
#include "nvim/vim.h"
|
||||
#include "nvim/globals.h"
|
||||
#include "nvim/message.h"
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/eval/decode.h"
|
||||
#include "nvim/eval/typval.h"
|
||||
#include "nvim/eval/userfunc.h"
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/macros.h"
|
||||
|
||||
#include "nvim/globals.h"
|
||||
#include "nvim/lib/kvec.h"
|
||||
#include "nvim/eval/decode.h"
|
||||
|
||||
#include "nvim/lua/converter.h"
|
||||
#include "nvim/lua/executor.h"
|
||||
#include "nvim/macros.h"
|
||||
#include "nvim/message.h"
|
||||
#include "nvim/vim.h"
|
||||
|
||||
/// Determine, which keys lua table contains
|
||||
typedef struct {
|
||||
@@ -49,7 +47,7 @@ typedef struct {
|
||||
#define VAL_IDX_VALUE false
|
||||
|
||||
#define LUA_PUSH_STATIC_STRING(lstate, s) \
|
||||
lua_pushlstring(lstate, s, sizeof(s) - 1)
|
||||
lua_pushlstring(lstate, s, sizeof(s) - 1)
|
||||
|
||||
|
||||
static LuaTableProps nlua_traverse_table(lua_State *const lstate)
|
||||
@@ -71,57 +69,56 @@ static LuaTableProps nlua_traverse_table(lua_State *const lstate)
|
||||
lua_pushnil(lstate);
|
||||
while (lua_next(lstate, -2)) {
|
||||
switch (lua_type(lstate, -2)) {
|
||||
case LUA_TSTRING: {
|
||||
size_t len;
|
||||
const char *s = lua_tolstring(lstate, -2, &len);
|
||||
if (memchr(s, NUL, len) != NULL) {
|
||||
ret.has_string_with_nul = true;
|
||||
}
|
||||
ret.string_keys_num++;
|
||||
break;
|
||||
case LUA_TSTRING: {
|
||||
size_t len;
|
||||
const char *s = lua_tolstring(lstate, -2, &len);
|
||||
if (memchr(s, NUL, len) != NULL) {
|
||||
ret.has_string_with_nul = true;
|
||||
}
|
||||
case LUA_TNUMBER: {
|
||||
const lua_Number n = lua_tonumber(lstate, -2);
|
||||
if (n > (lua_Number)SIZE_MAX || n <= 0
|
||||
|| ((lua_Number)((size_t)n)) != n) {
|
||||
other_keys_num++;
|
||||
} else {
|
||||
const size_t idx = (size_t)n;
|
||||
if (idx > ret.maxidx) {
|
||||
ret.maxidx = idx;
|
||||
}
|
||||
ret.string_keys_num++;
|
||||
break;
|
||||
}
|
||||
case LUA_TNUMBER: {
|
||||
const lua_Number n = lua_tonumber(lstate, -2);
|
||||
if (n > (lua_Number)SIZE_MAX || n <= 0
|
||||
|| ((lua_Number)((size_t)n)) != n) {
|
||||
other_keys_num++;
|
||||
} else {
|
||||
const size_t idx = (size_t)n;
|
||||
if (idx > ret.maxidx) {
|
||||
ret.maxidx = idx;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LUA_TBOOLEAN: {
|
||||
const bool b = lua_toboolean(lstate, -2);
|
||||
if (b == TYPE_IDX_VALUE) {
|
||||
if (lua_type(lstate, -1) == LUA_TNUMBER) {
|
||||
lua_Number n = lua_tonumber(lstate, -1);
|
||||
if (n == (lua_Number)kObjectTypeFloat
|
||||
|| n == (lua_Number)kObjectTypeArray
|
||||
|| n == (lua_Number)kObjectTypeDictionary) {
|
||||
ret.has_type_key = true;
|
||||
ret.type = (ObjectType)n;
|
||||
} else {
|
||||
other_keys_num++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LUA_TBOOLEAN: {
|
||||
const bool b = lua_toboolean(lstate, -2);
|
||||
if (b == TYPE_IDX_VALUE) {
|
||||
if (lua_type(lstate, -1) == LUA_TNUMBER) {
|
||||
lua_Number n = lua_tonumber(lstate, -1);
|
||||
if (n == (lua_Number)kObjectTypeFloat
|
||||
|| n == (lua_Number)kObjectTypeArray
|
||||
|| n == (lua_Number)kObjectTypeDictionary) {
|
||||
ret.has_type_key = true;
|
||||
ret.type = (ObjectType)n;
|
||||
} else {
|
||||
other_keys_num++;
|
||||
}
|
||||
} else {
|
||||
has_val_key = true;
|
||||
val_type = lua_type(lstate, -1);
|
||||
if (val_type == LUA_TNUMBER) {
|
||||
ret.val = lua_tonumber(lstate, -1);
|
||||
}
|
||||
other_keys_num++;
|
||||
}
|
||||
} else {
|
||||
has_val_key = true;
|
||||
val_type = lua_type(lstate, -1);
|
||||
if (val_type == LUA_TNUMBER) {
|
||||
ret.val = lua_tonumber(lstate, -1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
other_keys_num++;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
other_keys_num++;
|
||||
break;
|
||||
}
|
||||
tsize++;
|
||||
lua_pop(lstate, 1);
|
||||
@@ -283,153 +280,143 @@ bool nlua_pop_typval(lua_State *lstate, typval_T *ret_tv)
|
||||
.vval = { .v_number = 0 },
|
||||
};
|
||||
switch (lua_type(lstate, -1)) {
|
||||
case LUA_TNIL: {
|
||||
cur.tv->v_type = VAR_SPECIAL;
|
||||
cur.tv->vval.v_special = kSpecialVarNull;
|
||||
break;
|
||||
}
|
||||
case LUA_TBOOLEAN: {
|
||||
cur.tv->v_type = VAR_BOOL;
|
||||
cur.tv->vval.v_bool = (lua_toboolean(lstate, -1)
|
||||
case LUA_TNIL:
|
||||
cur.tv->v_type = VAR_SPECIAL;
|
||||
cur.tv->vval.v_special = kSpecialVarNull;
|
||||
break;
|
||||
case LUA_TBOOLEAN:
|
||||
cur.tv->v_type = VAR_BOOL;
|
||||
cur.tv->vval.v_bool = (lua_toboolean(lstate, -1)
|
||||
? kBoolVarTrue
|
||||
: kBoolVarFalse);
|
||||
break;
|
||||
break;
|
||||
case LUA_TSTRING: {
|
||||
size_t len;
|
||||
const char *s = lua_tolstring(lstate, -1, &len);
|
||||
*cur.tv = decode_string(s, len, kNone, true, false);
|
||||
if (cur.tv->v_type == VAR_UNKNOWN) {
|
||||
ret = false;
|
||||
}
|
||||
case LUA_TSTRING: {
|
||||
size_t len;
|
||||
const char *s = lua_tolstring(lstate, -1, &len);
|
||||
*cur.tv = decode_string(s, len, kNone, true, false);
|
||||
if (cur.tv->v_type == VAR_UNKNOWN) {
|
||||
ret = false;
|
||||
}
|
||||
break;
|
||||
break;
|
||||
}
|
||||
case LUA_TNUMBER: {
|
||||
const lua_Number n = lua_tonumber(lstate, -1);
|
||||
if (n > (lua_Number)VARNUMBER_MAX || n < (lua_Number)VARNUMBER_MIN
|
||||
|| ((lua_Number)((varnumber_T)n)) != n) {
|
||||
cur.tv->v_type = VAR_FLOAT;
|
||||
cur.tv->vval.v_float = (float_T)n;
|
||||
} else {
|
||||
cur.tv->v_type = VAR_NUMBER;
|
||||
cur.tv->vval.v_number = (varnumber_T)n;
|
||||
}
|
||||
case LUA_TNUMBER: {
|
||||
const lua_Number n = lua_tonumber(lstate, -1);
|
||||
if (n > (lua_Number)VARNUMBER_MAX || n < (lua_Number)VARNUMBER_MIN
|
||||
|| ((lua_Number)((varnumber_T)n)) != n) {
|
||||
cur.tv->v_type = VAR_FLOAT;
|
||||
cur.tv->vval.v_float = (float_T)n;
|
||||
} else {
|
||||
cur.tv->v_type = VAR_NUMBER;
|
||||
cur.tv->vval.v_number = (varnumber_T)n;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LUA_TTABLE: {
|
||||
// Only need to track table refs if we have a metatable associated.
|
||||
LuaRef table_ref = LUA_NOREF;
|
||||
if (lua_getmetatable(lstate, -1)) {
|
||||
lua_pop(lstate, 1);
|
||||
table_ref = nlua_ref(lstate, -1);
|
||||
}
|
||||
|
||||
const LuaTableProps table_props = nlua_traverse_table(lstate);
|
||||
|
||||
for (size_t i = 0; i < kv_size(stack); i++) {
|
||||
const TVPopStackItem item = kv_A(stack, i);
|
||||
if (item.container && lua_rawequal(lstate, -1, item.idx)) {
|
||||
tv_copy(item.tv, cur.tv);
|
||||
cur.container = false;
|
||||
goto nlua_pop_typval_table_processing_end;
|
||||
}
|
||||
}
|
||||
|
||||
switch (table_props.type) {
|
||||
case kObjectTypeArray: {
|
||||
cur.tv->v_type = VAR_LIST;
|
||||
cur.tv->vval.v_list = tv_list_alloc((ptrdiff_t)table_props.maxidx);
|
||||
cur.tv->vval.v_list->lua_table_ref = table_ref;
|
||||
tv_list_ref(cur.tv->vval.v_list);
|
||||
if (table_props.maxidx != 0) {
|
||||
cur.container = true;
|
||||
cur.idx = lua_gettop(lstate);
|
||||
kvi_push(stack, cur);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kObjectTypeDictionary: {
|
||||
if (table_props.string_keys_num == 0) {
|
||||
cur.tv->v_type = VAR_DICT;
|
||||
cur.tv->vval.v_dict = tv_dict_alloc();
|
||||
cur.tv->vval.v_dict->dv_refcount++;
|
||||
cur.tv->vval.v_dict->lua_table_ref = table_ref;
|
||||
} else {
|
||||
cur.special = table_props.has_string_with_nul;
|
||||
if (table_props.has_string_with_nul) {
|
||||
decode_create_map_special_dict(
|
||||
cur.tv, (ptrdiff_t)table_props.string_keys_num);
|
||||
assert(cur.tv->v_type == VAR_DICT);
|
||||
dictitem_T *const val_di = tv_dict_find(cur.tv->vval.v_dict,
|
||||
S_LEN("_VAL"));
|
||||
assert(val_di != NULL);
|
||||
cur.tv = &val_di->di_tv;
|
||||
cur.tv->vval.v_list->lua_table_ref = table_ref;
|
||||
assert(cur.tv->v_type == VAR_LIST);
|
||||
} else {
|
||||
cur.tv->v_type = VAR_DICT;
|
||||
cur.tv->vval.v_dict = tv_dict_alloc();
|
||||
cur.tv->vval.v_dict->dv_refcount++;
|
||||
cur.tv->vval.v_dict->lua_table_ref = table_ref;
|
||||
}
|
||||
cur.container = true;
|
||||
cur.idx = lua_gettop(lstate);
|
||||
kvi_push(stack, cur);
|
||||
lua_pushnil(lstate);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kObjectTypeFloat: {
|
||||
cur.tv->v_type = VAR_FLOAT;
|
||||
cur.tv->vval.v_float = (float_T)table_props.val;
|
||||
break;
|
||||
}
|
||||
case kObjectTypeNil: {
|
||||
EMSG(_("E5100: Cannot convert given lua table: table "
|
||||
"should either have a sequence of positive integer keys "
|
||||
"or contain only string keys"));
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
nlua_pop_typval_table_processing_end:
|
||||
break;
|
||||
}
|
||||
case LUA_TFUNCTION: {
|
||||
LuaCFunctionState *state = xmalloc(sizeof(LuaCFunctionState));
|
||||
state->lua_callable.func_ref = nlua_ref(lstate, -1);
|
||||
|
||||
char_u *name = register_cfunc(
|
||||
&nlua_CFunction_func_call,
|
||||
&nlua_CFunction_func_free,
|
||||
state);
|
||||
|
||||
cur.tv->v_type = VAR_FUNC;
|
||||
cur.tv->vval.v_string = vim_strsave(name);
|
||||
break;
|
||||
}
|
||||
case LUA_TUSERDATA: {
|
||||
// TODO(bfredl): check mt.__call and convert to function?
|
||||
nlua_pushref(lstate, nlua_nil_ref);
|
||||
bool is_nil = lua_rawequal(lstate, -2, -1);
|
||||
break;
|
||||
}
|
||||
case LUA_TTABLE: {
|
||||
// Only need to track table refs if we have a metatable associated.
|
||||
LuaRef table_ref = LUA_NOREF;
|
||||
if (lua_getmetatable(lstate, -1)) {
|
||||
lua_pop(lstate, 1);
|
||||
if (is_nil) {
|
||||
cur.tv->v_type = VAR_SPECIAL;
|
||||
cur.tv->vval.v_special = kSpecialVarNull;
|
||||
} else {
|
||||
EMSG(_("E5101: Cannot convert given lua type"));
|
||||
ret = false;
|
||||
table_ref = nlua_ref(lstate, -1);
|
||||
}
|
||||
|
||||
const LuaTableProps table_props = nlua_traverse_table(lstate);
|
||||
|
||||
for (size_t i = 0; i < kv_size(stack); i++) {
|
||||
const TVPopStackItem item = kv_A(stack, i);
|
||||
if (item.container && lua_rawequal(lstate, -1, item.idx)) {
|
||||
tv_copy(item.tv, cur.tv);
|
||||
cur.container = false;
|
||||
goto nlua_pop_typval_table_processing_end;
|
||||
}
|
||||
}
|
||||
|
||||
switch (table_props.type) {
|
||||
case kObjectTypeArray:
|
||||
cur.tv->v_type = VAR_LIST;
|
||||
cur.tv->vval.v_list = tv_list_alloc((ptrdiff_t)table_props.maxidx);
|
||||
cur.tv->vval.v_list->lua_table_ref = table_ref;
|
||||
tv_list_ref(cur.tv->vval.v_list);
|
||||
if (table_props.maxidx != 0) {
|
||||
cur.container = true;
|
||||
cur.idx = lua_gettop(lstate);
|
||||
kvi_push(stack, cur);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
EMSG(_("E5101: Cannot convert given lua type"));
|
||||
case kObjectTypeDictionary:
|
||||
if (table_props.string_keys_num == 0) {
|
||||
cur.tv->v_type = VAR_DICT;
|
||||
cur.tv->vval.v_dict = tv_dict_alloc();
|
||||
cur.tv->vval.v_dict->dv_refcount++;
|
||||
cur.tv->vval.v_dict->lua_table_ref = table_ref;
|
||||
} else {
|
||||
cur.special = table_props.has_string_with_nul;
|
||||
if (table_props.has_string_with_nul) {
|
||||
decode_create_map_special_dict(cur.tv, (ptrdiff_t)table_props.string_keys_num);
|
||||
assert(cur.tv->v_type == VAR_DICT);
|
||||
dictitem_T *const val_di = tv_dict_find(cur.tv->vval.v_dict,
|
||||
S_LEN("_VAL"));
|
||||
assert(val_di != NULL);
|
||||
cur.tv = &val_di->di_tv;
|
||||
cur.tv->vval.v_list->lua_table_ref = table_ref;
|
||||
assert(cur.tv->v_type == VAR_LIST);
|
||||
} else {
|
||||
cur.tv->v_type = VAR_DICT;
|
||||
cur.tv->vval.v_dict = tv_dict_alloc();
|
||||
cur.tv->vval.v_dict->dv_refcount++;
|
||||
cur.tv->vval.v_dict->lua_table_ref = table_ref;
|
||||
}
|
||||
cur.container = true;
|
||||
cur.idx = lua_gettop(lstate);
|
||||
kvi_push(stack, cur);
|
||||
lua_pushnil(lstate);
|
||||
}
|
||||
break;
|
||||
case kObjectTypeFloat:
|
||||
cur.tv->v_type = VAR_FLOAT;
|
||||
cur.tv->vval.v_float = (float_T)table_props.val;
|
||||
break;
|
||||
case kObjectTypeNil:
|
||||
EMSG(_("E5100: Cannot convert given lua table: table "
|
||||
"should either have a sequence of positive integer keys "
|
||||
"or contain only string keys"));
|
||||
ret = false;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
nlua_pop_typval_table_processing_end:
|
||||
break;
|
||||
}
|
||||
case LUA_TFUNCTION: {
|
||||
LuaCFunctionState *state = xmalloc(sizeof(LuaCFunctionState));
|
||||
state->lua_callable.func_ref = nlua_ref(lstate, -1);
|
||||
|
||||
char_u *name = register_cfunc(&nlua_CFunction_func_call,
|
||||
&nlua_CFunction_func_free,
|
||||
state);
|
||||
|
||||
cur.tv->v_type = VAR_FUNC;
|
||||
cur.tv->vval.v_string = vim_strsave(name);
|
||||
break;
|
||||
}
|
||||
case LUA_TUSERDATA: {
|
||||
// TODO(bfredl): check mt.__call and convert to function?
|
||||
nlua_pushref(lstate, nlua_nil_ref);
|
||||
bool is_nil = lua_rawequal(lstate, -2, -1);
|
||||
lua_pop(lstate, 1);
|
||||
if (is_nil) {
|
||||
cur.tv->v_type = VAR_SPECIAL;
|
||||
cur.tv->vval.v_special = kSpecialVarNull;
|
||||
} else {
|
||||
EMSG(_("E5101: Cannot convert given lua type"));
|
||||
ret = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
EMSG(_("E5101: Cannot convert given lua type"));
|
||||
ret = false;
|
||||
break;
|
||||
}
|
||||
if (!cur.container) {
|
||||
lua_pop(lstate, 1);
|
||||
@@ -454,97 +441,97 @@ static bool typval_conv_special = false;
|
||||
#define TYPVAL_ENCODE_ALLOW_SPECIALS true
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_NIL(tv) \
|
||||
do { \
|
||||
if (typval_conv_special) { \
|
||||
lua_pushnil(lstate); \
|
||||
} else { \
|
||||
nlua_pushref(lstate, nlua_nil_ref); \
|
||||
} \
|
||||
} while (0)
|
||||
do { \
|
||||
if (typval_conv_special) { \
|
||||
lua_pushnil(lstate); \
|
||||
} else { \
|
||||
nlua_pushref(lstate, nlua_nil_ref); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_BOOL(tv, num) \
|
||||
lua_pushboolean(lstate, (bool)(num))
|
||||
lua_pushboolean(lstate, (bool)(num))
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_NUMBER(tv, num) \
|
||||
lua_pushnumber(lstate, (lua_Number)(num))
|
||||
lua_pushnumber(lstate, (lua_Number)(num))
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_UNSIGNED_NUMBER TYPVAL_ENCODE_CONV_NUMBER
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_FLOAT(tv, flt) \
|
||||
TYPVAL_ENCODE_CONV_NUMBER(tv, flt)
|
||||
TYPVAL_ENCODE_CONV_NUMBER(tv, flt)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_STRING(tv, str, len) \
|
||||
lua_pushlstring(lstate, (const char *)(str), (len))
|
||||
lua_pushlstring(lstate, (const char *)(str), (len))
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_STR_STRING TYPVAL_ENCODE_CONV_STRING
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_EXT_STRING(tv, str, len, type) \
|
||||
TYPVAL_ENCODE_CONV_NIL(tv)
|
||||
TYPVAL_ENCODE_CONV_NIL(tv)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_BLOB(tv, blob, len) \
|
||||
do { \
|
||||
const blob_T *const blob_ = (blob); \
|
||||
lua_pushlstring(lstate, \
|
||||
blob_ != NULL ? (const char *)blob_->bv_ga.ga_data : "", \
|
||||
(size_t)(len)); \
|
||||
} while (0)
|
||||
do { \
|
||||
const blob_T *const blob_ = (blob); \
|
||||
lua_pushlstring(lstate, \
|
||||
blob_ != NULL ? (const char *)blob_->bv_ga.ga_data : "", \
|
||||
(size_t)(len)); \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_START(tv, fun) \
|
||||
do { \
|
||||
TYPVAL_ENCODE_CONV_NIL(tv); \
|
||||
goto typval_encode_stop_converting_one_item; \
|
||||
} while (0)
|
||||
do { \
|
||||
TYPVAL_ENCODE_CONV_NIL(tv); \
|
||||
goto typval_encode_stop_converting_one_item; \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_ARGS(tv, len)
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_BEFORE_SELF(tv, len)
|
||||
#define TYPVAL_ENCODE_CONV_FUNC_END(tv)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_EMPTY_LIST(tv) \
|
||||
lua_createtable(lstate, 0, 0)
|
||||
lua_createtable(lstate, 0, 0)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_EMPTY_DICT(tv, dict) \
|
||||
do { \
|
||||
if (typval_conv_special) { \
|
||||
nlua_create_typed_table(lstate, 0, 0, kObjectTypeDictionary); \
|
||||
} else { \
|
||||
lua_createtable(lstate, 0, 0); \
|
||||
nlua_pushref(lstate, nlua_empty_dict_ref); \
|
||||
lua_setmetatable(lstate, -2); \
|
||||
} \
|
||||
} while (0)
|
||||
do { \
|
||||
if (typval_conv_special) { \
|
||||
nlua_create_typed_table(lstate, 0, 0, kObjectTypeDictionary); \
|
||||
} else { \
|
||||
lua_createtable(lstate, 0, 0); \
|
||||
nlua_pushref(lstate, nlua_empty_dict_ref); \
|
||||
lua_setmetatable(lstate, -2); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_LIST_START(tv, len) \
|
||||
do { \
|
||||
if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) { \
|
||||
emsgf(_("E5102: Lua failed to grow stack to %i"), \
|
||||
lua_gettop(lstate) + 3); \
|
||||
return false; \
|
||||
} \
|
||||
lua_createtable(lstate, (int)(len), 0); \
|
||||
lua_pushnumber(lstate, 1); \
|
||||
} while (0)
|
||||
do { \
|
||||
if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) { \
|
||||
emsgf(_("E5102: Lua failed to grow stack to %i"), \
|
||||
lua_gettop(lstate) + 3); \
|
||||
return false; \
|
||||
} \
|
||||
lua_createtable(lstate, (int)(len), 0); \
|
||||
lua_pushnumber(lstate, 1); \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_REAL_LIST_AFTER_START(tv, mpsv)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS(tv) \
|
||||
do { \
|
||||
lua_Number idx = lua_tonumber(lstate, -2); \
|
||||
lua_rawset(lstate, -3); \
|
||||
lua_pushnumber(lstate, idx + 1); \
|
||||
} while (0)
|
||||
do { \
|
||||
lua_Number idx = lua_tonumber(lstate, -2); \
|
||||
lua_rawset(lstate, -3); \
|
||||
lua_pushnumber(lstate, idx + 1); \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_LIST_END(tv) \
|
||||
lua_rawset(lstate, -3)
|
||||
lua_rawset(lstate, -3)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_DICT_START(tv, dict, len) \
|
||||
do { \
|
||||
if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) { \
|
||||
emsgf(_("E5102: Lua failed to grow stack to %i"), \
|
||||
lua_gettop(lstate) + 3); \
|
||||
return false; \
|
||||
} \
|
||||
lua_createtable(lstate, 0, (int)(len)); \
|
||||
} while (0)
|
||||
do { \
|
||||
if (!lua_checkstack(lstate, lua_gettop(lstate) + 3)) { \
|
||||
emsgf(_("E5102: Lua failed to grow stack to %i"), \
|
||||
lua_gettop(lstate) + 3); \
|
||||
return false; \
|
||||
} \
|
||||
lua_createtable(lstate, 0, (int)(len)); \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_SPECIAL_DICT_KEY_CHECK(label, kv_pair)
|
||||
|
||||
@@ -553,26 +540,26 @@ static bool typval_conv_special = false;
|
||||
#define TYPVAL_ENCODE_CONV_DICT_AFTER_KEY(tv, dict)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict) \
|
||||
lua_rawset(lstate, -3)
|
||||
lua_rawset(lstate, -3)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_DICT_END(tv, dict) \
|
||||
TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict)
|
||||
TYPVAL_ENCODE_CONV_DICT_BETWEEN_ITEMS(tv, dict)
|
||||
|
||||
#define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \
|
||||
do { \
|
||||
for (size_t backref = kv_size(*mpstack); backref; backref--) { \
|
||||
const MPConvStackVal mpval = kv_A(*mpstack, backref - 1); \
|
||||
if (mpval.type == conv_type) { \
|
||||
if (conv_type == kMPConvDict \
|
||||
do { \
|
||||
for (size_t backref = kv_size(*mpstack); backref; backref--) { \
|
||||
const MPConvStackVal mpval = kv_A(*mpstack, backref - 1); \
|
||||
if (mpval.type == conv_type) { \
|
||||
if (conv_type == kMPConvDict \
|
||||
? (void *)mpval.data.d.dict == (void *)(val) \
|
||||
: (void *)mpval.data.l.list == (void *)(val)) { \
|
||||
lua_pushvalue(lstate, \
|
||||
-((int)((kv_size(*mpstack) - backref + 1) * 2))); \
|
||||
break; \
|
||||
} \
|
||||
lua_pushvalue(lstate, \
|
||||
-((int)((kv_size(*mpstack) - backref + 1) * 2))); \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define TYPVAL_ENCODE_SCOPE static
|
||||
#define TYPVAL_ENCODE_NAME lua
|
||||
@@ -674,9 +661,7 @@ static inline void nlua_push_type(lua_State *lstate, ObjectType type)
|
||||
/// @param[in] narr Number of “array” entries to be populated later.
|
||||
/// @param[in] nrec Number of “dictionary” entries to be populated later.
|
||||
/// @param[in] type Type of the table.
|
||||
static inline void nlua_create_typed_table(lua_State *lstate,
|
||||
const size_t narr,
|
||||
const size_t nrec,
|
||||
static inline void nlua_create_typed_table(lua_State *lstate, const size_t narr, const size_t nrec,
|
||||
const ObjectType type)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
@@ -733,8 +718,7 @@ void nlua_push_Boolean(lua_State *lstate, const Boolean b, bool special)
|
||||
/// Convert given Dictionary to lua table
|
||||
///
|
||||
/// Leaves converted table on top of the stack.
|
||||
void nlua_push_Dictionary(lua_State *lstate, const Dictionary dict,
|
||||
bool special)
|
||||
void nlua_push_Dictionary(lua_State *lstate, const Dictionary dict, bool special)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
if (dict.size == 0 && special) {
|
||||
@@ -767,10 +751,10 @@ void nlua_push_Array(lua_State *lstate, const Array array, bool special)
|
||||
}
|
||||
|
||||
#define GENERATE_INDEX_FUNCTION(type) \
|
||||
void nlua_push_##type(lua_State *lstate, const type item, bool special) \
|
||||
void nlua_push_##type(lua_State *lstate, const type item, bool special) \
|
||||
FUNC_ATTR_NONNULL_ALL \
|
||||
{ \
|
||||
lua_pushnumber(lstate, (lua_Number)(item)); \
|
||||
{ \
|
||||
lua_pushnumber(lstate, (lua_Number)(item)); \
|
||||
}
|
||||
|
||||
GENERATE_INDEX_FUNCTION(Buffer)
|
||||
@@ -786,23 +770,22 @@ void nlua_push_Object(lua_State *lstate, const Object obj, bool special)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
switch (obj.type) {
|
||||
case kObjectTypeNil: {
|
||||
if (special) {
|
||||
lua_pushnil(lstate);
|
||||
} else {
|
||||
nlua_pushref(lstate, nlua_nil_ref);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kObjectTypeLuaRef: {
|
||||
nlua_pushref(lstate, obj.data.luaref);
|
||||
break;
|
||||
case kObjectTypeNil:
|
||||
if (special) {
|
||||
lua_pushnil(lstate);
|
||||
} else {
|
||||
nlua_pushref(lstate, nlua_nil_ref);
|
||||
}
|
||||
break;
|
||||
case kObjectTypeLuaRef: {
|
||||
nlua_pushref(lstate, obj.data.luaref);
|
||||
break;
|
||||
}
|
||||
#define ADD_TYPE(type, data_key) \
|
||||
case kObjectType##type: { \
|
||||
nlua_push_##type(lstate, obj.data.data_key, special); \
|
||||
break; \
|
||||
}
|
||||
case kObjectType##type: { \
|
||||
nlua_push_##type(lstate, obj.data.data_key, special); \
|
||||
break; \
|
||||
}
|
||||
ADD_TYPE(Boolean, boolean)
|
||||
ADD_TYPE(Integer, integer)
|
||||
ADD_TYPE(Float, floating)
|
||||
@@ -811,10 +794,10 @@ void nlua_push_Object(lua_State *lstate, const Object obj, bool special)
|
||||
ADD_TYPE(Dictionary, dictionary)
|
||||
#undef ADD_TYPE
|
||||
#define ADD_REMOTE_TYPE(type) \
|
||||
case kObjectType##type: { \
|
||||
nlua_push_##type(lstate, (type)obj.data.integer, special); \
|
||||
break; \
|
||||
}
|
||||
case kObjectType##type: { \
|
||||
nlua_push_##type(lstate, (type)obj.data.integer, special); \
|
||||
break; \
|
||||
}
|
||||
ADD_REMOTE_TYPE(Buffer)
|
||||
ADD_REMOTE_TYPE(Window)
|
||||
ADD_REMOTE_TYPE(Tabpage)
|
||||
@@ -883,8 +866,7 @@ Boolean nlua_pop_Boolean(lua_State *lstate, Error *err)
|
||||
/// @param[in] type Type to check.
|
||||
///
|
||||
/// @return @see nlua_traverse_table().
|
||||
static inline LuaTableProps nlua_check_type(lua_State *const lstate,
|
||||
Error *const err,
|
||||
static inline LuaTableProps nlua_check_type(lua_State *const lstate, Error *const err,
|
||||
const ObjectType type)
|
||||
FUNC_ATTR_NONNULL_ARG(1) FUNC_ATTR_WARN_UNUSED_RESULT
|
||||
{
|
||||
@@ -937,8 +919,7 @@ Float nlua_pop_Float(lua_State *lstate, Error *err)
|
||||
/// @param lstate Lua state.
|
||||
/// @param[in] table_props nlua_traverse_table() output.
|
||||
/// @param[out] err Location where error will be saved.
|
||||
static Array nlua_pop_Array_unchecked(lua_State *const lstate,
|
||||
const LuaTableProps table_props,
|
||||
static Array nlua_pop_Array_unchecked(lua_State *const lstate, const LuaTableProps table_props,
|
||||
Error *const err)
|
||||
{
|
||||
Array ret = { .size = table_props.maxidx, .items = NULL };
|
||||
@@ -990,10 +971,8 @@ Array nlua_pop_Array(lua_State *lstate, Error *err)
|
||||
/// @param lstate Lua interpreter state.
|
||||
/// @param[in] table_props nlua_traverse_table() output.
|
||||
/// @param[out] err Location where error will be saved.
|
||||
static Dictionary nlua_pop_Dictionary_unchecked(lua_State *lstate,
|
||||
const LuaTableProps table_props,
|
||||
bool ref,
|
||||
Error *err)
|
||||
static Dictionary nlua_pop_Dictionary_unchecked(lua_State *lstate, const LuaTableProps table_props,
|
||||
bool ref, Error *err)
|
||||
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
|
||||
{
|
||||
Dictionary ret = { .size = table_props.string_keys_num, .items = NULL };
|
||||
@@ -1138,113 +1117,104 @@ Object nlua_pop_Object(lua_State *const lstate, bool ref, Error *const err)
|
||||
assert(!cur.container);
|
||||
*cur.obj = NIL;
|
||||
switch (lua_type(lstate, -1)) {
|
||||
case LUA_TNIL: {
|
||||
break;
|
||||
case LUA_TNIL:
|
||||
break;
|
||||
case LUA_TBOOLEAN:
|
||||
*cur.obj = BOOLEAN_OBJ(lua_toboolean(lstate, -1));
|
||||
break;
|
||||
case LUA_TSTRING: {
|
||||
size_t len;
|
||||
const char *s = lua_tolstring(lstate, -1, &len);
|
||||
*cur.obj = STRING_OBJ(((String) {
|
||||
.data = xmemdupz(s, len),
|
||||
.size = len,
|
||||
}));
|
||||
break;
|
||||
}
|
||||
case LUA_TNUMBER: {
|
||||
const lua_Number n = lua_tonumber(lstate, -1);
|
||||
if (n > (lua_Number)API_INTEGER_MAX || n < (lua_Number)API_INTEGER_MIN
|
||||
|| ((lua_Number)((Integer)n)) != n) {
|
||||
*cur.obj = FLOAT_OBJ((Float)n);
|
||||
} else {
|
||||
*cur.obj = INTEGER_OBJ((Integer)n);
|
||||
}
|
||||
case LUA_TBOOLEAN: {
|
||||
*cur.obj = BOOLEAN_OBJ(lua_toboolean(lstate, -1));
|
||||
break;
|
||||
}
|
||||
case LUA_TSTRING: {
|
||||
size_t len;
|
||||
const char *s = lua_tolstring(lstate, -1, &len);
|
||||
*cur.obj = STRING_OBJ(((String) {
|
||||
.data = xmemdupz(s, len),
|
||||
.size = len,
|
||||
}));
|
||||
break;
|
||||
}
|
||||
case LUA_TNUMBER: {
|
||||
const lua_Number n = lua_tonumber(lstate, -1);
|
||||
if (n > (lua_Number)API_INTEGER_MAX || n < (lua_Number)API_INTEGER_MIN
|
||||
|| ((lua_Number)((Integer)n)) != n) {
|
||||
*cur.obj = FLOAT_OBJ((Float)n);
|
||||
} else {
|
||||
*cur.obj = INTEGER_OBJ((Integer)n);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case LUA_TTABLE: {
|
||||
const LuaTableProps table_props = nlua_traverse_table(lstate);
|
||||
break;
|
||||
}
|
||||
case LUA_TTABLE: {
|
||||
const LuaTableProps table_props = nlua_traverse_table(lstate);
|
||||
|
||||
switch (table_props.type) {
|
||||
case kObjectTypeArray: {
|
||||
*cur.obj = ARRAY_OBJ(((Array) {
|
||||
switch (table_props.type) {
|
||||
case kObjectTypeArray:
|
||||
*cur.obj = ARRAY_OBJ(((Array) {
|
||||
.items = NULL,
|
||||
.size = 0,
|
||||
.capacity = 0,
|
||||
}));
|
||||
if (table_props.maxidx != 0) {
|
||||
cur.obj->data.array.items =
|
||||
xcalloc(table_props.maxidx,
|
||||
sizeof(cur.obj->data.array.items[0]));
|
||||
cur.obj->data.array.capacity = table_props.maxidx;
|
||||
cur.container = true;
|
||||
kvi_push(stack, cur);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kObjectTypeDictionary: {
|
||||
*cur.obj = DICTIONARY_OBJ(((Dictionary) {
|
||||
if (table_props.maxidx != 0) {
|
||||
cur.obj->data.array.items =
|
||||
xcalloc(table_props.maxidx,
|
||||
sizeof(cur.obj->data.array.items[0]));
|
||||
cur.obj->data.array.capacity = table_props.maxidx;
|
||||
cur.container = true;
|
||||
kvi_push(stack, cur);
|
||||
}
|
||||
break;
|
||||
case kObjectTypeDictionary:
|
||||
*cur.obj = DICTIONARY_OBJ(((Dictionary) {
|
||||
.items = NULL,
|
||||
.size = 0,
|
||||
.capacity = 0,
|
||||
}));
|
||||
if (table_props.string_keys_num != 0) {
|
||||
cur.obj->data.dictionary.items =
|
||||
xcalloc(table_props.string_keys_num,
|
||||
sizeof(cur.obj->data.dictionary.items[0]));
|
||||
cur.obj->data.dictionary.capacity = table_props.string_keys_num;
|
||||
cur.container = true;
|
||||
kvi_push(stack, cur);
|
||||
lua_pushnil(lstate);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case kObjectTypeFloat: {
|
||||
*cur.obj = FLOAT_OBJ((Float)table_props.val);
|
||||
break;
|
||||
}
|
||||
case kObjectTypeNil: {
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"Cannot convert given lua table");
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
abort();
|
||||
}
|
||||
if (table_props.string_keys_num != 0) {
|
||||
cur.obj->data.dictionary.items =
|
||||
xcalloc(table_props.string_keys_num,
|
||||
sizeof(cur.obj->data.dictionary.items[0]));
|
||||
cur.obj->data.dictionary.capacity = table_props.string_keys_num;
|
||||
cur.container = true;
|
||||
kvi_push(stack, cur);
|
||||
lua_pushnil(lstate);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case LUA_TFUNCTION: {
|
||||
if (ref) {
|
||||
*cur.obj = LUAREF_OBJ(nlua_ref(lstate, -1));
|
||||
} else {
|
||||
goto type_error;
|
||||
}
|
||||
case kObjectTypeFloat:
|
||||
*cur.obj = FLOAT_OBJ((Float)table_props.val);
|
||||
break;
|
||||
}
|
||||
|
||||
case LUA_TUSERDATA: {
|
||||
nlua_pushref(lstate, nlua_nil_ref);
|
||||
bool is_nil = lua_rawequal(lstate, -2, -1);
|
||||
lua_pop(lstate, 1);
|
||||
if (is_nil) {
|
||||
*cur.obj = NIL;
|
||||
} else {
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"Cannot convert userdata");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
type_error:
|
||||
case kObjectTypeNil:
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"Cannot convert given lua type");
|
||||
"Cannot convert given lua table");
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case LUA_TFUNCTION:
|
||||
if (ref) {
|
||||
*cur.obj = LUAREF_OBJ(nlua_ref(lstate, -1));
|
||||
} else {
|
||||
goto type_error;
|
||||
}
|
||||
break;
|
||||
|
||||
case LUA_TUSERDATA: {
|
||||
nlua_pushref(lstate, nlua_nil_ref);
|
||||
bool is_nil = lua_rawequal(lstate, -2, -1);
|
||||
lua_pop(lstate, 1);
|
||||
if (is_nil) {
|
||||
*cur.obj = NIL;
|
||||
} else {
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"Cannot convert userdata");
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
type_error:
|
||||
api_set_error(err, kErrorTypeValidation,
|
||||
"Cannot convert given lua type");
|
||||
break;
|
||||
}
|
||||
if (!cur.container) {
|
||||
lua_pop(lstate, 1);
|
||||
@@ -1268,14 +1238,14 @@ LuaRef nlua_pop_LuaRef(lua_State *const lstate, Error *err)
|
||||
}
|
||||
|
||||
#define GENERATE_INDEX_FUNCTION(type) \
|
||||
type nlua_pop_##type(lua_State *lstate, Error *err) \
|
||||
type nlua_pop_##type(lua_State *lstate, Error *err) \
|
||||
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT \
|
||||
{ \
|
||||
type ret; \
|
||||
ret = (type)lua_tonumber(lstate, -1); \
|
||||
lua_pop(lstate, 1); \
|
||||
return ret; \
|
||||
}
|
||||
{ \
|
||||
type ret; \
|
||||
ret = (type)lua_tonumber(lstate, -1); \
|
||||
lua_pop(lstate, 1); \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
GENERATE_INDEX_FUNCTION(Buffer)
|
||||
GENERATE_INDEX_FUNCTION(Window)
|
||||
|
@@ -1,48 +1,45 @@
|
||||
// This is an open source non-commercial project. Dear PVS-Studio, please check
|
||||
// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
|
||||
|
||||
#include <lauxlib.h>
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
#include "nvim/assert.h"
|
||||
#include "nvim/version.h"
|
||||
#include "nvim/misc1.h"
|
||||
#include "nvim/getchar.h"
|
||||
#include "nvim/garray.h"
|
||||
#include "nvim/func_attr.h"
|
||||
#include "luv/luv.h"
|
||||
#include "mpack/lmpack.h"
|
||||
#include "nvim/api/private/defs.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/api/vim.h"
|
||||
#include "nvim/msgpack_rpc/channel.h"
|
||||
#include "nvim/vim.h"
|
||||
#include "nvim/extmark.h"
|
||||
#include "nvim/ex_getln.h"
|
||||
#include "nvim/ex_cmds2.h"
|
||||
#include "nvim/map.h"
|
||||
#include "nvim/message.h"
|
||||
#include "nvim/memline.h"
|
||||
#include "nvim/buffer_defs.h"
|
||||
#include "nvim/regexp.h"
|
||||
#include "nvim/macros.h"
|
||||
#include "nvim/screen.h"
|
||||
#include "nvim/cursor.h"
|
||||
#include "nvim/undo.h"
|
||||
#include "nvim/ascii.h"
|
||||
#include "nvim/assert.h"
|
||||
#include "nvim/buffer_defs.h"
|
||||
#include "nvim/change.h"
|
||||
#include "nvim/cursor.h"
|
||||
#include "nvim/eval/userfunc.h"
|
||||
#include "nvim/event/time.h"
|
||||
#include "nvim/event/loop.h"
|
||||
#include "mpack/lmpack.h"
|
||||
|
||||
#include "nvim/os/os.h"
|
||||
|
||||
#include "nvim/event/time.h"
|
||||
#include "nvim/ex_cmds2.h"
|
||||
#include "nvim/ex_getln.h"
|
||||
#include "nvim/extmark.h"
|
||||
#include "nvim/func_attr.h"
|
||||
#include "nvim/garray.h"
|
||||
#include "nvim/getchar.h"
|
||||
#include "nvim/lua/converter.h"
|
||||
#include "nvim/lua/executor.h"
|
||||
#include "nvim/lua/treesitter.h"
|
||||
#include "nvim/lua/xdiff.h"
|
||||
|
||||
#include "luv/luv.h"
|
||||
#include "nvim/macros.h"
|
||||
#include "nvim/map.h"
|
||||
#include "nvim/memline.h"
|
||||
#include "nvim/message.h"
|
||||
#include "nvim/misc1.h"
|
||||
#include "nvim/msgpack_rpc/channel.h"
|
||||
#include "nvim/os/os.h"
|
||||
#include "nvim/regexp.h"
|
||||
#include "nvim/screen.h"
|
||||
#include "nvim/undo.h"
|
||||
#include "nvim/version.h"
|
||||
#include "nvim/vim.h"
|
||||
|
||||
static int in_fast_callback = 0;
|
||||
|
||||
@@ -55,8 +52,8 @@ typedef struct {
|
||||
} LuaError;
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
# include "lua/vim_module.generated.h"
|
||||
# include "lua/executor.c.generated.h"
|
||||
# include "lua/vim_module.generated.h"
|
||||
#endif
|
||||
|
||||
#define PUSH_ALL_TYPVALS(lstate, args, argcount, special) \
|
||||
@@ -69,8 +66,8 @@ typedef struct {
|
||||
}
|
||||
|
||||
#if __has_feature(address_sanitizer)
|
||||
static PMap(handle_T) nlua_ref_markers = MAP_INIT;
|
||||
static bool nlua_track_refs = false;
|
||||
static PMap(handle_T) nlua_ref_markers = MAP_INIT;
|
||||
static bool nlua_track_refs = false;
|
||||
# define NLUA_TRACK_REFS
|
||||
#endif
|
||||
|
||||
@@ -216,8 +213,7 @@ static void nlua_luv_error_event(void **argv)
|
||||
xfree(error);
|
||||
}
|
||||
|
||||
static int nlua_luv_cfpcall(lua_State *lstate, int nargs, int nresult,
|
||||
int flags)
|
||||
static int nlua_luv_cfpcall(lua_State *lstate, int nargs, int nresult, int flags)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
int retval;
|
||||
@@ -300,8 +296,7 @@ static void dummy_timer_close_cb(TimeWatcher *tw, void *data)
|
||||
xfree(tw);
|
||||
}
|
||||
|
||||
static bool nlua_wait_condition(lua_State *lstate, int *status,
|
||||
bool *callback_result)
|
||||
static bool nlua_wait_condition(lua_State *lstate, int *status, bool *callback_result)
|
||||
{
|
||||
lua_pushvalue(lstate, 2);
|
||||
*status = lua_pcall(lstate, 0, 1, 0);
|
||||
@@ -336,9 +331,8 @@ static int nlua_wait(lua_State *lstate)
|
||||
}
|
||||
|
||||
if (!is_function) {
|
||||
lua_pushliteral(
|
||||
lstate,
|
||||
"vim.wait: if passed, condition must be a function");
|
||||
lua_pushliteral(lstate,
|
||||
"vim.wait: if passed, condition must be a function");
|
||||
return lua_error(lstate);
|
||||
}
|
||||
}
|
||||
@@ -365,23 +359,20 @@ static int nlua_wait(lua_State *lstate)
|
||||
time_watcher_init(&main_loop, tw, NULL);
|
||||
tw->events = loop_events;
|
||||
tw->blockable = true;
|
||||
time_watcher_start(
|
||||
tw,
|
||||
dummy_timer_due_cb,
|
||||
(uint64_t)interval,
|
||||
(uint64_t)interval);
|
||||
time_watcher_start(tw,
|
||||
dummy_timer_due_cb,
|
||||
(uint64_t)interval,
|
||||
(uint64_t)interval);
|
||||
|
||||
int pcall_status = 0;
|
||||
bool callback_result = false;
|
||||
|
||||
LOOP_PROCESS_EVENTS_UNTIL(
|
||||
&main_loop,
|
||||
loop_events,
|
||||
(int)timeout,
|
||||
is_function ? nlua_wait_condition(
|
||||
lstate,
|
||||
&pcall_status,
|
||||
&callback_result) : false || got_int);
|
||||
LOOP_PROCESS_EVENTS_UNTIL(&main_loop,
|
||||
loop_events,
|
||||
(int)timeout,
|
||||
is_function ? nlua_wait_condition(lstate,
|
||||
&pcall_status,
|
||||
&callback_result) : false || got_int);
|
||||
|
||||
// Stop dummy timer
|
||||
time_watcher_stop(tw);
|
||||
@@ -663,22 +654,19 @@ static void nlua_print_event(void **argv)
|
||||
const size_t start = i;
|
||||
while (i < len) {
|
||||
switch (str[i]) {
|
||||
case NUL: {
|
||||
str[i] = NL;
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
case NL: {
|
||||
// TODO(bfredl): use proper multiline msg? Probably should implement
|
||||
// print() in lua in terms of nvim_message(), when it is available.
|
||||
str[i] = NUL;
|
||||
i++;
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
case NUL:
|
||||
str[i] = NL;
|
||||
i++;
|
||||
continue;
|
||||
case NL:
|
||||
// TODO(bfredl): use proper multiline msg? Probably should implement
|
||||
// print() in lua in terms of nvim_message(), when it is available.
|
||||
str[i] = NUL;
|
||||
i++;
|
||||
break;
|
||||
default:
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -719,8 +707,7 @@ static int nlua_print(lua_State *const lstate)
|
||||
size_t len;
|
||||
const char *const s = lua_tolstring(lstate, -1, &len);
|
||||
if (s == NULL) {
|
||||
PRINT_ERROR(
|
||||
"<Unknown error: lua_tolstring returned NULL for tostring result>");
|
||||
PRINT_ERROR("<Unknown error: lua_tolstring returned NULL for tostring result>");
|
||||
}
|
||||
ga_concat_len(&msg_ga, s, len);
|
||||
if (curargidx < nargs) {
|
||||
@@ -893,7 +880,7 @@ static int nlua_rpc(lua_State *lstate, bool request)
|
||||
} else {
|
||||
if (!rpc_send_event(chan_id, name, args)) {
|
||||
api_set_error(&err, kErrorTypeValidation,
|
||||
"Invalid channel: %"PRIu64, chan_id);
|
||||
"Invalid channel: %" PRIu64, chan_id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1045,10 +1032,10 @@ LuaRef nlua_ref(lua_State *lstate, int index)
|
||||
if (ref > 0) {
|
||||
nlua_refcount++;
|
||||
#ifdef NLUA_TRACK_REFS
|
||||
if (nlua_track_refs) {
|
||||
// dummy allocation to make LeakSanitizer track our luarefs
|
||||
pmap_put(handle_T)(&nlua_ref_markers, ref, xmalloc(3));
|
||||
}
|
||||
if (nlua_track_refs) {
|
||||
// dummy allocation to make LeakSanitizer track our luarefs
|
||||
pmap_put(handle_T)(&nlua_ref_markers, ref, xmalloc(3));
|
||||
}
|
||||
#endif
|
||||
}
|
||||
return ref;
|
||||
@@ -1108,8 +1095,7 @@ LuaRef api_new_luaref(LuaRef original_ref)
|
||||
/// @param[out] ret_tv Location where result will be saved.
|
||||
///
|
||||
/// @return Result of the execution.
|
||||
void nlua_typval_eval(const String str, typval_T *const arg,
|
||||
typval_T *const ret_tv)
|
||||
void nlua_typval_eval(const String str, typval_T *const arg, typval_T *const ret_tv)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
#define EVALHEADER "local _A=select(1,...) return ("
|
||||
@@ -1131,8 +1117,8 @@ void nlua_typval_eval(const String str, typval_T *const arg,
|
||||
}
|
||||
}
|
||||
|
||||
void nlua_typval_call(const char *str, size_t len, typval_T *const args,
|
||||
int argcount, typval_T *ret_tv)
|
||||
void nlua_typval_call(const char *str, size_t len, typval_T *const args, int argcount,
|
||||
typval_T *ret_tv)
|
||||
FUNC_ATTR_NONNULL_ALL
|
||||
{
|
||||
#define CALLHEADER "return "
|
||||
@@ -1158,9 +1144,8 @@ void nlua_typval_call(const char *str, size_t len, typval_T *const args,
|
||||
}
|
||||
}
|
||||
|
||||
static void nlua_typval_exec(const char *lcmd, size_t lcmd_len,
|
||||
const char *name, typval_T *const args,
|
||||
int argcount, bool special, typval_T *ret_tv)
|
||||
static void nlua_typval_exec(const char *lcmd, size_t lcmd_len, const char *name,
|
||||
typval_T *const args, int argcount, bool special, typval_T *ret_tv)
|
||||
{
|
||||
if (check_secure()) {
|
||||
if (ret_tv) {
|
||||
@@ -1188,8 +1173,7 @@ static void nlua_typval_exec(const char *lcmd, size_t lcmd_len,
|
||||
}
|
||||
}
|
||||
|
||||
int nlua_source_using_linegetter(LineGetter fgetline,
|
||||
void *cookie, char *name)
|
||||
int nlua_source_using_linegetter(LineGetter fgetline, void *cookie, char *name)
|
||||
{
|
||||
const linenr_T save_sourcing_lnum = sourcing_lnum;
|
||||
const sctx_T save_current_sctx = current_sctx;
|
||||
@@ -1225,13 +1209,8 @@ int nlua_source_using_linegetter(LineGetter fgetline,
|
||||
/// @param[in] argcount Count of typval arguments
|
||||
/// @param[in] argvars Typval Arguments
|
||||
/// @param[out] rettv The return value from the called function.
|
||||
int typval_exec_lua_callable(
|
||||
lua_State *lstate,
|
||||
LuaCallable lua_cb,
|
||||
int argcount,
|
||||
typval_T *argvars,
|
||||
typval_T *rettv
|
||||
)
|
||||
int typval_exec_lua_callable(lua_State *lstate, LuaCallable lua_cb, int argcount, typval_T *argvars,
|
||||
typval_T *rettv)
|
||||
{
|
||||
LuaRef cb = lua_cb.func_ref;
|
||||
|
||||
@@ -1294,8 +1273,7 @@ Object nlua_exec(const String str, const Array args, Error *err)
|
||||
/// if false, discard return value
|
||||
/// @param err Error details, if any (if NULL, errors are echoed)
|
||||
/// @return Return value of function, if retval was set. Otherwise NIL.
|
||||
Object nlua_call_ref(LuaRef ref, const char *name, Array args,
|
||||
bool retval, Error *err)
|
||||
Object nlua_call_ref(LuaRef ref, const char *name, Array args, bool retval, Error *err)
|
||||
{
|
||||
lua_State *const lstate = global_lstate;
|
||||
nlua_pushref(lstate, ref);
|
||||
@@ -1502,10 +1480,7 @@ static void nlua_add_treesitter(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
|
||||
lua_setfield(lstate, -2, "_ts_get_language_version");
|
||||
}
|
||||
|
||||
int nlua_expand_pat(expand_T *xp,
|
||||
char_u *pat,
|
||||
int *num_results,
|
||||
char_u ***results)
|
||||
int nlua_expand_pat(expand_T *xp, char_u *pat, int *num_results, char_u ***results)
|
||||
{
|
||||
lua_State *const lstate = global_lstate;
|
||||
int ret = OK;
|
||||
@@ -1521,9 +1496,8 @@ int nlua_expand_pat(expand_T *xp,
|
||||
lua_pushlstring(lstate, (const char *)pat, STRLEN(pat));
|
||||
|
||||
if (lua_pcall(lstate, 1, 2, 0) != 0) {
|
||||
nlua_error(
|
||||
lstate,
|
||||
_("Error executing vim._expand_pat: %.*s"));
|
||||
nlua_error(lstate,
|
||||
_("Error executing vim._expand_pat: %.*s"));
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
@@ -1554,10 +1528,9 @@ int nlua_expand_pat(expand_T *xp,
|
||||
goto cleanup_array;
|
||||
}
|
||||
|
||||
GA_APPEND(
|
||||
char_u *,
|
||||
&result_array,
|
||||
vim_strsave((char_u *)v.data.string.data));
|
||||
GA_APPEND(char_u *,
|
||||
&result_array,
|
||||
vim_strsave((char_u *)v.data.string.data));
|
||||
}
|
||||
|
||||
xp->xp_pattern += prefix_len;
|
||||
@@ -1711,26 +1684,22 @@ static int regex_match_line(lua_State *lstate)
|
||||
|
||||
// Required functions for lua c functions as VimL callbacks
|
||||
|
||||
int nlua_CFunction_func_call(
|
||||
int argcount,
|
||||
typval_T *argvars,
|
||||
typval_T *rettv,
|
||||
void *state)
|
||||
int nlua_CFunction_func_call(int argcount, typval_T *argvars, typval_T *rettv, void *state)
|
||||
{
|
||||
lua_State *const lstate = global_lstate;
|
||||
LuaCFunctionState *funcstate = (LuaCFunctionState *)state;
|
||||
lua_State *const lstate = global_lstate;
|
||||
LuaCFunctionState *funcstate = (LuaCFunctionState *)state;
|
||||
|
||||
return typval_exec_lua_callable(lstate, funcstate->lua_callable,
|
||||
argcount, argvars, rettv);
|
||||
return typval_exec_lua_callable(lstate, funcstate->lua_callable,
|
||||
argcount, argvars, rettv);
|
||||
}
|
||||
|
||||
void nlua_CFunction_func_free(void *state)
|
||||
{
|
||||
lua_State *const lstate = global_lstate;
|
||||
LuaCFunctionState *funcstate = (LuaCFunctionState *)state;
|
||||
lua_State *const lstate = global_lstate;
|
||||
LuaCFunctionState *funcstate = (LuaCFunctionState *)state;
|
||||
|
||||
nlua_unref(lstate, funcstate->lua_callable.func_ref);
|
||||
xfree(funcstate);
|
||||
nlua_unref(lstate, funcstate->lua_callable.func_ref);
|
||||
xfree(funcstate);
|
||||
}
|
||||
|
||||
bool nlua_is_table_from_lua(typval_T *const arg)
|
||||
@@ -1813,9 +1782,8 @@ void nlua_execute_on_key(int c)
|
||||
lua_pushlstring(lstate, (const char *)buf, buf_len);
|
||||
|
||||
if (lua_pcall(lstate, 1, 0, 0)) {
|
||||
nlua_error(
|
||||
lstate,
|
||||
_("Error executing vim.on_key Lua callback: %.*s"));
|
||||
nlua_error(lstate,
|
||||
_("Error executing vim.on_key Lua callback: %.*s"));
|
||||
}
|
||||
|
||||
// [ vim ]
|
||||
|
@@ -5,22 +5,20 @@
|
||||
// NB: this file mostly contains a generic lua interface for tree-sitter
|
||||
// trees and nodes, and could be broken out as a reusable lua package
|
||||
|
||||
#include <assert.h>
|
||||
#include <inttypes.h>
|
||||
#include <lauxlib.h>
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
#include "tree_sitter/api.h"
|
||||
|
||||
#include "nvim/lua/treesitter.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/memline.h"
|
||||
#include "nvim/buffer.h"
|
||||
#include "nvim/lua/treesitter.h"
|
||||
#include "nvim/memline.h"
|
||||
#include "tree_sitter/api.h"
|
||||
|
||||
#define TS_META_PARSER "treesitter_parser"
|
||||
#define TS_META_TREE "treesitter_tree"
|
||||
@@ -179,12 +177,11 @@ int tslua_add_language(lua_State *L)
|
||||
uint32_t lang_version = ts_language_version(lang);
|
||||
if (lang_version < TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION
|
||||
|| lang_version > TREE_SITTER_LANGUAGE_VERSION) {
|
||||
return luaL_error(
|
||||
L,
|
||||
"ABI version mismatch for %s: supported between %d and %d, found %d",
|
||||
path,
|
||||
TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION,
|
||||
TREE_SITTER_LANGUAGE_VERSION, lang_version);
|
||||
return luaL_error(L,
|
||||
"ABI version mismatch for %s: supported between %d and %d, found %d",
|
||||
path,
|
||||
TREE_SITTER_MIN_COMPATIBLE_LANGUAGE_VERSION,
|
||||
TREE_SITTER_LANGUAGE_VERSION, lang_version);
|
||||
}
|
||||
|
||||
pmap_put(cstr_t)(&langs, xstrdup(lang_name), lang);
|
||||
@@ -285,8 +282,8 @@ static int parser_tostring(lua_State *L)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static const char *input_cb(void *payload, uint32_t byte_index,
|
||||
TSPoint position, uint32_t *bytes_read)
|
||||
static const char *input_cb(void *payload, uint32_t byte_index, TSPoint position,
|
||||
uint32_t *bytes_read)
|
||||
{
|
||||
buf_T *bp = payload;
|
||||
#define BUFSIZE 256
|
||||
@@ -318,9 +315,7 @@ static const char *input_cb(void *payload, uint32_t byte_index,
|
||||
#undef BUFSIZE
|
||||
}
|
||||
|
||||
static void push_ranges(lua_State *L,
|
||||
const TSRange *ranges,
|
||||
const unsigned int length)
|
||||
static void push_ranges(lua_State *L, const TSRange *ranges, const unsigned int length)
|
||||
{
|
||||
lua_createtable(L, length, 0);
|
||||
for (size_t i = 0; i < length; i++) {
|
||||
@@ -361,26 +356,26 @@ static int parser_parse(lua_State *L)
|
||||
// This switch is necessary because of the behavior of lua_isstring, that
|
||||
// consider numbers as strings...
|
||||
switch (lua_type(L, 3)) {
|
||||
case LUA_TSTRING:
|
||||
str = lua_tolstring(L, 3, &len);
|
||||
new_tree = ts_parser_parse_string(*p, old_tree, str, len);
|
||||
break;
|
||||
case LUA_TSTRING:
|
||||
str = lua_tolstring(L, 3, &len);
|
||||
new_tree = ts_parser_parse_string(*p, old_tree, str, len);
|
||||
break;
|
||||
|
||||
case LUA_TNUMBER:
|
||||
bufnr = lua_tointeger(L, 3);
|
||||
buf = handle_get_buffer(bufnr);
|
||||
case LUA_TNUMBER:
|
||||
bufnr = lua_tointeger(L, 3);
|
||||
buf = handle_get_buffer(bufnr);
|
||||
|
||||
if (!buf) {
|
||||
return luaL_error(L, "invalid buffer handle: %d", bufnr);
|
||||
}
|
||||
if (!buf) {
|
||||
return luaL_error(L, "invalid buffer handle: %d", bufnr);
|
||||
}
|
||||
|
||||
input = (TSInput){ (void *)buf, input_cb, TSInputEncodingUTF8 };
|
||||
new_tree = ts_parser_parse(*p, old_tree, input);
|
||||
input = (TSInput){ (void *)buf, input_cb, TSInputEncodingUTF8 };
|
||||
new_tree = ts_parser_parse(*p, old_tree, input);
|
||||
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
return luaL_error(L, "invalid argument to parser:parse()");
|
||||
default:
|
||||
return luaL_error(L, "invalid argument to parser:parse()");
|
||||
}
|
||||
|
||||
// Sometimes parsing fails (timeout, or wrong parser ABI)
|
||||
@@ -393,8 +388,7 @@ static int parser_parse(lua_State *L)
|
||||
// the lua GC.
|
||||
// Old tree is still owned by the lua GC.
|
||||
uint32_t n_ranges = 0;
|
||||
TSRange *changed = old_tree ? ts_tree_get_changed_ranges(
|
||||
old_tree, new_tree, &n_ranges) : NULL;
|
||||
TSRange *changed = old_tree ? ts_tree_get_changed_ranges(old_tree, new_tree, &n_ranges) : NULL;
|
||||
|
||||
push_tree(L, new_tree, false); // [tree]
|
||||
|
||||
@@ -504,17 +498,15 @@ static void range_from_lua(lua_State *L, TSRange *range)
|
||||
}
|
||||
return;
|
||||
error:
|
||||
luaL_error(
|
||||
L,
|
||||
"Ranges can only be made from 6 element long tables or nodes.");
|
||||
luaL_error(L,
|
||||
"Ranges can only be made from 6 element long tables or nodes.");
|
||||
}
|
||||
|
||||
static int parser_set_ranges(lua_State *L)
|
||||
{
|
||||
if (lua_gettop(L) < 2) {
|
||||
return luaL_error(
|
||||
L,
|
||||
"not enough args to parser:set_included_ranges()");
|
||||
return luaL_error(L,
|
||||
"not enough args to parser:set_included_ranges()");
|
||||
}
|
||||
|
||||
TSParser **p = parser_check(L, 1);
|
||||
@@ -523,9 +515,8 @@ static int parser_set_ranges(lua_State *L)
|
||||
}
|
||||
|
||||
if (!lua_istable(L, 2)) {
|
||||
return luaL_error(
|
||||
L,
|
||||
"argument for parser:set_included_ranges() should be a table.");
|
||||
return luaL_error(L,
|
||||
"argument for parser:set_included_ranges() should be a table.");
|
||||
}
|
||||
|
||||
size_t tbl_len = lua_objlen(L, 2);
|
||||
@@ -890,9 +881,9 @@ static int node_descendant_for_range(lua_State *L)
|
||||
return 0;
|
||||
}
|
||||
TSPoint start = { (uint32_t)lua_tointeger(L, 2),
|
||||
(uint32_t)lua_tointeger(L, 3) };
|
||||
(uint32_t)lua_tointeger(L, 3) };
|
||||
TSPoint end = { (uint32_t)lua_tointeger(L, 4),
|
||||
(uint32_t)lua_tointeger(L, 5) };
|
||||
(uint32_t)lua_tointeger(L, 5) };
|
||||
TSNode child = ts_node_descendant_for_point_range(node, start, end);
|
||||
|
||||
push_node(L, child, 1);
|
||||
@@ -906,9 +897,9 @@ static int node_named_descendant_for_range(lua_State *L)
|
||||
return 0;
|
||||
}
|
||||
TSPoint start = { (uint32_t)lua_tointeger(L, 2),
|
||||
(uint32_t)lua_tointeger(L, 3) };
|
||||
(uint32_t)lua_tointeger(L, 3) };
|
||||
TSPoint end = { (uint32_t)lua_tointeger(L, 4),
|
||||
(uint32_t)lua_tointeger(L, 5) };
|
||||
(uint32_t)lua_tointeger(L, 5) };
|
||||
TSNode child = ts_node_named_descendant_for_point_range(node, start, end);
|
||||
|
||||
push_node(L, child, 1);
|
||||
@@ -917,8 +908,7 @@ static int node_named_descendant_for_range(lua_State *L)
|
||||
|
||||
static int node_next_child(lua_State *L)
|
||||
{
|
||||
TSTreeCursor *ud = luaL_checkudata(
|
||||
L, lua_upvalueindex(1), TS_META_TREECURSOR);
|
||||
TSTreeCursor *ud = luaL_checkudata(L, lua_upvalueindex(1), TS_META_TREECURSOR);
|
||||
if (!ud) {
|
||||
return 0;
|
||||
}
|
||||
@@ -939,19 +929,18 @@ static int node_next_child(lua_State *L)
|
||||
|
||||
if (ts_tree_cursor_goto_next_sibling(ud)) {
|
||||
push:
|
||||
push_node(
|
||||
L,
|
||||
ts_tree_cursor_current_node(ud),
|
||||
lua_upvalueindex(2)); // [node]
|
||||
push_node(L,
|
||||
ts_tree_cursor_current_node(ud),
|
||||
lua_upvalueindex(2)); // [node]
|
||||
|
||||
const char * field = ts_tree_cursor_current_field_name(ud);
|
||||
const char * field = ts_tree_cursor_current_field_name(ud);
|
||||
|
||||
if (field != NULL) {
|
||||
lua_pushstring(L, ts_tree_cursor_current_field_name(ud));
|
||||
} else {
|
||||
lua_pushnil(L);
|
||||
} // [node, field_name_or_nil]
|
||||
return 2;
|
||||
if (field != NULL) {
|
||||
lua_pushstring(L, ts_tree_cursor_current_field_name(ud));
|
||||
} else {
|
||||
lua_pushnil(L);
|
||||
} // [node, field_name_or_nil]
|
||||
return 2;
|
||||
}
|
||||
|
||||
end:
|
||||
@@ -1200,11 +1189,16 @@ int tslua_parse_query(lua_State *L)
|
||||
|
||||
static const char *query_err_string(TSQueryError err) {
|
||||
switch (err) {
|
||||
case TSQueryErrorSyntax: return "invalid syntax";
|
||||
case TSQueryErrorNodeType: return "invalid node type";
|
||||
case TSQueryErrorField: return "invalid field";
|
||||
case TSQueryErrorCapture: return "invalid capture";
|
||||
default: return "error";
|
||||
case TSQueryErrorSyntax:
|
||||
return "invalid syntax";
|
||||
case TSQueryErrorNodeType:
|
||||
return "invalid node type";
|
||||
case TSQueryErrorField:
|
||||
return "invalid field";
|
||||
case TSQueryErrorCapture:
|
||||
return "invalid capture";
|
||||
default:
|
||||
return "error";
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,18 +1,17 @@
|
||||
#include <errno.h>
|
||||
#include <lauxlib.h>
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "nvim/vim.h"
|
||||
#include "xdiff/xdiff.h"
|
||||
#include "nvim/lua/xdiff.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/lua/converter.h"
|
||||
#include "nvim/lua/executor.h"
|
||||
#include "nvim/api/private/helpers.h"
|
||||
#include "nvim/lua/xdiff.h"
|
||||
#include "nvim/vim.h"
|
||||
#include "xdiff/xdiff.h"
|
||||
|
||||
typedef enum {
|
||||
kNluaXdiffModeUnified = 0,
|
||||
@@ -22,7 +21,7 @@ typedef enum {
|
||||
|
||||
typedef struct {
|
||||
lua_State *lstate;
|
||||
Error *err;
|
||||
Error *err;
|
||||
} hunkpriv_t;
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
@@ -48,8 +47,7 @@ static int write_string(void *priv, mmbuffer_t *mb, int nbuf)
|
||||
}
|
||||
|
||||
// hunk_func callback used when opts.hunk_lines = true
|
||||
static int hunk_locations_cb(long start_a, long count_a,
|
||||
long start_b, long count_b, void *cb_data)
|
||||
static int hunk_locations_cb(long start_a, long count_a, long start_b, long count_b, void *cb_data)
|
||||
{
|
||||
// Mimic extra offsets done by xdiff, see:
|
||||
// src/nvim/xdiff/xemit.c:284
|
||||
@@ -79,8 +77,7 @@ static int hunk_locations_cb(long start_a, long count_a,
|
||||
}
|
||||
|
||||
// hunk_func callback used when opts.on_hunk is given
|
||||
static int call_on_hunk_cb(long start_a, long count_a,
|
||||
long start_b, long count_b, void *cb_data)
|
||||
static int call_on_hunk_cb(long start_a, long count_a, long start_b, long count_b, void *cb_data)
|
||||
{
|
||||
// Mimic extra offsets done by xdiff, see:
|
||||
// src/nvim/xdiff/xemit.c:284
|
||||
@@ -130,8 +127,7 @@ static mmfile_t get_string_arg(lua_State *lstate, int idx)
|
||||
}
|
||||
|
||||
// Helper function for validating option types
|
||||
static bool check_xdiff_opt(ObjectType actType, ObjectType expType,
|
||||
const char *name, Error *err)
|
||||
static bool check_xdiff_opt(ObjectType actType, ObjectType expType, const char *name, Error *err)
|
||||
{
|
||||
if (actType != expType) {
|
||||
const char * type_str =
|
||||
@@ -139,7 +135,7 @@ static bool check_xdiff_opt(ObjectType actType, ObjectType expType,
|
||||
expType == kObjectTypeInteger ? "integer" :
|
||||
expType == kObjectTypeBoolean ? "boolean" :
|
||||
expType == kObjectTypeLuaRef ? "function" :
|
||||
"NA";
|
||||
"NA";
|
||||
|
||||
api_set_error(err, kErrorTypeValidation, "%s is not a %s", name,
|
||||
type_str);
|
||||
@@ -149,9 +145,8 @@ static bool check_xdiff_opt(ObjectType actType, ObjectType expType,
|
||||
return false;
|
||||
}
|
||||
|
||||
static NluaXdiffMode process_xdl_diff_opts(lua_State *lstate,
|
||||
xdemitconf_t *cfg,
|
||||
xpparam_t *params, Error *err)
|
||||
static NluaXdiffMode process_xdl_diff_opts(lua_State *lstate, xdemitconf_t *cfg, xpparam_t *params,
|
||||
Error *err)
|
||||
{
|
||||
const DictionaryOf(LuaRef) opts = nlua_pop_Dictionary(lstate, true, err);
|
||||
|
||||
@@ -211,13 +206,13 @@ static NluaXdiffMode process_xdl_diff_opts(lua_State *lstate,
|
||||
const char *name;
|
||||
unsigned long value;
|
||||
} flags[] = {
|
||||
{ "ignore_whitespace" , XDF_IGNORE_WHITESPACE },
|
||||
{ "ignore_whitespace_change" , XDF_IGNORE_WHITESPACE_CHANGE },
|
||||
{ "ignore_whitespace", XDF_IGNORE_WHITESPACE },
|
||||
{ "ignore_whitespace_change", XDF_IGNORE_WHITESPACE_CHANGE },
|
||||
{ "ignore_whitespace_change_at_eol", XDF_IGNORE_WHITESPACE_AT_EOL },
|
||||
{ "ignore_cr_at_eol" , XDF_IGNORE_CR_AT_EOL },
|
||||
{ "ignore_blank_lines" , XDF_IGNORE_BLANK_LINES },
|
||||
{ "indent_heuristic" , XDF_INDENT_HEURISTIC },
|
||||
{ NULL , 0 },
|
||||
{ "ignore_cr_at_eol", XDF_IGNORE_CR_AT_EOL },
|
||||
{ "ignore_blank_lines", XDF_IGNORE_BLANK_LINES },
|
||||
{ "indent_heuristic", XDF_INDENT_HEURISTIC },
|
||||
{ NULL, 0 },
|
||||
};
|
||||
bool key_used = false;
|
||||
for (size_t j = 0; flags[j].name; j++) {
|
||||
@@ -270,9 +265,9 @@ int nlua_xdl_diff(lua_State *lstate)
|
||||
xpparam_t params;
|
||||
xdemitcb_t ecb;
|
||||
|
||||
memset(&cfg , 0, sizeof(cfg));
|
||||
memset(&cfg, 0, sizeof(cfg));
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
memset(&ecb , 0, sizeof(ecb));
|
||||
memset(&ecb, 0, sizeof(ecb));
|
||||
|
||||
NluaXdiffMode mode = kNluaXdiffModeUnified;
|
||||
|
||||
@@ -291,21 +286,21 @@ int nlua_xdl_diff(lua_State *lstate)
|
||||
luaL_Buffer buf;
|
||||
hunkpriv_t *priv = NULL;
|
||||
switch (mode) {
|
||||
case kNluaXdiffModeUnified:
|
||||
luaL_buffinit(lstate, &buf);
|
||||
ecb.priv = &buf;
|
||||
ecb.out_line = write_string;
|
||||
break;
|
||||
case kNluaXdiffModeOnHunkCB:
|
||||
priv = xmalloc(sizeof(*priv));
|
||||
priv->lstate = lstate;
|
||||
priv->err = &err;
|
||||
ecb.priv = priv;
|
||||
break;
|
||||
case kNluaXdiffModeLocations:
|
||||
lua_createtable(lstate, 0, 0);
|
||||
ecb.priv = lstate;
|
||||
break;
|
||||
case kNluaXdiffModeUnified:
|
||||
luaL_buffinit(lstate, &buf);
|
||||
ecb.priv = &buf;
|
||||
ecb.out_line = write_string;
|
||||
break;
|
||||
case kNluaXdiffModeOnHunkCB:
|
||||
priv = xmalloc(sizeof(*priv));
|
||||
priv->lstate = lstate;
|
||||
priv->err = &err;
|
||||
ecb.priv = priv;
|
||||
break;
|
||||
case kNluaXdiffModeLocations:
|
||||
lua_createtable(lstate, 0, 0);
|
||||
ecb.priv = lstate;
|
||||
break;
|
||||
}
|
||||
|
||||
if (xdl_diff(&ma, &mb, ¶ms, &cfg, &ecb) == -1) {
|
||||
|
Reference in New Issue
Block a user