aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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]`.