aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r--src/nvim/eval.c61
1 files changed, 18 insertions, 43 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index cefd351dd7..ed01ca9f99 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -23968,52 +23968,27 @@ typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
return rettv;
}
-bool eval_has_provider(const char *name)
-{
-#define CHECK_PROVIDER(name) \
- if (has_##name == -1) { \
- has_##name = !!find_func((char_u *)"provider#" #name "#Call"); \
- if (!has_##name) { \
- script_autoload("provider#" #name "#Call", \
- sizeof("provider#" #name "#Call") - 1, \
- false); \
- has_##name = !!find_func((char_u *)"provider#" #name "#Call"); \
- } \
- }
-
- static int has_clipboard = -1;
- static int has_python = -1;
- static int has_python3 = -1;
- static int has_ruby = -1;
- typval_T args[1];
- args[0].v_type = VAR_UNKNOWN;
-
- if (strequal(name, "clipboard")) {
- CHECK_PROVIDER(clipboard);
- return has_clipboard;
- } else if (strequal(name, "python3")) {
- CHECK_PROVIDER(python3);
- return has_python3;
- } else if (strequal(name, "python")) {
- CHECK_PROVIDER(python);
- return has_python;
- } else if (strequal(name, "ruby")) {
- bool need_check_ruby = (has_ruby == -1);
- CHECK_PROVIDER(ruby);
- if (need_check_ruby && has_ruby == 1) {
- char *rubyhost = call_func_retstr("provider#ruby#Detect", 0, args, true);
- if (rubyhost) {
- if (*rubyhost == NUL) {
- // Invalid rubyhost executable. Gem is probably not installed.
- has_ruby = 0;
- }
- xfree(rubyhost);
- }
+/// Check 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);
+
+ 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);
}
- return has_ruby;
+ return false;
}
- return false;
+ return (tv.v_type == VAR_NUMBER) ? tv.vval.v_number != 0: true;
}
/// Writes "<sourcing_name>:<sourcing_lnum>" to `buf[bufsize]`.