aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2023-08-01 07:36:57 -0700
committerGitHub <noreply@github.com>2023-08-01 07:36:57 -0700
commitdfe19d6e0047ea2a2a75dff0c57f4c4de1c0196a (patch)
treeeda17150f1d1cc8985c925a1994b8ad960a48c2e /scripts
parent48d533272e57e91e4d14c93b26d4922957f40cd7 (diff)
parentf41496ce74fb30c18bb9a03027a172800b269643 (diff)
downloadrneovim-dfe19d6e0047ea2a2a75dff0c57f4c4de1c0196a.tar.gz
rneovim-dfe19d6e0047ea2a2a75dff0c57f4c4de1c0196a.tar.bz2
rneovim-dfe19d6e0047ea2a2a75dff0c57f4c4de1c0196a.zip
Merge #24504 feat(lsp): protocol.Methods
Diffstat (limited to 'scripts')
-rw-r--r--scripts/gen_lsp.lua (renamed from scripts/lsp_types.lua)116
1 files changed, 96 insertions, 20 deletions
diff --git a/scripts/lsp_types.lua b/scripts/gen_lsp.lua
index 4a089bd76d..ef9d6c41df 100644
--- a/scripts/lsp_types.lua
+++ b/scripts/gen_lsp.lua
@@ -1,9 +1,10 @@
--[[
Generates lua-ls annotations for lsp
USAGE:
-nvim -l scripts/lsp_types.lua gen # this will overwrite runtime/lua/vim/lsp/types/protocol.lua
-nvim -l scripts/lsp_types.lua gen --build/new_lsp_types.lua
-nvim -l scripts/lsp_types.lua gen --out runtime/lua/vim/lsp/types/protocol.lua --ref 2023.0.0a2 # specify a git reference from microsoft/lsprotocol
+nvim -l scripts/gen_lsp.lua gen # this will overwrite runtime/lua/vim/lsp/types/protocol.lua
+nvim -l scripts/gen_lsp.lua gen --version 3.18 --build/new_lsp_types.lua
+nvim -l scripts/gen_lsp.lua gen --version 3.18 --out runtime/lua/vim/lsp/types/protocol.lua
+nvim -l scripts/gen_lsp.lua gen --version 3.18 --methods
--]]
local M = {}
@@ -18,24 +19,96 @@ local function tofile(fname, text)
end
end
-function M.gen(opt)
- if vim.uv.fs_stat('./lsp.json') then
- vim.fn.delete('./lsp.json')
+local function read_json(opt)
+ local uri = 'https://raw.githubusercontent.com/microsoft/language-server-protocol/gh-pages/_specifications/lsp/'
+ .. opt.version
+ .. '/metaModel/metaModel.json'
+
+ local res = vim.system({ 'curl', '--no-progress-meter', uri, '-o', '-' }):wait()
+ if res.code ~= 0 or (res.stdout or ''):len() < 999 then
+ print(('URL failed: %s'):format(uri))
+ vim.print(res)
+ error(res.stdout)
+ end
+ return vim.json.decode(res.stdout)
+end
+
+-- Gets the Lua symbol for a given fully-qualified LSP method name.
+local function name(s)
+ return s:gsub('/', '_', 3)
+end
+
+local function gen_methods(protocol)
+ local output = {
+ '-- Generated by gen_lsp.lua, keep at end of file.',
+ '--- LSP method names.',
+ '---',
+ '---@see https://microsoft.github.io/language-server-protocol/specifications/specification-current/#metaModel',
+ 'protocol.Methods = {',
+ }
+ local indent = (' '):rep(2)
+
+ table.sort(protocol.requests, function(a, b)
+ return name(a.method) < name(b.method)
+ end)
+ for _, item in ipairs(protocol.requests) do
+ if item.method then
+ if item.documentation then
+ local document = vim.split(item.documentation, '\n?\n', { trimempty = true })
+ for _, docstring in ipairs(document) do
+ output[#output + 1] = indent .. '--- ' .. docstring
+ end
+ end
+ output[#output + 1] = ("%s%s = '%s',"):format(indent, name(item.method), item.method)
+ end
end
- vim.fn.system({
- 'curl',
- 'https://raw.githubusercontent.com/microsoft/lsprotocol/' .. opt.ref .. '/generator/lsp.json',
- '-o',
- './lsp.json',
+ output[#output + 1] = '}'
+ output = vim.list_extend(
+ output,
+ vim.split(
+ [[
+local function freeze(t)
+ return setmetatable({}, {
+ __index = t,
+ __newindex = function()
+ error('cannot modify immutable table')
+ end,
})
- local protocol = vim.fn.json_decode(vim.fn.readfile('./lsp.json'))
- vim.fn.delete('./lsp.json')
- protocol = protocol or {}
+end
+protocol.Methods = freeze(protocol.Methods)
+
+return protocol
+]],
+ '\n',
+ { trimempty = true }
+ )
+ )
+
+ local fname = './runtime/lua/vim/lsp/protocol.lua'
+ local bufnr = vim.fn.bufadd(fname)
+ vim.fn.bufload(bufnr)
+ vim.api.nvim_set_current_buf(bufnr)
+ local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
+ local index = vim.iter(ipairs(lines)):find(function(key, item)
+ return vim.startswith(item, '-- Generated by') and key or nil
+ end)
+ index = index and index - 1 or vim.api.nvim_buf_line_count(bufnr) - 1
+ vim.api.nvim_buf_set_lines(bufnr, index, -1, true, output)
+ vim.cmd.write()
+end
+
+function M.gen(opt)
+ local protocol = read_json(opt)
+
+ if opt.methods then
+ gen_methods(protocol)
+ end
+
local output = {
'--[[',
- 'This file is autogenerated from scripts/lsp_types.lua',
+ 'This file is autogenerated from scripts/gen_lsp.lua',
'Regenerate:',
- [=[nvim -l scripts/lsp_types.lua gen --runtime/lua/vim/lsp/types/protocol.lua]=],
+ [=[nvim -l scripts/gen_lsp.lua gen --version 3.18 --runtime/lua/vim/lsp/types/protocol.lua]=],
'--]]',
'',
'---@alias lsp.null nil',
@@ -190,14 +263,17 @@ end
local opt = {
output_file = 'runtime/lua/vim/lsp/types/protocol.lua',
- ref = 'main',
+ version = nil,
+ methods = nil,
}
for i = 1, #_G.arg do
if _G.arg[i] == '--out' then
- opt.output_file = _G.arg[i+1]
- elseif _G.arg[i] == '--ref' then
- opt.ref = _G.arg[i+1]
+ opt.output_file = _G.arg[i + 1]
+ elseif _G.arg[i] == '--version' then
+ opt.version = _G.arg[i + 1]
+ elseif _G.arg[i] == '--methods' then
+ opt.methods = true
elseif vim.startswith(_G.arg[i], '--') then
opt.output_file = _G.arg[i]:sub(3)
end