Compare commits

...

5 Commits

Author SHA1 Message Date
dundargoc 4a3a7a79be
Merge f6953e2333 into efb44e0cad 2024-05-05 10:04:15 -04:00
Maria José Solano efb44e0cad
docs: fix lua type warnings (#28633) 2024-05-05 06:08:17 +08:00
zeertzjq e948d7feba
vim-patch:ad4881cb3c04 (#28636)
runtime(doc): correct getscriptinfo() example (vim/vim#14718)

When "sid" is specified, it returns a List with a single item.

ad4881cb3c
2024-05-04 15:53:42 +08:00
dundargoc f6953e2333 refactor: npm 2024-03-29 17:13:51 +01:00
dundargoc 172247710a refactor: rewrite node provider in lua 2024-03-29 17:13:51 +01:00
11 changed files with 118 additions and 107 deletions

View File

@ -1,22 +1,6 @@
if exists('g:loaded_node_provider')
finish
endif
let g:loaded_node_provider = 1
function! s:is_minimum_version(version, min_version) abort
if empty(a:version)
let nodejs_version = get(split(system(['node', '-v']), "\n"), 0, '')
if v:shell_error || nodejs_version[0] !=# 'v'
return 0
endif
else
let nodejs_version = a:version
endif
" Remove surrounding junk. Example: 'v4.12.0' => '4.12.0'
let nodejs_version = matchstr(nodejs_version, '\(\d\.\?\)\+')
" [major, minor, patch]
return !v:lua.vim.version.lt(nodejs_version, a:min_version)
endfunction
let s:NodeHandler = {
\ 'stdout_buffered': v:true,
@ -28,21 +12,6 @@ function! s:NodeHandler.on_exit(job_id, data, event) abort
let self.result = filereadable(entry_point) ? entry_point : ''
endfunction
" Support for --inspect-brk requires node 6.12+ or 7.6+ or 8+
" Return 1 if it is supported
" Return 0 otherwise
function! provider#node#can_inspect() abort
if !executable('node')
return 0
endif
let ver = get(split(system(['node', '-v']), "\n"), 0, '')
if v:shell_error || ver[0] !=# 'v'
return 0
endif
return (ver[1] ==# '6' && s:is_minimum_version(ver, '6.12.0'))
\ || s:is_minimum_version(ver, '7.6.0')
endfunction
function! provider#node#Detect() abort
let minver = '6.0.0'
if exists('g:node_host_prog')
@ -51,17 +20,10 @@ function! provider#node#Detect() abort
if !executable('node')
return ['', 'node not found (or not executable)']
endif
if !s:is_minimum_version(v:null, minver)
if !v:lua.vim.provider.node.is_minimum_version(v:null, minver)
return ['', printf('node version %s not found', minver)]
endif
let npm_opts = {}
if executable('npm')
let npm_opts = deepcopy(s:NodeHandler)
let npm_opts.entry_point = '/neovim/bin/cli.js'
let npm_opts.job_id = jobstart('npm --loglevel silent root -g', npm_opts)
endif
let yarn_opts = {}
if executable('yarn')
let yarn_opts = deepcopy(s:NodeHandler)
@ -76,21 +38,6 @@ function! provider#node#Detect() abort
let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
endif
let pnpm_opts = {}
if executable('pnpm')
let pnpm_opts = deepcopy(s:NodeHandler)
let pnpm_opts.entry_point = '/neovim/bin/cli.js'
let pnpm_opts.job_id = jobstart('pnpm --loglevel silent root -g', pnpm_opts)
endif
" npm returns the directory faster, so let's check that first
if !empty(npm_opts)
let result = jobwait([npm_opts.job_id])
if result[0] == 0 && npm_opts.result != ''
return [npm_opts.result, '']
endif
endif
if !empty(yarn_opts)
let result = jobwait([yarn_opts.job_id])
if result[0] == 0 && yarn_opts.result != ''
@ -98,6 +45,13 @@ function! provider#node#Detect() abort
endif
endif
let pnpm_opts = {}
if executable('pnpm')
let pnpm_opts = deepcopy(s:NodeHandler)
let pnpm_opts.entry_point = '/neovim/bin/cli.js'
let pnpm_opts.job_id = jobstart('pnpm --loglevel silent root -g', pnpm_opts)
endif
if !empty(pnpm_opts)
let result = jobwait([pnpm_opts.job_id])
if result[0] == 0 && pnpm_opts.result != ''
@ -105,57 +59,18 @@ function! provider#node#Detect() abort
endif
endif
return ['', 'failed to detect node']
endfunction
function! provider#node#Prog() abort
return s:prog
return v:lua.vim.provider.node.detect()
endfunction
function! provider#node#Require(host) abort
if s:err != ''
echoerr s:err
return
endif
let args = ['node']
if !empty($NVIM_NODE_HOST_DEBUG) && provider#node#can_inspect()
call add(args, '--inspect-brk')
endif
call add(args, provider#node#Prog())
return provider#Poll(args, a:host.orig_name, '$NVIM_NODE_LOG_FILE')
return v:lua.vim.provider.node.require(a:host)
endfunction
function! provider#node#Call(method, args) abort
if s:err != ''
echoerr s:err
return
endif
if !exists('s:host')
try
let s:host = remote#host#Require('node')
catch
let s:err = v:exception
echohl WarningMsg
echomsg v:exception
echohl None
return
endtry
endif
return call('rpcrequest', insert(insert(a:args, 'node_'.a:method), s:host))
return v:lua.vim.provider.node.call(a:method, a:args)
endfunction
let s:err = ''
let [s:prog, s:_] = provider#node#Detect()
let g:loaded_node_provider = empty(s:prog) ? 1 : 2
if g:loaded_node_provider != 2
let s:err = 'Cannot find the "neovim" node package. Try :checkhealth'
endif
call remote#host#RegisterPlugin('node-provider', 'node', [])
call v:lua.vim.provider.node.start()

View File

@ -3014,7 +3014,7 @@ getscriptinfo([{opts}]) *getscriptinfo()*
Examples: >vim
echo getscriptinfo({'name': 'myscript'})
echo getscriptinfo({'sid': 15}).variables
echo getscriptinfo({'sid': 15})[0].variables
<
gettabinfo([{tabnr}]) *gettabinfo()*

View File

@ -33,7 +33,7 @@ function M.check()
-- Skip further checks, they are nonsense if nodejs is too old.
return
end
if vim.fn['provider#node#can_inspect']() == 0 then
if not require('vim.provider.node').can_inspect() then
health.warn(
'node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.'
)

View File

@ -124,7 +124,7 @@ error('Cannot require a meta file')
--- @field commalist boolean
--- @field flaglist boolean
--- @field was_set boolean
--- @field last_set_id integer
--- @field last_set_sid integer
--- @field last_set_linenr integer
--- @field last_set_chan integer
--- @field type 'string'|'boolean'|'number'

View File

@ -127,3 +127,11 @@
--- @field skipcol integer
--- @field topfill integer
--- @field topline integer
--- @class vim.fn.getscriptinfo.ret
--- @field autoload false
--- @field functions? string[]
--- @field name string
--- @field sid string
--- @field variables? table<string, any>
--- @field version 1

View File

@ -3628,11 +3628,11 @@ function vim.fn.getregtype(regname) end
---
--- Examples: >vim
--- echo getscriptinfo({'name': 'myscript'})
--- echo getscriptinfo({'sid': 15}).variables
--- echo getscriptinfo({'sid': 15})[0].variables
--- <
---
--- @param opts? table
--- @return any
--- @return vim.fn.getscriptinfo.ret[]
function vim.fn.getscriptinfo(opts) end
--- If {tabnr} is not specified, then information about all the

View File

@ -310,6 +310,7 @@ local function is_empty_or_default(bufnr, option)
end
local info = api.nvim_get_option_info2(option, { buf = bufnr })
---@param e vim.fn.getscriptinfo.ret
local scriptinfo = vim.tbl_filter(function(e)
return e.sid == info.last_set_sid
end, vim.fn.getscriptinfo())
@ -515,7 +516,7 @@ local function buf_attach(bufnr)
textDocument = {
uri = uri,
},
reason = protocol.TextDocumentSaveReason.Manual,
reason = protocol.TextDocumentSaveReason.Manual, ---@type integer
}
if vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'willSave') then
client.notify(ms.textDocument_willSave, params)
@ -899,7 +900,7 @@ end
--- a `client_id:result` map.
---@return function cancel Function that cancels all requests.
function lsp.buf_request_all(bufnr, method, params, handler)
local results = {} --- @type table<integer,{error:string, result:any}>
local results = {} --- @type table<integer,{error:lsp.ResponseError, result:any}>
local result_count = 0
local expected_result_count = 0
@ -940,7 +941,7 @@ end
---@return table<integer, {err: lsp.ResponseError, result: any}>? result Map of client_id:request_result.
---@return string? err On timeout, cancel, or error, `err` is a string describing the failure reason, and `result` is nil.
function lsp.buf_request_sync(bufnr, method, params, timeout_ms)
local request_results
local request_results ---@type table
local cancel = lsp.buf_request_all(bufnr, method, params, function(it)
request_results = it

View File

@ -1,4 +1,5 @@
local M = vim._defer_require('vim.provider', {
node = ..., --- @module 'vim.provider.node'
perl = ..., --- @module 'vim.provider.perl'
python = ..., --- @module 'vim.provider.python'
ruby = ..., --- @module 'vim.provider.ruby'

View File

@ -0,0 +1,85 @@
local M = {}
local s_err ---@type string?
local s_host ---@type string?
--- @param version string?
--- @param min_version string
--- @return boolean
function M.is_minimum_version(version, min_version)
local nodejs_version ---@type string?
if version ~= nil and version ~= '' then
local nodejs_version_system = vim.system({ 'node', '-v' }):wait()
nodejs_version = nodejs_version_system.stdout or ''
if nodejs_version_system.code ~= 0 or not vim.startswith(nodejs_version, 'v') then
return false
end
else
nodejs_version = version
end
-- Remove surrounding junk. Example: 'v4.12.0' => '4.12.0'
nodejs_version = vim.fn.matchstr(nodejs_version, [[\(\d\.\?\)\+]])
return vim.version.ge(nodejs_version, min_version)
end
--- Support for --inspect-brk requires node 6.12+ or 7.6+ or 8+
--- @return boolean true if it's supported
function M.can_inspect()
if vim.fn.executable('node') ~= 1 then
return false
end
local ver_system = vim.system({ 'node', '-v' }):wait() or ''
local ver = ver_system.stdout or ''
if ver_system.code ~= 0 or not vim.startswith(ver, 'v') then
return false
end
return (vim.startswith(ver, '6') and M.is_minimum_version(ver, '6.12.0'))
or M.is_minimum_version(ver, '7.6.0')
end
function M.detect()
local p = vim.system({ 'npm', '--loglevel', 'silent', 'root', '-g' }):wait()
if p.code == 0 and vim.trim(p.stdout) ~= '' then
return { p.stdout, '' }
end
-- Add yarn and pnmp code here later
return { '', 'failed to detect node' }
end
function M.require(host)
local args = { 'node' }
if vim.env.NVIM_NODE_HOST_DEBUG and M.can_inspect() then
table.insert(args, '--inspect-brk')
end
local prog = vim.fn['provider#node#Detect']()[1] ---@type any
table.insert(args, prog)
return vim.fn['provider#Poll'](args, host.orig_name, '$NVIM_NODE_LOG_FILE')
end
function M.call(method, args)
if s_err then
return
end
if not s_host then
local ok, result = pcall(vim.fn['remote#host#Require'], 'node') ---@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, 'node_' .. method, unpack(args))
end
function M.start()
vim.fn['remote#host#RegisterPlugin']('node-provider', 'node', {})
end
return M

View File

@ -327,7 +327,7 @@ function M.get_captures_at_cursor(winnr)
end
--- Optional keyword arguments:
--- @class vim.treesitter.get_node.Opts
--- @class vim.treesitter.get_node.Opts : vim.treesitter.LanguageTree.tree_for_range.Opts
--- @inlinedoc
---
--- Buffer number (nil or 0 for current buffer)

View File

@ -4470,11 +4470,12 @@ M.funcs = {
Examples: >vim
echo getscriptinfo({'name': 'myscript'})
echo getscriptinfo({'sid': 15}).variables
echo getscriptinfo({'sid': 15})[0].variables
<
]=],
name = 'getscriptinfo',
params = { { 'opts', 'table' } },
returns = 'vim.fn.getscriptinfo.ret[]',
signature = 'getscriptinfo([{opts}])',
},
gettabinfo = {