mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
API: Refactor vim_{get,set}_var
- Change in dict_set_value: Passing 'nil' as value will delete the variable. - Change in dict_get_value: Removed 'pop' parameter, now values can be popped by passing 'nil' to dict_set_value - Update {buffer,window,tabpage}_get_var to reflect the changes
This commit is contained in:
parent
40c82ed7cd
commit
5d0cb370f6
@ -231,7 +231,7 @@ Object buffer_get_var(Buffer buffer, String name, Error *err)
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
return dict_get_value(buf->b_vars, name, false, err);
|
return dict_get_value(buf->b_vars, name, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object buffer_set_var(Buffer buffer, String name, Object value, Error *err)
|
Object buffer_set_var(Buffer buffer, String name, Object value, Error *err)
|
||||||
|
@ -78,7 +78,7 @@ void buffer_set_slice(Buffer buffer,
|
|||||||
/// @return The variable value
|
/// @return The variable value
|
||||||
Object buffer_get_var(Buffer buffer, String name, Error *err);
|
Object buffer_get_var(Buffer buffer, String name, Error *err);
|
||||||
|
|
||||||
/// Sets a buffer variable
|
/// Sets a buffer variable. Passing 'nil' as value deletes the variable.
|
||||||
///
|
///
|
||||||
/// @param buffer The buffer handle
|
/// @param buffer The buffer handle
|
||||||
/// @param name The variable name
|
/// @param name The variable name
|
||||||
|
@ -82,7 +82,7 @@ bool try_end(Error *err)
|
|||||||
return err->set;
|
return err->set;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object dict_get_value(dict_T *dict, String key, bool pop, Error *err)
|
Object dict_get_value(dict_T *dict, String key, Error *err)
|
||||||
{
|
{
|
||||||
Object rv;
|
Object rv;
|
||||||
hashitem_T *hi;
|
hashitem_T *hi;
|
||||||
@ -99,16 +99,6 @@ Object dict_get_value(dict_T *dict, String key, bool pop, Error *err)
|
|||||||
di = dict_lookup(hi);
|
di = dict_lookup(hi);
|
||||||
rv = vim_to_object(&di->di_tv);
|
rv = vim_to_object(&di->di_tv);
|
||||||
|
|
||||||
if (pop) {
|
|
||||||
if (dict->dv_lock) {
|
|
||||||
set_api_error("Dictionary is locked", err);
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
hash_remove(&dict->dv_hashtab, hi);
|
|
||||||
dictitem_free(di);
|
|
||||||
}
|
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,24 +117,45 @@ Object dict_set_value(dict_T *dict, String key, Object value, Error *err)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dictitem_T *di = dict_find(dict, (uint8_t *)key.data, key.size);
|
dictitem_T *di = dict_find(dict, (uint8_t *)key.data, key.size);
|
||||||
typval_T tv;
|
|
||||||
|
|
||||||
if (!object_to_vim(value, &tv, err)) {
|
if (value.type == kObjectTypeNil) {
|
||||||
return rv;
|
// Delete the key
|
||||||
}
|
if (di == NULL) {
|
||||||
|
// Doesn't exist, fail
|
||||||
if (di == NULL) {
|
set_api_error("Key doesn't exist", err);
|
||||||
char *k = xstrndup(key.data, key.size);
|
} else {
|
||||||
di = dictitem_alloc((uint8_t *)k);
|
// Return the old value
|
||||||
free(k);
|
rv = vim_to_object(&di->di_tv);
|
||||||
dict_add(dict, di);
|
// Delete the entry
|
||||||
|
hashitem_T *hi = hash_find(&dict->dv_hashtab, di->di_key);
|
||||||
|
hash_remove(&dict->dv_hashtab, hi);
|
||||||
|
dictitem_free(di);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
rv = vim_to_object(&di->di_tv);
|
// Update the key
|
||||||
clear_tv(&di->di_tv);
|
typval_T tv;
|
||||||
}
|
|
||||||
|
|
||||||
copy_tv(&tv, &di->di_tv);
|
// Convert the object to a vimscript type in the temporary variable
|
||||||
clear_tv(&tv);
|
if (!object_to_vim(value, &tv, err)) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (di == NULL) {
|
||||||
|
// Need to create an entry
|
||||||
|
char *k = xstrndup(key.data, key.size);
|
||||||
|
di = dictitem_alloc((uint8_t *)k);
|
||||||
|
free(k);
|
||||||
|
dict_add(dict, di);
|
||||||
|
} else {
|
||||||
|
// Return the old value
|
||||||
|
clear_tv(&di->di_tv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the value
|
||||||
|
copy_tv(&tv, &di->di_tv);
|
||||||
|
// Clear the temporary variable
|
||||||
|
clear_tv(&tv);
|
||||||
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
@ -26,12 +26,11 @@ bool try_end(Error *err);
|
|||||||
///
|
///
|
||||||
/// @param dict The vimscript dict
|
/// @param dict The vimscript dict
|
||||||
/// @param key The key
|
/// @param key The key
|
||||||
/// @param bool If true it will pop the value from the dict
|
|
||||||
/// @param[out] err Details of an error that may have occurred
|
/// @param[out] err Details of an error that may have occurred
|
||||||
Object dict_get_value(dict_T *dict, String key, bool pop, Error *err);
|
Object dict_get_value(dict_T *dict, String key, Error *err);
|
||||||
|
|
||||||
/// Set a value in a dict. Objects are recursively expanded into their
|
/// Set a value in a dict. Objects are recursively expanded into their
|
||||||
/// vimscript equivalents.
|
/// vimscript equivalents. Passing 'nil' as value deletes the key.
|
||||||
///
|
///
|
||||||
/// @param dict The vimscript dict
|
/// @param dict The vimscript dict
|
||||||
/// @param key The key
|
/// @param key The key
|
||||||
|
@ -38,7 +38,7 @@ Object tabpage_get_var(Tabpage tabpage, String name, Error *err)
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
return dict_get_value(tab->tp_vars, name, false, err);
|
return dict_get_value(tab->tp_vars, name, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object tabpage_set_var(Tabpage tabpage, String name, Object value, Error *err)
|
Object tabpage_set_var(Tabpage tabpage, String name, Object value, Error *err)
|
||||||
|
@ -21,7 +21,7 @@ int64_t tabpage_get_window_count(Tabpage tabpage, Error *err);
|
|||||||
/// @return The variable value
|
/// @return The variable value
|
||||||
Object tabpage_get_var(Tabpage tabpage, String name, Error *err);
|
Object tabpage_get_var(Tabpage tabpage, String name, Error *err);
|
||||||
|
|
||||||
/// Sets a tabpage variable
|
/// Sets a tabpage variable. Passing 'nil' as value deletes the variable.
|
||||||
///
|
///
|
||||||
/// @param tabpage handle
|
/// @param tabpage handle
|
||||||
/// @param name The variable name
|
/// @param name The variable name
|
||||||
|
@ -142,11 +142,9 @@ void vim_del_current_line(Error *err)
|
|||||||
buffer_del_line(curbuf->b_fnum, curwin->w_cursor.lnum - 1, err);
|
buffer_del_line(curbuf->b_fnum, curwin->w_cursor.lnum - 1, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object vim_get_var(bool special, String name, bool pop, Error *err)
|
Object vim_get_var(String name, Error *err)
|
||||||
{
|
{
|
||||||
return dict_get_value(special ? &vimvardict : &globvardict, name,
|
return dict_get_value(&globvardict, name, err);
|
||||||
special ? false : pop,
|
|
||||||
err);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Object vim_set_var(String name, Object value, Error *err)
|
Object vim_set_var(String name, Object value, Error *err)
|
||||||
|
@ -61,15 +61,14 @@ void vim_del_current_line(Error *err);
|
|||||||
/// @param[out] err Details of an error that may have occurred
|
/// @param[out] err Details of an error that may have occurred
|
||||||
void vim_set_current_line(String line, Error *err);
|
void vim_set_current_line(String line, Error *err);
|
||||||
|
|
||||||
/// Gets a global or special variable
|
/// Gets a global variable
|
||||||
///
|
///
|
||||||
/// @param special If it's a special(:v) variable
|
|
||||||
/// @param name The variable name
|
/// @param name The variable name
|
||||||
/// @param[out] err Details of an error that may have occurred
|
/// @param[out] err Details of an error that may have occurred
|
||||||
/// @return The variable value
|
/// @return The variable value
|
||||||
Object vim_get_var(bool special, String name, bool pop, Error *err);
|
Object vim_get_var(String name, Error *err);
|
||||||
|
|
||||||
/// Sets a global variable
|
/// Sets a global variable. Passing 'nil' as value deletes the variable.
|
||||||
///
|
///
|
||||||
/// @param name The variable name
|
/// @param name The variable name
|
||||||
/// @param value The variable value
|
/// @param value The variable value
|
||||||
|
@ -119,7 +119,7 @@ Object window_get_var(Window window, String name, Error *err)
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
return dict_get_value(win->w_vars, name, false, err);
|
return dict_get_value(win->w_vars, name, err);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object window_set_var(Window window, String name, Object value, Error *err)
|
Object window_set_var(Window window, String name, Object value, Error *err)
|
||||||
|
@ -65,7 +65,7 @@ void window_set_width(Window window, int64_t width, Error *err);
|
|||||||
/// @return The variable value
|
/// @return The variable value
|
||||||
Object window_get_var(Window window, String name, Error *err);
|
Object window_get_var(Window window, String name, Error *err);
|
||||||
|
|
||||||
/// Sets a window variable
|
/// Sets a window variable. Passing 'nil' as value deletes the variable.
|
||||||
///
|
///
|
||||||
/// @param window The window handle
|
/// @param window The window handle
|
||||||
/// @param name The variable name
|
/// @param name The variable name
|
||||||
|
Loading…
Reference in New Issue
Block a user