aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordemiurg337 <dmitro.gedz@gmail.com>2019-03-07 14:37:46 +0200
committerJustin M. Keyes <justinkz@gmail.com>2019-03-14 00:38:56 +0100
commit9d207fd876170d1b7123604cd37ed8745115f00e (patch)
tree9ae4a5b937ec9457ad8058d1139503b9dfce0a1a
parent7fcf2f926fc6baf43d17ba47cb89d02c0ddc4329 (diff)
downloadrneovim-9d207fd876170d1b7123604cd37ed8745115f00e.tar.gz
rneovim-9d207fd876170d1b7123604cd37ed8745115f00e.tar.bz2
rneovim-9d207fd876170d1b7123604cd37ed8745115f00e.zip
dictwatcheradd(): support b:changedtick #9693
fixes #6635 closes #9693
-rw-r--r--src/nvim/buffer.h9
-rw-r--r--test/functional/ex_cmds/dict_notifications_spec.lua21
2 files changed, 29 insertions, 1 deletions
diff --git a/src/nvim/buffer.h b/src/nvim/buffer.h
index 64c906fc96..ee3fda5f6d 100644
--- a/src/nvim/buffer.h
+++ b/src/nvim/buffer.h
@@ -74,6 +74,8 @@ static inline void buf_set_changedtick(buf_T *const buf,
static inline void buf_set_changedtick(buf_T *const buf,
const varnumber_T changedtick)
{
+ typval_T old_val = buf->changedtick_di.di_tv;
+
#ifndef NDEBUG
dictitem_T *const changedtick_di = tv_dict_find(
buf->b_vars, S_LEN("changedtick"));
@@ -87,6 +89,13 @@ static inline void buf_set_changedtick(buf_T *const buf,
assert(changedtick_di == (dictitem_T *)&buf->changedtick_di);
#endif
buf->changedtick_di.di_tv.vval.v_number = changedtick;
+
+ if (tv_dict_is_watched(buf->b_vars)) {
+ tv_dict_watcher_notify(buf->b_vars,
+ (char *)buf->changedtick_di.di_key,
+ &buf->changedtick_di.di_tv,
+ &old_val);
+ }
}
static inline varnumber_T buf_get_changedtick(const buf_T *const buf)
diff --git a/test/functional/ex_cmds/dict_notifications_spec.lua b/test/functional/ex_cmds/dict_notifications_spec.lua
index 3d550588e7..48e7e05e4c 100644
--- a/test/functional/ex_cmds/dict_notifications_spec.lua
+++ b/test/functional/ex_cmds/dict_notifications_spec.lua
@@ -1,12 +1,13 @@
local helpers = require('test.functional.helpers')(after_each)
local clear, nvim, source = helpers.clear, helpers.nvim, helpers.source
+local insert = helpers.insert
local eq, next_msg = helpers.eq, helpers.next_msg
local exc_exec = helpers.exc_exec
local command = helpers.command
local eval = helpers.eval
-describe('dictionary change notifications', function()
+describe('VimL dictionary notifications', function()
local channel
before_each(function()
@@ -338,4 +339,22 @@ describe('dictionary change notifications', function()
eq({'notification', '2', {'foo', {old = 'baz', new = 'bar'}}}, next_msg())
end)
end)
+
+ it('for b:changedtick', function()
+ source([[
+ function! OnTickChanged(dict, key, value)
+ call rpcnotify(g:channel, 'SendChangeTick', a:key, a:value)
+ endfunction
+ call dictwatcheradd(b:, 'changedtick', 'OnTickChanged')
+ ]])
+
+ insert('t');
+ eq({'notification', 'SendChangeTick', {'changedtick', {old = 2, new = 3}}},
+ next_msg())
+
+ command([[call dictwatcherdel(b:, 'changedtick', 'OnTickChanged')]])
+ insert('t');
+ eq(2, eval('1+1')) -- Still alive?
+ end)
+
end)