refactor(checkhealth)!: rename to vim.health, move logic to Lua #18720

- Complete function:
  There was lots of unnecessary C code for the complete function, therefore
  moving it to Lua and use all the plumbing we have in place to retrieve the
  results.
- Moving the module:
  It's important we keep nvim lua modules name spaced, avoids conflict with
  plugins, luarocks, etc.
This commit is contained in:
Javier Lopez
2022-05-31 13:10:18 -05:00
committed by GitHub
parent 7380ebfc17
commit e6652821bd
8 changed files with 89 additions and 116 deletions

View File

@@ -48,27 +48,26 @@ Commands *health-commands*
:checkhealth vim* :checkhealth vim*
< <
============================================================================== ==============================================================================
Lua Functions *health-functions-lua* *health-lua* Lua Functions *health-functions-lua* *health-lua* *vim.health*
The Lua "health" module can be used to create new healthchecks (see also The Lua "health" module can be used to create new healthchecks (see also
|health-functions-vim|). To get started, simply use: > |health-functions-vim|). To get started, simply use:
local health = require('health')
< vim.health.report_start({name}) *vim.health.report_start()*
health.report_start({name}) *health.report_start()*
Starts a new report. Most plugins should call this only once, but if Starts a new report. Most plugins should call this only once, but if
you want different sections to appear in your report, call this once you want different sections to appear in your report, call this once
per section. per section.
health.report_info({msg}) *health.report_info()* vim.health.report_info({msg}) *vim.health.report_info()*
Reports an informational message. Reports an informational message.
health.report_ok({msg}) *health.report_ok()* vim.health.report_ok({msg}) *vim.health.report_ok()*
Reports a "success" message. Reports a "success" message.
health.report_warn({msg} [, {advice}]) *health.report_warn()* vim.health.report_warn({msg} [, {advice}]) *vim.health.report_warn()*
Reports a warning. {advice} is an optional List of suggestions. Reports a warning. {advice} is an optional List of suggestions.
health.report_error({msg} [, {advice}]) *health.report_error()* vim.health.report_error({msg} [, {advice}]) *vim.health.report_error()*
Reports an error. {advice} is an optional List of suggestions. Reports an error. {advice} is an optional List of suggestions.
============================================================================== ==============================================================================
@@ -98,15 +97,14 @@ Copy this sample code into `lua/foo/health/init.lua` or `lua/foo/health.lua`,
replacing "foo" in the path with your plugin name: > replacing "foo" in the path with your plugin name: >
local M = {} local M = {}
local health = require("health")
M.check = function() M.check = function()
health.report_start("my_plugin report") vim.health.report_start("my_plugin report")
-- make sure setup function parameters are ok -- make sure setup function parameters are ok
if check_setup() then if check_setup() then
health.report_ok("Setup function is correct") vim.health.report_ok("Setup function is correct")
else else
health.report_error("Setup function is incorrect") vim.health.report_error("Setup function is incorrect")
end end
-- do some more checking -- do some more checking
-- ... -- ...

View File

@@ -1,23 +1,6 @@
local M = {} return setmetatable({}, {
__index = function(_, k)
function M.report_start(msg) vim.deprecate("require('health')", 'vim.health', '0.9', false)
vim.fn['health#report_start'](msg) return vim.health[k]
end end,
})
function M.report_info(msg)
vim.fn['health#report_info'](msg)
end
function M.report_ok(msg)
vim.fn['health#report_ok'](msg)
end
function M.report_warn(msg, ...)
vim.fn['health#report_warn'](msg, ...)
end
function M.report_error(msg, ...)
vim.fn['health#report_error'](msg, ...)
end
return M

View File

@@ -49,6 +49,7 @@ for k, v in pairs({
diagnostic = true, diagnostic = true,
keymap = true, keymap = true,
ui = true, ui = true,
health = true,
}) do }) do
vim._submodules[k] = v vim._submodules[k] = v
end end

View File

@@ -0,0 +1,47 @@
local M = {}
function M.report_start(msg)
vim.fn['health#report_start'](msg)
end
function M.report_info(msg)
vim.fn['health#report_info'](msg)
end
function M.report_ok(msg)
vim.fn['health#report_ok'](msg)
end
function M.report_warn(msg, ...)
vim.fn['health#report_warn'](msg, ...)
end
function M.report_error(msg, ...)
vim.fn['health#report_error'](msg, ...)
end
local path2name = function(path)
if path:match('%.lua$') then
-- Lua: transform "../lua/vim/lsp/health.lua" into "vim.lsp"
return path:gsub('.-lua[%\\%/]', '', 1):gsub('[%\\%/]', '.'):gsub('%.health.-$', '')
else
-- Vim: transform "../autoload/health/provider.vim" into "provider"
return vim.fn.fnamemodify(path, ':t:r')
end
end
local PATTERNS = { '/autoload/health/*.vim', '/lua/**/**/health.lua', '/lua/**/**/health/init.lua' }
-- :checkhealth completion function used by ex_getln.c get_healthcheck_names()
M._complete = function()
local names = vim.tbl_flatten(vim.tbl_map(function(pattern)
return vim.tbl_map(path2name, vim.api.nvim_get_runtime_file(pattern, true))
end, PATTERNS))
-- Remove duplicates
local unique = {}
vim.tbl_map(function(f)
unique[f] = true
end, names)
return vim.tbl_keys(unique)
end
return M

