diff options
Diffstat (limited to 'src/nvim/lua')
-rw-r--r-- | src/nvim/lua/converter.c | 730 | ||||
-rw-r--r-- | src/nvim/lua/executor.c | 206 | ||||
-rw-r--r-- | src/nvim/lua/treesitter.c | 132 | ||||
-rw-r--r-- | src/nvim/lua/xdiff.c | 79 |
4 files changed, 537 insertions, 610 deletions
diff --git a/src/nvim/lua/converter.c b/src/nvim/lua/converter.c index 0adbbdb953..07c53299fa 100644 --- a/src/nvim/lua/converter.c +++ b/src/nvim/lua/converter.c @@ -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; + 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); } - 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); + 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; - } + 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); + 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; - 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(); + 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); } -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); + case kObjectTypeFloat: + cur.tv->v_type = VAR_FLOAT; + cur.tv->vval.v_float = (float_T)table_props.val; 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; - } + 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(); } - default: { +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; } + 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_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_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_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 kObjectTypeNil: + api_set_error(err, kErrorTypeValidation, + "Cannot convert given lua table"); break; + default: + abort(); } + 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; + case LUA_TFUNCTION: + if (ref) { + *cur.obj = LUAREF_OBJ(nlua_ref(lstate, -1)); + } else { + goto type_error; } + break; - default: { -type_error: + 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 given lua type"); - break; + "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) diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c index ce5bfabd9f..8c7dc90111 100644 --- a/src/nvim/lua/executor.c +++ b/src/nvim/lua/executor.c @@ -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 ] diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c index ed475c324f..e19274ced9 100644 --- a/src/nvim/lua/treesitter.c +++ b/src/nvim/lua/treesitter.c @@ -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 <stdbool.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> #include <assert.h> - +#include <inttypes.h> +#include <lauxlib.h> #include <lua.h> #include <lualib.h> -#include <lauxlib.h> - -#include "tree_sitter/api.h" +#include <stdbool.h> +#include <stdlib.h> +#include <string.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"; } } diff --git a/src/nvim/lua/xdiff.c b/src/nvim/lua/xdiff.c index ae0ea00765..dc2675a1fe 100644 --- a/src/nvim/lua/xdiff.c +++ b/src/nvim/lua/xdiff.c @@ -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) { |