diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-08-04 12:37:05 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2019-08-04 13:23:46 +0200 |
commit | 2141dc22625f73f3ce73460e581934b94f141cf9 (patch) | |
tree | 71167260e69f87566391af2b1a8924987e6fe1d7 | |
parent | e952b7fc2f9838441308d1f71b98f108ae5faa8a (diff) | |
download | rneovim-2141dc22625f73f3ce73460e581934b94f141cf9.tar.gz rneovim-2141dc22625f73f3ce73460e581934b94f141cf9.tar.bz2 rneovim-2141dc22625f73f3ce73460e581934b94f141cf9.zip |
provider: check #Call() if g:loaded_xx_provider=2
-rw-r--r-- | src/nvim/eval.c | 17 | ||||
-rw-r--r-- | test/functional/provider/provider_spec.lua | 9 |
2 files changed, 19 insertions, 7 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index dc18532b40..d82a081c27 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -23996,8 +23996,7 @@ bool eval_has_provider(const char *name) if (get_var_tv(buf, len, &tv, NULL, false, true) == FAIL) { // Show a hint if Call() is defined but g:loaded_xx_provider is missing. snprintf(buf, sizeof(buf), "provider#%s#Call", name); - bool has_call = !!find_func((char_u *)buf); - if (has_call && p_lpl) { + if (!!find_func((char_u *)buf) && p_lpl) { emsgf("provider: %s: missing required variable g:loaded_%s_provider", name, name); } @@ -24005,9 +24004,21 @@ bool eval_has_provider(const char *name) } } - return (tv.v_type == VAR_NUMBER) + bool ok = (tv.v_type == VAR_NUMBER) ? 2 == tv.vval.v_number // Value of 2 means "loaded and working". : false; + + if (ok) { + // Call() must be defined if provider claims to be working. + snprintf(buf, sizeof(buf), "provider#%s#Call", name); + if (!find_func((char_u *)buf)) { + emsgf("provider: %s: g:loaded_%s_provider=2 but %s is not defined", + name, name, buf); + ok = false; + } + } + + return ok; } /// Writes "<sourcing_name>:<sourcing_lnum>" to `buf[bufsize]`. diff --git a/test/functional/provider/provider_spec.lua b/test/functional/provider/provider_spec.lua index 4220ec21cf..bfb0bbc3a3 100644 --- a/test/functional/provider/provider_spec.lua +++ b/test/functional/provider/provider_spec.lua @@ -1,6 +1,6 @@ local helpers = require('test.functional.helpers')(after_each) -local clear, eq, eval = helpers.clear, helpers.eq, helpers.eval +local clear, eval = helpers.clear, helpers.eval local command = helpers.command local expect_err = helpers.expect_err @@ -9,7 +9,7 @@ describe('providers', function() clear('--cmd', 'let &rtp = "test/functional/fixtures,".&rtp') end) - it('must define g:loaded_xx_provider', function() + it('with #Call(), missing g:loaded_xx_provider', function() command('set loadplugins') -- Using test-fixture with broken impl: -- test/functional/fixtures/autoload/provider/python.vim @@ -17,9 +17,10 @@ describe('providers', function() eval, "has('python')") end) - it('without Call() but with g:loaded_xx_provider', function() + it('with g:loaded_xx_provider, missing #Call()', function() -- Using test-fixture with broken impl: -- test/functional/fixtures/autoload/provider/ruby.vim - eq(1, eval("has('ruby')")) + expect_err('Vim:provider: ruby: g:loaded_ruby_provider=2 but provider#ruby#Call is not defined', + eval, "has('ruby')") end) end) |