View File

@@ -233,23 +233,6 @@ static int compl_match_arraysize;
static int compl_startcol; static int compl_startcol;
static int compl_selected; static int compl_selected;
/// |:checkhealth| completion items
///
/// Regenerates on every new command line prompt, to accommodate changes on the
/// runtime files.
typedef struct {
garray_T names; // healthcheck names
unsigned last_gen; // last_prompt_id where names were generated
} CheckhealthComp;
/// Cookie used when converting filepath to name
struct healthchecks_cookie {
garray_T *names; // global healthchecks
bool is_lua; // true if the current entry is a Lua healthcheck
};
static CheckhealthComp healthchecks = { GA_INIT(sizeof(char_u *), 10), 0 };
#ifdef INCLUDE_GENERATED_DECLARATIONS #ifdef INCLUDE_GENERATED_DECLARATIONS
# include "ex_getln.c.generated.h" # include "ex_getln.c.generated.h"
#endif #endif
@@ -301,59 +284,23 @@ static void init_incsearch_state(incsearch_state_T *s)
/// @param[in] xp Not used. /// @param[in] xp Not used.
static char *get_healthcheck_names(expand_T *xp, int idx) static char *get_healthcheck_names(expand_T *xp, int idx)
{ {
// Generate the first time or on new prompt. static Object names = OBJECT_INIT;
if (healthchecks.last_gen == 0 || healthchecks.last_gen != last_prompt_id) { static unsigned last_gen = 0;
ga_clear_strings(&healthchecks.names);
char *patterns[3] = { "autoload/health/**.vim", "lua/**/**/health/init.lua", // NOLINT
"lua/**/**/health.lua" }; // NOLINT
for (int i = 0; i < 3; i++) {
struct healthchecks_cookie hcookie = { .names = &healthchecks.names, .is_lua = i != 0 };
do_in_runtimepath(patterns[i], DIP_ALL, get_healthcheck_cb, &hcookie);
if (healthchecks.names.ga_len > 0) { if (last_gen != last_prompt_id || last_gen == 0) {
ga_remove_duplicate_strings(&healthchecks.names); Array a = ARRAY_DICT_INIT;
} Error err = ERROR_INIT;
} Object res = nlua_exec(STATIC_CSTR_AS_STRING("return vim.health._complete()"), a, &err);
// Tracked to regenerate items on next prompt. api_clear_error(&err);
healthchecks.last_gen = last_prompt_id; api_free_object(names);
names = res;
last_gen = last_prompt_id;
} }
return idx < healthchecks.names.ga_len
? ((char **)(healthchecks.names.ga_data))[idx] : NULL;
}
/// Transform healthcheck file path into it's name. if (names.type == kObjectTypeArray && idx < (int)names.data.array.size) {
/// return names.data.array.items[idx].data.string.data;
/// Used as a callback for do_in_runtimepath
/// @param[in] path Expanded path to a possible healthcheck.
/// @param[out] cookie Array where names will be inserted.
static void get_healthcheck_cb(char *path, void *cookie)
{
if (path != NULL) {
struct healthchecks_cookie *hcookie = (struct healthchecks_cookie *)cookie;
char *pattern;
char *sub = "\\1";
char *res;
if (hcookie->is_lua) {
// Lua: transform "../lua/vim/lsp/health.lua" into "vim.lsp"
pattern = ".*lua[\\/]\\(.\\{-}\\)[\\/]health\\([\\/]init\\)\\?\\.lua$";
} else {
// Vim: transform "../autoload/health/provider.vim" into "provider"
pattern = ".*[\\/]\\([^\\/]*\\)\\.vim$";
}
res = do_string_sub(path, pattern, sub, NULL, "g");
if (hcookie->is_lua && res != NULL) {
// Replace slashes with dots as represented by the healthcheck plugin.
char *ares = do_string_sub(res, "[\\/]", ".", NULL, "g");
xfree(res);
res = ares;
}
if (res != NULL) {
GA_APPEND(char *, hcookie->names, res);
}
} }
return NULL;
} }
// Return true when 'incsearch' highlighting is to be done. // Return true when 'incsearch' highlighting is to be done.

View File

@@ -1,11 +1,10 @@
local M = {} local M = {}
local health = require("health")
M.check = function() M.check = function()
health.report_start("report 1") vim.health.report_start("report 1")
health.report_ok("everything is fine") vim.health.report_ok("everything is fine")
health.report_start("report 2") vim.health.report_start("report 2")
health.report_ok("nothing to see here") vim.health.report_ok("nothing to see here")
end end
return M return M

View File

@@ -1,11 +1,10 @@
local M = {} local M = {}
local health = require("health")
M.check = function() M.check = function()
health.report_start("report 1") vim.health.report_start("report 1")
health.report_ok("everything is fine") vim.health.report_ok("everything is fine")
health.report_start("report 2") vim.health.report_start("report 2")
health.report_ok("nothing to see here") vim.health.report_ok("nothing to see here")
end end
return M return M

View File

@@ -1,10 +1,9 @@
local M = {} local M = {}
local health = require("health")
M.check = function() M.check = function()
health.report_start("report 1") vim.health.report_start("report 1")
health.report_ok("everything is fine") vim.health.report_ok("everything is fine")
health.report_warn("About to add a number to nil") vim.health.report_warn("About to add a number to nil")
local a = nil + 2 local a = nil + 2
return a return a
end end