aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2019-08-04 03:54:06 +0200
committerJustin M. Keyes <justinkz@gmail.com>2019-08-04 13:23:46 +0200
commit66938b928c05b913f3a11e520d13ca854621799d (patch)
treecd6a7cf32d92341e3ea82c8893b196aac4ed8f8b /src
parent2cfe4748e57bd510b98ca81bd915f801f5a50bb5 (diff)
downloadrneovim-66938b928c05b913f3a11e520d13ca854621799d.tar.gz
rneovim-66938b928c05b913f3a11e520d13ca854621799d.tar.bz2
rneovim-66938b928c05b913f3a11e520d13ca854621799d.zip
provider: decide status by g:loaded_xx_provider
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index ed01ca9f99..6b7a359508 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -23968,27 +23968,35 @@ typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
return rettv;
}
-/// Check if a named provider is enabled
+/// Checks if a named provider is enabled.
bool eval_has_provider(const char *provider)
{
- char enabled_varname[256];
- int enabled_varname_len = snprintf(enabled_varname, sizeof(enabled_varname),
- "provider#%s#enabled", provider);
-
+ char buf[256];
+ int len;
typval_T tv;
- if (get_var_tv(enabled_varname, enabled_varname_len, &tv,
- NULL, false, false) == FAIL) {
- char call_varname[256];
- snprintf(call_varname, sizeof(call_varname), "provider#%s#Call", provider);
- int has_call = !!find_func((char_u *)call_varname);
- if (has_call && p_lpl) {
- emsgf("Provider '%s' failed to set %s", provider, enabled_varname);
+ // Get the g:loaded_xx_provider variable.
+ len = snprintf(buf, sizeof(buf), "g:loaded_%s_provider", provider);
+ if (get_var_tv(buf, len, &tv, NULL, false, true) == FAIL) {
+ // Trigger autoload once.
+ len = snprintf(buf, sizeof(buf), "provider#%s#bogus", provider);
+ script_autoload(buf, len, false);
+
+ // Retry the (non-autoload-style) variable.
+ len = snprintf(buf, sizeof(buf), "g:loaded_%s_provider", provider);
+ 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", provider);
+ bool has_call = !!find_func((char_u *)buf);
+ if (has_call && p_lpl) {
+ emsgf("provider: %s: missing required variable g:loaded_%s_provider",
+ provider, provider);
+ }
+ return false;
}
- return false;
}
- return (tv.v_type == VAR_NUMBER) ? tv.vval.v_number != 0: true;
+ return (tv.v_type == VAR_NUMBER) ? !!tv.vval.v_number : false;
}
/// Writes "<sourcing_name>:<sourcing_lnum>" to `buf[bufsize]`.