diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2021-02-07 07:32:19 +0100 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2021-02-10 18:58:46 +0100 |
commit | 94622ca66b553018c19fbbb615f2e1fee0a8074a (patch) | |
tree | ed6e5bab2647e1580490d5c4ada4560dbde7eedd /src/nvim/buffer_updates.c | |
parent | fa5f583981276cb3767f74bec553cfa90e47a74e (diff) | |
download | rneovim-94622ca66b553018c19fbbb615f2e1fee0a8074a.tar.gz rneovim-94622ca66b553018c19fbbb615f2e1fee0a8074a.tar.bz2 rneovim-94622ca66b553018c19fbbb615f2e1fee0a8074a.zip |
buffer updates: add on_reload callback and handle it in treesitter parser
Diffstat (limited to 'src/nvim/buffer_updates.c')
-rw-r--r-- | src/nvim/buffer_updates.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c index 68e123896b..97562eace6 100644 --- a/src/nvim/buffer_updates.c +++ b/src/nvim/buffer_updates.c @@ -135,7 +135,7 @@ void buf_updates_unregister(buf_T *buf, uint64_t channelid) } } -void buf_updates_unregister_all(buf_T *buf) +void buf_updates_unload(buf_T *buf, bool can_reload) { size_t size = kv_size(buf->update_channels); if (size) { @@ -146,9 +146,20 @@ void buf_updates_unregister_all(buf_T *buf) kv_init(buf->update_channels); } + size_t j = 0; for (size_t i = 0; i < kv_size(buf->update_callbacks); i++) { BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i); - if (cb.on_detach != LUA_NOREF) { + LuaRef thecb = LUA_NOREF; + + bool keep = false; + if (can_reload && cb.on_reload != LUA_NOREF) { + keep = true; + thecb = cb.on_reload; + } else if (cb.on_detach != LUA_NOREF) { + thecb = cb.on_detach; + } + + if (thecb != LUA_NOREF) { Array args = ARRAY_DICT_INIT; Object items[1]; args.size = 1; @@ -158,15 +169,24 @@ void buf_updates_unregister_all(buf_T *buf) args.items[0] = BUFFER_OBJ(buf->handle); textlock++; - nlua_call_ref(cb.on_detach, "detach", args, false, NULL); + nlua_call_ref(thecb, keep ? "reload" : "detach", args, false, NULL); textlock--; } - free_update_callbacks(cb); + + if (keep) { + kv_A(buf->update_callbacks, j++) = kv_A(buf->update_callbacks, i); + } else { + free_update_callbacks(cb); + } + } + kv_size(buf->update_callbacks) = j; + if (kv_size(buf->update_callbacks) == 0) { + kv_destroy(buf->update_callbacks); + kv_init(buf->update_callbacks); } - kv_destroy(buf->update_callbacks); - kv_init(buf->update_callbacks); } + void buf_updates_send_changes(buf_T *buf, linenr_T firstline, int64_t num_added, |