diff options
-rw-r--r-- | runtime/autoload/provider/perl.vim | 80 | ||||
-rw-r--r-- | runtime/lua/provider/perl/health.lua | 19 | ||||
-rw-r--r-- | runtime/lua/vim/provider/perl.lua | 66 | ||||
-rw-r--r-- | test/functional/helpers.lua | 11 |
4 files changed, 88 insertions, 88 deletions
diff --git a/runtime/autoload/provider/perl.vim b/runtime/autoload/provider/perl.vim index 24f2b018bb..2a7f4471fb 100644 --- a/runtime/autoload/provider/perl.vim +++ b/runtime/autoload/provider/perl.vim @@ -1,83 +1,15 @@ -if exists('s:loaded_perl_provider') +if exists('g:loaded_perl_provider') finish endif -let s:loaded_perl_provider = 1 - -function! provider#perl#Detect() abort - " use g:perl_host_prog if set or check if perl is on the path - let prog = exepath(get(g:, 'perl_host_prog', 'perl')) - if empty(prog) - return ['', ''] - endif - - " if perl is available, make sure we have 5.22+ - call system([prog, '-e', 'use v5.22']) - if v:shell_error - return ['', 'Perl version is too old, 5.22+ required'] - endif - - " if perl is available, make sure the required module is available - call system([prog, '-W', '-MNeovim::Ext', '-e', '']) - if v:shell_error - return ['', '"Neovim::Ext" cpan module is not installed'] - endif - - return [prog, ''] -endfunction - -function! provider#perl#Prog() abort - return s:prog +function! provider#perl#Call(method, args) abort + return v:lua.require'vim.provider.perl'.call(a:method, a:args) endfunction function! provider#perl#Require(host) abort - if s:err != '' - echoerr s:err - return - endif - - let prog = provider#perl#Prog() - let args = [s:prog, '-e', 'use Neovim::Ext; start_host();'] - - " Collect registered perl plugins into args - let perl_plugins = remote#host#PluginsForHost(a:host.name) - for plugin in perl_plugins - call add(args, plugin.path) - endfor - - return provider#Poll(args, a:host.orig_name, '$NVIM_PERL_LOG_FILE') + return v:lua.require'vim.provider.perl'.require(a:host, s:prog) endfunction -function! provider#perl#Call(method, args) abort - if s:err != '' - echoerr s:err - return - endif - - if !exists('s:host') - try - let s:host = remote#host#Require('legacy-perl-provider') - catch - let s:err = v:exception - echohl WarningMsg - echomsg v:exception - echohl None - return - endtry - endif - return call('rpcrequest', insert(insert(a:args, 'perl_'.a:method), s:host)) -endfunction - -let [s:prog, s:err] = provider#perl#Detect() +let s:prog = v:lua.require'vim.provider.perl'.detect() let g:loaded_perl_provider = empty(s:prog) ? 1 : 2 - -if g:loaded_perl_provider != 2 - let s:err = 'Cannot find perl or the required perl module' -endif - - -" The perl provider plugin will run in a separate instance of the perl -" host. -call remote#host#RegisterClone('legacy-perl-provider', 'perl') -call remote#host#RegisterPlugin('legacy-perl-provider', 'ScriptHost.pm', []) - +call v:lua.require'vim.provider.perl'.start() diff --git a/runtime/lua/provider/perl/health.lua b/runtime/lua/provider/perl/health.lua index d14ebc97ab..6066c69968 100644 --- a/runtime/lua/provider/perl/health.lua +++ b/runtime/lua/provider/perl/health.lua @@ -9,19 +9,14 @@ function M.check() return end - local perl_detect_table = vim.fn['provider#perl#Detect']() - local perl_exec = perl_detect_table[1] - local perl_warnings = perl_detect_table[2] + local perl_exec, perl_warnings = require('vim.provider.perl').detect() - if perl_exec:find('^%s*$') then - if perl_warnings:find('%S') then - health.warn(perl_warnings, { - 'See :help provider-perl for more information.', - 'You may disable this provider (and warning) by adding `let g:loaded_perl_provider = 0` to your init.vim', - }) - else - health.warn('No usable perl executable found') - end + if not perl_exec then + health.warn(assert(perl_warnings), { + 'See :help provider-perl for more information.', + 'You may disable this provider (and warning) by adding `let g:loaded_perl_provider = 0` to your init.vim', + }) + health.warn('No usable perl executable found') return end diff --git a/runtime/lua/vim/provider/perl.lua b/runtime/lua/vim/provider/perl.lua new file mode 100644 index 0000000000..8918c9792e --- /dev/null +++ b/runtime/lua/vim/provider/perl.lua @@ -0,0 +1,66 @@ +local M = {} +local s_err ---@type string? +local s_host ---@type string? + +function M.require(host, prog) + local args = { prog, '-e', 'use Neovim::Ext; start_host();' } + + -- Collect registered perl plugins into args + local perl_plugins = vim.fn['remote#host#PluginsForHost'](host.name) ---@type any + ---@param plugin any + for _, plugin in ipairs(perl_plugins) do + table.insert(args, plugin.path) + end + + return vim.fn['provider#Poll'](args, host.orig_name, '$NVIM_PERL_LOG_FILE') +end + +--- @return string? path to detected perl, if any; nil if not found +--- @return string? error message if perl can't be detected; nil if success +function M.detect() + -- use g:perl_host_prog if set or check if perl is on the path + local prog = vim.fn.exepath(vim.g.perl_host_prog or 'perl') + if prog == '' then + return nil, 'No perl executable found' + end + + -- if perl is available, make sure we have 5.22+ + vim.fn.system({ prog, '-e', 'use v5.22' }) + if vim.v.shell_error ~= 0 then + return nil, 'Perl version is too old, 5.22+ required' + end + + -- if perl is available, make sure the required module is available + vim.fn.system({ prog, '-W', '-MNeovim::Ext', '-e', '' }) + if vim.v.shell_error ~= 0 then + return nil, '"Neovim::Ext" cpan module is not installed' + end + return prog, nil +end + +function M.call(method, args) + if s_err then + return + end + + if not s_host then + -- Ensure that we can load the Perl host before bootstrapping + local ok, result = pcall(vim.fn['remote#host#Require'], 'legacy-perl-provider') ---@type any, any + if not ok then + s_err = result + vim.api.nvim_echo({ result, 'WarningMsg' }, true, {}) + return + end + s_host = result + end + + return vim.fn.rpcrequest(s_host, 'perl_' .. method, unpack(args)) +end + +function M.start() + -- The perl provider plugin will run in a separate instance of the perl host. + vim.fn['remote#host#RegisterClone']('legacy-perl-provider', 'perl') + vim.fn['remote#host#RegisterPlugin']('legacy-perl-provider', 'ScriptHost.pm', {}) +end + +return M diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua index 553b8637db..fe6d53ab7b 100644 --- a/test/functional/helpers.lua +++ b/test/functional/helpers.lua @@ -936,10 +936,17 @@ end --- @param provider string --- @return string|boolean? function module.missing_provider(provider) - if provider == 'ruby' or provider == 'node' or provider == 'perl' then + if provider == 'ruby' then --- @type string? - local e = module.fn['provider#' .. provider .. '#Detect']()[2] + local e = module.fn['provider#ruby#Detect']()[2] return e ~= '' and e or false + elseif provider == 'node' then + --- @type string? + local e = module.fn['provider#node#Detect']()[2] + return e ~= '' and e or false + elseif provider == 'perl' then + --- @type string? + return module.exec_lua([[return {require('vim.provider.perl').detect()}]])[2] elseif provider == 'python' then return module.exec_lua([[return {require('vim.provider.python').detect_by_module('neovim')}]])[2] end |