From 4173557d6279fc00c97e71798508d80cee34cce3 Mon Sep 17 00:00:00 2001 From: leeguooooo Date: Tue, 17 Jun 2025 15:01:51 +0900 Subject: [PATCH 1/3] fix: replace deprecated LSP client method calls with colon syntax MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces deprecated dot notation with colon notation for LSP client methods: - client.supports_method() → client:supports_method() - client.request() → client:request() - client.request_sync() → client:request_sync() This addresses deprecation warnings in Neovim 0.11+ as documented in :help deprecated.txt Backwards compatible: Colon syntax is just Lua syntactic sugar supported since Neovim 0.5+. No functionality changes, only modernized syntax. Fixes: nvimdev/lspsaga.nvim#1543 --- lua/lspsaga/callhierarchy.lua | 4 ++-- lua/lspsaga/codeaction/init.lua | 8 ++++---- lua/lspsaga/codeaction/lightbulb.lua | 2 +- lua/lspsaga/implement/init.lua | 2 +- lua/lspsaga/symbol/head.lua | 6 +++--- lua/lspsaga/symbol/init.lua | 6 +++--- lua/lspsaga/typehierarchy.lua | 4 ++-- lua/lspsaga/util.lua | 2 +- 8 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lua/lspsaga/callhierarchy.lua b/lua/lspsaga/callhierarchy.lua index 3dc92a47f..665c5597d 100644 --- a/lua/lspsaga/callhierarchy.lua +++ b/lua/lspsaga/callhierarchy.lua @@ -361,7 +361,7 @@ end function ch:call_hierarchy(item, client, timer_close, curlnum) self.pending_request = true - client.request(self.method, { item = item }, function(_, res) + client:request(self.method, { item = item }, function(_, res) self.pending_request = false curlnum = curlnum or 0 local inlevel = curlnum == 0 and 2 or fn.indent(curlnum) @@ -471,7 +471,7 @@ function ch:send_prepare_call() self.list = slist.new() local params = lsp.util.make_position_params(0, util.get_offset_encoding({ client = client })) - client.request(get_method(1), params, function(_, result, ctx) + client:request(get_method(1), params, function(_, result, ctx) if api.nvim_get_current_buf() ~= ctx.bufnr then return end diff --git a/lua/lspsaga/codeaction/init.lua b/lua/lspsaga/codeaction/init.lua index c687c00ef..3c927c702 100644 --- a/lua/lspsaga/codeaction/init.lua +++ b/lua/lspsaga/codeaction/init.lua @@ -244,7 +244,7 @@ local function apply_action(action, client, enriched_ctx) arguments = command.arguments, workDoneToken = command.workDoneToken, } - client.request('workspace/executeCommand', params, nil, enriched_ctx.bufnr) + client:request('workspace/executeCommand', params, nil, enriched_ctx.bufnr) end end clean_ctx() @@ -254,7 +254,7 @@ function act:support_resolve(client) if vim.version().minor >= 10 then local reg = client.dynamic_capabilities:get('textDocument/codeAction', { bufnr = ctx.bufnr }) return vim.tbl_get(reg or {}, 'registerOptions', 'resolveProvider') - or client.supports_method('codeAction/resolve') + or client:supports_method('codeAction/resolve') end return vim.tbl_get(client.server_capabilities, 'codeActionProvider', 'resolveProvider') end @@ -263,12 +263,12 @@ function act:get_resolve_action(client, action, bufnr) if not self:support_resolve(client) then return end - return client.request_sync('codeAction/resolve', action, 1500, bufnr).result + return client:request_sync('codeAction/resolve', action, 1500, bufnr).result end function act:do_code_action(action, client, enriched_ctx) if not action.edit and client and self:support_resolve(client) then - client.request('codeAction/resolve', action, function(err, resolved_action) + client:request('codeAction/resolve', action, function(err, resolved_action) if err then vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR) return diff --git a/lua/lspsaga/codeaction/lightbulb.lua b/lua/lspsaga/codeaction/lightbulb.lua index 2557cd119..415f5e9ef 100644 --- a/lua/lspsaga/codeaction/lightbulb.lua +++ b/lua/lspsaga/codeaction/lightbulb.lua @@ -150,7 +150,7 @@ local function lb_autocmd() if not client then return end - if not client.supports_method('textDocument/codeAction') then + if not client:supports_method('textDocument/codeAction') then return end if vim.tbl_contains(config.lightbulb.ignore.clients, client.name) then diff --git a/lua/lspsaga/implement/init.lua b/lua/lspsaga/implement/init.lua index d8628e8ca..dd27b9d2d 100644 --- a/lua/lspsaga/implement/init.lua +++ b/lua/lspsaga/implement/init.lua @@ -37,7 +37,7 @@ local function try_render(client_id, bufnr, pos, data) return end ---@diagnostic disable-next-line: invisible - client.request('textDocument/implementation', params, function(err, result) + client:request('textDocument/implementation', params, function(err, result) if err or api.nvim_get_current_buf() ~= bufnr then return end diff --git a/lua/lspsaga/symbol/head.lua b/lua/lspsaga/symbol/head.lua index 3b730032e..12c099f4b 100644 --- a/lua/lspsaga/symbol/head.lua +++ b/lua/lspsaga/symbol/head.lua @@ -86,7 +86,7 @@ function symbol:do_request(buf, client_id) } end - client.request('textDocument/documentSymbol', params, function(err, result, ctx) + client:request('textDocument/documentSymbol', params, function(err, result, ctx) if not api.nvim_buf_is_loaded(ctx.bufnr) or not self[ctx.bufnr] then return end @@ -170,7 +170,7 @@ function symbol:register_module() end local client = lsp.get_client_by_id(args.data.client_id) - if not client or not client.supports_method('textDocument/documentSymbol') then + if not client or not client:supports_method('textDocument/documentSymbol') then return end @@ -183,7 +183,7 @@ function symbol:register_module() end self:buf_watcher(args.buf, group) - if config.implement.enable and client.supports_method('textDocument/implementation') then + if config.implement.enable and client:supports_method('textDocument/implementation') then require('lspsaga.implement').start() end end, diff --git a/lua/lspsaga/symbol/init.lua b/lua/lspsaga/symbol/init.lua index 79476c721..4396d6253 100644 --- a/lua/lspsaga/symbol/init.lua +++ b/lua/lspsaga/symbol/init.lua @@ -106,7 +106,7 @@ function symbol:do_request(buf, client_id) self[buf].pending_request = true - client.request('textDocument/documentSymbol', params, function(err, result, ctx) + client:request('textDocument/documentSymbol', params, function(err, result, ctx) if not api.nvim_buf_is_loaded(ctx.bufnr) or not self[ctx.bufnr] then return end @@ -190,7 +190,7 @@ function symbol:register_module() end local client = lsp.get_client_by_id(args.data.client_id) - if not client or not client.supports_method('textDocument/documentSymbol') then + if not client or not client:supports_method('textDocument/documentSymbol') then return end self:do_request(args.buf, args.data.client_id) @@ -199,7 +199,7 @@ function symbol:register_module() require('lspsaga.symbol.winbar').init_winbar(args.buf) end - if config.implement.enable and client.supports_method('textDocument/implementation') then + if config.implement.enable and client:supports_method('textDocument/implementation') then require('lspsaga.implement').start() end end, diff --git a/lua/lspsaga/typehierarchy.lua b/lua/lspsaga/typehierarchy.lua index 48b467b1f..481be0e13 100644 --- a/lua/lspsaga/typehierarchy.lua +++ b/lua/lspsaga/typehierarchy.lua @@ -361,7 +361,7 @@ end function ch:type_hierarchy(item, client, timer_close, curlnum) self.pending_request = true - client.request(self.method, { item = item }, function(_, res) + client:request(self.method, { item = item }, function(_, res) self.pending_request = false curlnum = curlnum or 0 local inlevel = curlnum == 0 and 2 or fn.indent(curlnum) @@ -472,7 +472,7 @@ function ch:send_prepare_type() self.list = slist.new() local params = lsp.util.make_position_params() - client.request(get_method(1), params, function(_, result, ctx) + client:request(get_method(1), params, function(_, result, ctx) if api.nvim_get_current_buf() ~= ctx.bufnr then return end diff --git a/lua/lspsaga/util.lua b/lua/lspsaga/util.lua index dc1e77a5e..de587af58 100644 --- a/lua/lspsaga/util.lua +++ b/lua/lspsaga/util.lua @@ -66,7 +66,7 @@ function M.get_client_by_method(method) local supports = {} for _, client in ipairs(clients or {}) do - if client.supports_method(method) then + if client:supports_method(method) then supports[#supports + 1] = client end end From 62a99c2b9f03f28318976b9a9e547e4da63cba52 Mon Sep 17 00:00:00 2001 From: leeguooooo Date: Mon, 29 Dec 2025 11:08:32 +0900 Subject: [PATCH 2/3] fix: make LSP client calls version-aware --- lua/lspsaga/callhierarchy.lua | 4 ++-- lua/lspsaga/codeaction/init.lua | 8 ++++---- lua/lspsaga/codeaction/lightbulb.lua | 2 +- lua/lspsaga/implement/init.lua | 3 ++- lua/lspsaga/symbol/head.lua | 7 ++++--- lua/lspsaga/symbol/init.lua | 7 ++++--- lua/lspsaga/typehierarchy.lua | 4 ++-- lua/lspsaga/util.lua | 23 ++++++++++++++++++++++- 8 files changed, 41 insertions(+), 17 deletions(-) diff --git a/lua/lspsaga/callhierarchy.lua b/lua/lspsaga/callhierarchy.lua index 665c5597d..4d2480530 100644 --- a/lua/lspsaga/callhierarchy.lua +++ b/lua/lspsaga/callhierarchy.lua @@ -361,7 +361,7 @@ end function ch:call_hierarchy(item, client, timer_close, curlnum) self.pending_request = true - client:request(self.method, { item = item }, function(_, res) + util.client_request(client, self.method, { item = item }, function(_, res) self.pending_request = false curlnum = curlnum or 0 local inlevel = curlnum == 0 and 2 or fn.indent(curlnum) @@ -471,7 +471,7 @@ function ch:send_prepare_call() self.list = slist.new() local params = lsp.util.make_position_params(0, util.get_offset_encoding({ client = client })) - client:request(get_method(1), params, function(_, result, ctx) + util.client_request(client, get_method(1), params, function(_, result, ctx) if api.nvim_get_current_buf() ~= ctx.bufnr then return end diff --git a/lua/lspsaga/codeaction/init.lua b/lua/lspsaga/codeaction/init.lua index 3c927c702..2bb4f15bc 100644 --- a/lua/lspsaga/codeaction/init.lua +++ b/lua/lspsaga/codeaction/init.lua @@ -244,7 +244,7 @@ local function apply_action(action, client, enriched_ctx) arguments = command.arguments, workDoneToken = command.workDoneToken, } - client:request('workspace/executeCommand', params, nil, enriched_ctx.bufnr) + util.client_request(client, 'workspace/executeCommand', params, nil, enriched_ctx.bufnr) end end clean_ctx() @@ -254,7 +254,7 @@ function act:support_resolve(client) if vim.version().minor >= 10 then local reg = client.dynamic_capabilities:get('textDocument/codeAction', { bufnr = ctx.bufnr }) return vim.tbl_get(reg or {}, 'registerOptions', 'resolveProvider') - or client:supports_method('codeAction/resolve') + or util.client_supports_method(client, 'codeAction/resolve') end return vim.tbl_get(client.server_capabilities, 'codeActionProvider', 'resolveProvider') end @@ -263,12 +263,12 @@ function act:get_resolve_action(client, action, bufnr) if not self:support_resolve(client) then return end - return client:request_sync('codeAction/resolve', action, 1500, bufnr).result + return util.client_request_sync(client, 'codeAction/resolve', action, 1500, bufnr).result end function act:do_code_action(action, client, enriched_ctx) if not action.edit and client and self:support_resolve(client) then - client:request('codeAction/resolve', action, function(err, resolved_action) + util.client_request(client, 'codeAction/resolve', action, function(err, resolved_action) if err then vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR) return diff --git a/lua/lspsaga/codeaction/lightbulb.lua b/lua/lspsaga/codeaction/lightbulb.lua index 415f5e9ef..209a120c4 100644 --- a/lua/lspsaga/codeaction/lightbulb.lua +++ b/lua/lspsaga/codeaction/lightbulb.lua @@ -150,7 +150,7 @@ local function lb_autocmd() if not client then return end - if not client:supports_method('textDocument/codeAction') then + if not util.client_supports_method(client, 'textDocument/codeAction') then return end if vim.tbl_contains(config.lightbulb.ignore.clients, client.name) then diff --git a/lua/lspsaga/implement/init.lua b/lua/lspsaga/implement/init.lua index dd27b9d2d..e91ebe111 100644 --- a/lua/lspsaga/implement/init.lua +++ b/lua/lspsaga/implement/init.lua @@ -3,6 +3,7 @@ local api, fn = vim.api, vim.fn local uv = vim.version().minor >= 10 and vim.uv or vim.loop local config = require('lspsaga').config.implement local ui = require('lspsaga').config.ui +local util = require('lspsaga.util') local ns = api.nvim_create_namespace('SagaImp') local defined = false local name = 'SagaImpIcon' @@ -37,7 +38,7 @@ local function try_render(client_id, bufnr, pos, data) return end ---@diagnostic disable-next-line: invisible - client:request('textDocument/implementation', params, function(err, result) + util.client_request(client, 'textDocument/implementation', params, function(err, result) if err or api.nvim_get_current_buf() ~= bufnr then return end diff --git a/lua/lspsaga/symbol/head.lua b/lua/lspsaga/symbol/head.lua index 12c099f4b..61584957d 100644 --- a/lua/lspsaga/symbol/head.lua +++ b/lua/lspsaga/symbol/head.lua @@ -3,6 +3,7 @@ local api, lsp = vim.api, vim.lsp local config = require('lspsaga').config ---@diagnostic disable-next-line: deprecated local uv = vim.version().minor >= 10 and vim.uv or vim.loop +local util = require('lspsaga.util') local symbol = {} local cache = {} @@ -86,7 +87,7 @@ function symbol:do_request(buf, client_id) } end - client:request('textDocument/documentSymbol', params, function(err, result, ctx) + util.client_request(client, 'textDocument/documentSymbol', params, function(err, result, ctx) if not api.nvim_buf_is_loaded(ctx.bufnr) or not self[ctx.bufnr] then return end @@ -170,7 +171,7 @@ function symbol:register_module() end local client = lsp.get_client_by_id(args.data.client_id) - if not client or not client:supports_method('textDocument/documentSymbol') then + if not client or not util.client_supports_method(client, 'textDocument/documentSymbol') then return end @@ -183,7 +184,7 @@ function symbol:register_module() end self:buf_watcher(args.buf, group) - if config.implement.enable and client:supports_method('textDocument/implementation') then + if config.implement.enable and util.client_supports_method(client, 'textDocument/implementation') then require('lspsaga.implement').start() end end, diff --git a/lua/lspsaga/symbol/init.lua b/lua/lspsaga/symbol/init.lua index 4396d6253..f67737750 100644 --- a/lua/lspsaga/symbol/init.lua +++ b/lua/lspsaga/symbol/init.lua @@ -2,6 +2,7 @@ local api, lsp = vim.api, vim.lsp ---@diagnostic disable-next-line: deprecated local uv = vim.version().minor >= 10 and vim.uv or vim.loop local config = require('lspsaga').config +local util = require('lspsaga.util') local symbol = {} local cache = {} @@ -106,7 +107,7 @@ function symbol:do_request(buf, client_id) self[buf].pending_request = true - client:request('textDocument/documentSymbol', params, function(err, result, ctx) + util.client_request(client, 'textDocument/documentSymbol', params, function(err, result, ctx) if not api.nvim_buf_is_loaded(ctx.bufnr) or not self[ctx.bufnr] then return end @@ -190,7 +191,7 @@ function symbol:register_module() end local client = lsp.get_client_by_id(args.data.client_id) - if not client or not client:supports_method('textDocument/documentSymbol') then + if not client or not util.client_supports_method(client, 'textDocument/documentSymbol') then return end self:do_request(args.buf, args.data.client_id) @@ -199,7 +200,7 @@ function symbol:register_module() require('lspsaga.symbol.winbar').init_winbar(args.buf) end - if config.implement.enable and client:supports_method('textDocument/implementation') then + if config.implement.enable and util.client_supports_method(client, 'textDocument/implementation') then require('lspsaga.implement').start() end end, diff --git a/lua/lspsaga/typehierarchy.lua b/lua/lspsaga/typehierarchy.lua index 481be0e13..fc8732eec 100644 --- a/lua/lspsaga/typehierarchy.lua +++ b/lua/lspsaga/typehierarchy.lua @@ -361,7 +361,7 @@ end function ch:type_hierarchy(item, client, timer_close, curlnum) self.pending_request = true - client:request(self.method, { item = item }, function(_, res) + util.client_request(client, self.method, { item = item }, function(_, res) self.pending_request = false curlnum = curlnum or 0 local inlevel = curlnum == 0 and 2 or fn.indent(curlnum) @@ -472,7 +472,7 @@ function ch:send_prepare_type() self.list = slist.new() local params = lsp.util.make_position_params() - client:request(get_method(1), params, function(_, result, ctx) + util.client_request(client, get_method(1), params, function(_, result, ctx) if api.nvim_get_current_buf() ~= ctx.bufnr then return end diff --git a/lua/lspsaga/util.lua b/lua/lspsaga/util.lua index de587af58..648098622 100644 --- a/lua/lspsaga/util.lua +++ b/lua/lspsaga/util.lua @@ -6,6 +6,7 @@ local M = {} M.iswin = uv.os_uname().sysname:match('Windows') M.ismac = uv.os_uname().sysname == 'Darwin' M.is_ten = vim.version().minor >= 10 +M.is_eleven = vim.version().minor >= 11 M.path_sep = M.iswin and '\\' or '/' @@ -13,6 +14,26 @@ function M.path_join(...) return table.concat({ ... }, M.path_sep) end +-- 0.11+ warns on dot calls; 0.10- breaks on colon calls. +local function client_method_wrapper(client, name, ...) + if M.is_eleven then + return client[name](client, ...) + end + return client[name](...) +end + +function M.client_request(client, ...) + return client_method_wrapper(client, 'request', ...) +end + +function M.client_request_sync(client, ...) + return client_method_wrapper(client, 'request_sync', ...) +end + +function M.client_supports_method(client, ...) + return client_method_wrapper(client, 'supports_method', ...) +end + function M.path_itera(buf) local parts = vim.split(api.nvim_buf_get_name(buf), M.path_sep, { trimempty = true }) local index = #parts + 1 @@ -66,7 +87,7 @@ function M.get_client_by_method(method) local supports = {} for _, client in ipairs(clients or {}) do - if client:supports_method(method) then + if M.client_supports_method(client, method) then supports[#supports + 1] = client end end From 2fd4d0327619d2f6d0a9942e2c64b2ca521bfb00 Mon Sep 17 00:00:00 2001 From: leeguooooo Date: Mon, 5 Jan 2026 14:31:14 +0900 Subject: [PATCH 3/3] fix(ci): stabilize luajit version and format symbols --- .github/workflows/ci.yml | 2 +- lua/lspsaga/symbol/head.lua | 13 +++++++++---- lua/lspsaga/symbol/init.lua | 13 +++++++++---- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9cd2c6b69..967a45b86 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: - name: luajit uses: leafo/gh-actions-lua@v10 with: - luaVersion: "luajit-2.1.0-beta3" + luaVersion: "luajit-2.1" - name: luarocks uses: leafo/gh-actions-luarocks@v4 diff --git a/lua/lspsaga/symbol/head.lua b/lua/lspsaga/symbol/head.lua index 61584957d..44e57dbf2 100644 --- a/lua/lspsaga/symbol/head.lua +++ b/lua/lspsaga/symbol/head.lua @@ -71,9 +71,11 @@ function symbol:buf_watcher(bufnr, group) end function symbol:do_request(buf, client_id) - local params = { textDocument = { - uri = vim.uri_from_bufnr(buf), - } } + local params = { + textDocument = { + uri = vim.uri_from_bufnr(buf), + }, + } local client = vim.lsp.get_client_by_id(client_id) if not client then @@ -184,7 +186,10 @@ function symbol:register_module() end self:buf_watcher(args.buf, group) - if config.implement.enable and util.client_supports_method(client, 'textDocument/implementation') then + if + config.implement.enable + and util.client_supports_method(client, 'textDocument/implementation') + then require('lspsaga.implement').start() end end, diff --git a/lua/lspsaga/symbol/init.lua b/lua/lspsaga/symbol/init.lua index f67737750..080c4da73 100644 --- a/lua/lspsaga/symbol/init.lua +++ b/lua/lspsaga/symbol/init.lua @@ -91,9 +91,11 @@ function symbol:do_request(buf, client_id) return end - local params = { textDocument = { - uri = vim.uri_from_bufnr(buf), - } } + local params = { + textDocument = { + uri = vim.uri_from_bufnr(buf), + }, + } local client = vim.lsp.get_client_by_id(client_id) if not client then @@ -200,7 +202,10 @@ function symbol:register_module() require('lspsaga.symbol.winbar').init_winbar(args.buf) end - if config.implement.enable and util.client_supports_method(client, 'textDocument/implementation') then + if + config.implement.enable + and util.client_supports_method(client, 'textDocument/implementation') + then require('lspsaga.implement').start() end end,