diff options
author | Javier Lopez <graulopezjavier@gmail.com> | 2022-05-31 13:10:18 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-31 11:10:18 -0700 |
commit | e6652821bd32e4ff8d62a0b67fc2041a5f41e252 (patch) | |
tree | cc5106c44d65f8f504a4f3ba6654b918a6f33c13 | |
parent | 7380ebfc17723662f6fe1e38372f54b3d67fe082 (diff) | |
download | rneovim-e6652821bd32e4ff8d62a0b67fc2041a5f41e252.tar.gz rneovim-e6652821bd32e4ff8d62a0b67fc2041a5f41e252.tar.bz2 rneovim-e6652821bd32e4ff8d62a0b67fc2041a5f41e252.zip |
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.
-rw-r--r-- | runtime/doc/pi_health.txt | 24 | ||||
-rw-r--r-- | runtime/lua/health.lua | 29 | ||||
-rw-r--r-- | runtime/lua/vim/_editor.lua | 1 | ||||
-rw-r--r-- | runtime/lua/vim/health.lua | 47 | ||||
-rw-r--r-- | src/nvim/ex_getln.c | 81 | ||||
-rw-r--r-- | test/functional/fixtures/lua/test_plug/health/init.lua | 9 | ||||
-rw-r--r-- | test/functional/fixtures/lua/test_plug/submodule/health.lua | 9 | ||||
-rw-r--r-- | test/functional/fixtures/lua/test_plug/submodule_failed/health.lua | 7 |
8 files changed, 90 insertions, 117 deletions
diff --git a/runtime/doc/pi_health.txt b/runtime/doc/pi_health.txt index 179c1066cd..04e04b5165 100644 --- a/runtime/doc/pi_health.txt +++ b/runtime/doc/pi_health.txt @@ -48,27 +48,26 @@ Commands *health-commands* :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 -|health-functions-vim|). To get started, simply use: > - local health = require('health') -< -health.report_start({name}) *health.report_start()* +|health-functions-vim|). To get started, simply use: + +vim.health.report_start({name}) *vim.health.report_start()* 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 per section. -health.report_info({msg}) *health.report_info()* +vim.health.report_info({msg}) *vim.health.report_info()* Reports an informational message. -health.report_ok({msg}) *health.report_ok()* +vim.health.report_ok({msg}) *vim.health.report_ok()* 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. -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. ============================================================================== @@ -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: > local M = {} - local health = require("health") M.check = function() - health.report_start("my_plugin report") + vim.health.report_start("my_plugin report") -- make sure setup function parameters are ok if check_setup() then - health.report_ok("Setup function is correct") + vim.health.report_ok("Setup function is correct") else - health.report_error("Setup function is incorrect") + vim.health.report_error("Setup function is incorrect") end -- do some more checking -- ... diff --git a/runtime/lua/health.lua b/runtime/lua/health.lua index 142a353bf2..40e2b3c3e7 100644 --- a/runtime/lua/health.lua +++ b/runtime/lua/health.lua @@ -1,23 +1,6 @@ -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 - -return M +return setmetatable({}, { + __index = function(_, k) + vim.deprecate("require('health')", 'vim.health', '0.9', false) + return vim.health[k] + end, +}) diff --git a/runtime/lua/vim/_editor.lua b/runtime/lua/vim/_editor.lua index e6ab48f30d..c8a0aa8260 100644 --- a/runtime/lua/vim/_editor.lua +++ b/runtime/lua/vim/_editor.lua @@ -49,6 +49,7 @@ for k, v in pairs({ diagnostic = true, keymap = true, ui = true, + health = true, }) do vim._submodules[k] = v end diff --git a/runtime/lua/vim/health.lua b/runtime/lua/vim/health.lua new file mode 100644 index 0000000000..67c5c3b37f --- /dev/null +++ b/runtime/lua/vim/health.lua @@ -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 diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index a94d6edce2..5f12826a0c 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -233,23 +233,6 @@ static int compl_match_arraysize; static int compl_startcol; 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 # include "ex_getln.c.generated.h" #endif @@ -301,59 +284,23 @@ static void init_incsearch_state(incsearch_state_T *s) /// @param[in] xp Not used. static char *get_healthcheck_names(expand_T *xp, int idx) { - // Generate the first time or on new prompt. - if (healthchecks.last_gen == 0 || healthchecks.last_gen != last_prompt_id) { - 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) { - ga_remove_duplicate_strings(&healthchecks.names); - } - } - // Tracked to regenerate items on next prompt. - healthchecks.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. -/// -/// 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$"; - } + static Object names = OBJECT_INIT; + static unsigned last_gen = 0; - 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 (last_gen != last_prompt_id || last_gen == 0) { + Array a = ARRAY_DICT_INIT; + Error err = ERROR_INIT; + Object res = nlua_exec(STATIC_CSTR_AS_STRING("return vim.health._complete()"), a, &err); + api_clear_error(&err); + api_free_object(names); + names = res; + last_gen = last_prompt_id; + } - if (res != NULL) { - GA_APPEND(char *, hcookie->names, res); - } + if (names.type == kObjectTypeArray && idx < (int)names.data.array.size) { + return names.data.array.items[idx].data.string.data; } + return NULL; } // Return true when 'incsearch' highlighting is to be done. diff --git a/test/functional/fixtures/lua/test_plug/health/init.lua b/test/functional/fixtures/lua/test_plug/health/init.lua index d07632cff4..58162d4515 100644 --- a/test/functional/fixtures/lua/test_plug/health/init.lua +++ b/test/functional/fixtures/lua/test_plug/health/init.lua @@ -1,11 +1,10 @@ local M = {} -local health = require("health") M.check = function() - health.report_start("report 1") - health.report_ok("everything is fine") - health.report_start("report 2") - health.report_ok("nothing to see here") + vim.health.report_start("report 1") + vim.health.report_ok("everything is fine") + vim.health.report_start("report 2") + vim.health.report_ok("nothing to see here") end return M diff --git a/test/functional/fixtures/lua/test_plug/submodule/health.lua b/test/functional/fixtures/lua/test_plug/submodule/health.lua index d07632cff4..58162d4515 100644 --- a/test/functional/fixtures/lua/test_plug/submodule/health.lua +++ b/test/functional/fixtures/lua/test_plug/submodule/health.lua @@ -1,11 +1,10 @@ local M = {} -local health = require("health") M.check = function() - health.report_start("report 1") - health.report_ok("everything is fine") - health.report_start("report 2") - health.report_ok("nothing to see here") + vim.health.report_start("report 1") + vim.health.report_ok("everything is fine") + vim.health.report_start("report 2") + vim.health.report_ok("nothing to see here") end return M diff --git a/test/functional/fixtures/lua/test_plug/submodule_failed/health.lua b/test/functional/fixtures/lua/test_plug/submodule_failed/health.lua index 3a8af6ebb2..ee5f4e404b 100644 --- a/test/functional/fixtures/lua/test_plug/submodule_failed/health.lua +++ b/test/functional/fixtures/lua/test_plug/submodule_failed/health.lua @@ -1,10 +1,9 @@ local M = {} -local health = require("health") M.check = function() - health.report_start("report 1") - health.report_ok("everything is fine") - health.report_warn("About to add a number to nil") + vim.health.report_start("report 1") + vim.health.report_ok("everything is fine") + vim.health.report_warn("About to add a number to nil") local a = nil + 2 return a end |