mirror of
https://github.com/neovim/neovim.git
synced 2025-09-29 06:28:35 +00:00
lua: metatable for empty dict value
This commit is contained in:
@@ -156,6 +156,13 @@ static LuaTableProps nlua_traverse_table(lua_State *const lstate)
|
||||
&& other_keys_num == 0
|
||||
&& ret.string_keys_num == 0)) {
|
||||
ret.type = kObjectTypeArray;
|
||||
if (tsize == 0 && lua_getmetatable(lstate, -1)) {
|
||||
nlua_pushref(lstate, nlua_empty_dict_ref);
|
||||
if (lua_rawequal(lstate, -2, -1)) {
|
||||
ret.type = kObjectTypeDictionary;
|
||||
}
|
||||
lua_pop(lstate, 2);
|
||||
}
|
||||
} else if (ret.string_keys_num == tsize) {
|
||||
ret.type = kObjectTypeDictionary;
|
||||
} else {
|
||||
@@ -465,6 +472,8 @@ static bool typval_conv_special = false;
|
||||
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)
|
||||
|
||||
@@ -695,6 +704,10 @@ void nlua_push_Dictionary(lua_State *lstate, const Dictionary dict,
|
||||
nlua_create_typed_table(lstate, 0, 0, kObjectTypeDictionary);
|
||||
} else {
|
||||
lua_createtable(lstate, 0, (int)dict.size);
|
||||
if (dict.size == 0 && !special) {
|
||||
nlua_pushref(lstate, nlua_empty_dict_ref);
|
||||
lua_setmetatable(lstate, -2);
|
||||
}
|
||||
}
|
||||
for (size_t i = 0; i < dict.size; i++) {
|
||||
nlua_push_String(lstate, dict.items[i].key, special);
|
||||
|
@@ -324,6 +324,13 @@ static int nlua_state_init(lua_State *const lstate) FUNC_ATTR_NONNULL_ALL
|
||||
nlua_nil_ref = nlua_ref(lstate, -1);
|
||||
lua_setfield(lstate, -2, "NIL");
|
||||
|
||||
// vim._empty_dict_mt
|
||||
lua_createtable(lstate, 0, 0);
|
||||
lua_pushcfunction(lstate, &nlua_empty_dict_tostring);
|
||||
lua_setfield(lstate, -2, "__tostring");
|
||||
nlua_empty_dict_ref = nlua_ref(lstate, -1);
|
||||
lua_setfield(lstate, -2, "_empty_dict_mt");
|
||||
|
||||
// internal vim._treesitter... API
|
||||
nlua_add_treesitter(lstate);
|
||||
|
||||
@@ -665,6 +672,12 @@ static int nlua_nil_tostring(lua_State *lstate)
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int nlua_empty_dict_tostring(lua_State *lstate)
|
||||
{
|
||||
lua_pushstring(lstate, "vim.empty_dict()");
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
#ifdef WIN32
|
||||
/// os.getenv: override os.getenv to maintain coherency. #9681
|
||||
|
@@ -13,6 +13,7 @@
|
||||
void nlua_add_api_functions(lua_State *lstate) REAL_FATTR_NONNULL_ALL;
|
||||
|
||||
EXTERN LuaRef nlua_nil_ref INIT(= LUA_NOREF);
|
||||
EXTERN LuaRef nlua_empty_dict_ref INIT(= LUA_NOREF);
|
||||
|
||||
#define set_api_error(s, err) \
|
||||
do { \
|
||||
|
@@ -243,6 +243,10 @@ function vim.schedule_wrap(cb)
|
||||
end)
|
||||
end
|
||||
|
||||
function vim.empty_dict()
|
||||
return setmetatable({}, vim._empty_dict_mt)
|
||||
end
|
||||
|
||||
-- vim.fn.{func}(...)
|
||||
vim.fn = setmetatable({}, {
|
||||
__index = function(t, key)
|
||||
|
Reference in New Issue
Block a user