fix(api): revert unintended change of optional bool params

Currently (as of nvim 0.9), the behavior of boolean params in
vim.api lua wrappers is inconsistent for optional parameters
(part of an `opts` dict) compared to positional parameters.

This was inadvertently changed in #24524 . While cleaning up this
inconsistency is something we might want eventually, it needs
to be discussed separately and the impact of existing code considered.
This commit is contained in:
bfredl
2023-08-09 20:25:16 +02:00
parent 68f12e7fcb
commit dbcba26bf1
2 changed files with 58 additions and 1 deletions

View File

@@ -849,6 +849,9 @@ Integer nlua_pop_Integer(lua_State *lstate, Error *err)
/// Convert lua value to boolean
///
/// Despite the name of the function, this uses lua semantics for booleans.
/// thus `err` is never set as any lua value can be co-erced into a lua bool
///
/// Always pops one value from the stack.
Boolean nlua_pop_Boolean(lua_State *lstate, Error *err)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
@@ -858,6 +861,36 @@ Boolean nlua_pop_Boolean(lua_State *lstate, Error *err)
return ret;
}
/// Convert lua value to boolean
///
/// This follows API conventions for a Boolean value, compare api_object_to_bool
///
/// Always pops one value from the stack.
Boolean nlua_pop_Boolean_strict(lua_State *lstate, Error *err)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{
Boolean ret = false;
switch (lua_type(lstate, -1)) {
case LUA_TBOOLEAN:
ret = lua_toboolean(lstate, -1);
break;
case LUA_TNUMBER:
ret = (lua_tonumber(lstate, -1) != 0);
break;
case LUA_TNIL:
ret = false;
break;
default:
api_set_error(err, kErrorTypeValidation, "not a boolean");
}
lua_pop(lstate, 1);
return ret;
}
/// Check whether typed table on top of the stack has given type
///
/// @param[in] lstate Lua state.
@@ -1318,7 +1351,7 @@ void nlua_pop_keydict(lua_State *L, void *retval, FieldHashfn hashy, char **err_
} else if (field->type == kObjectTypeInteger) {
*(Integer *)mem = nlua_pop_Integer(L, err);
} else if (field->type == kObjectTypeBoolean) {
*(Boolean *)mem = nlua_pop_Boolean(L, err);
*(Boolean *)mem = nlua_pop_Boolean_strict(L, err);
} else if (field->type == kObjectTypeString) {
*(String *)mem = nlua_pop_String(L, err);
} else if (field->type == kObjectTypeFloat) {