mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
fix(vim.deprecate): show deprecation warning in devel versions as well
Problem: On devel(nightly) versions, deprecation warnings for hard-deprecated features are not being displayed. E.g., - to be removed in: 0.11 - hard-deprecation since 0.10 - soft-deprecation since 0.9 then 0.10-nightly (0.10.0-dev) versions as well as 0.10.0 (stable) should display the deprecation warning message. Solution: Improve the code and logic on `vim.deprecate()`, and improve test cases with mocked `vim.version()`.
This commit is contained in:

committed by
Lewis Russell

parent
9707363b09
commit
5a8fe0769c
@@ -1033,21 +1033,44 @@ end
|
|||||||
---
|
---
|
||||||
---@return string|nil # Deprecated message, or nil if no message was shown.
|
---@return string|nil # Deprecated message, or nil if no message was shown.
|
||||||
function vim.deprecate(name, alternative, version, plugin, backtrace)
|
function vim.deprecate(name, alternative, version, plugin, backtrace)
|
||||||
|
vim.validate {
|
||||||
|
name = { name, 'string' },
|
||||||
|
alternative = { alternative, 'string', true },
|
||||||
|
version = { version, 'string', true },
|
||||||
|
plugin = { plugin, 'string', true },
|
||||||
|
}
|
||||||
|
plugin = plugin or 'Nvim'
|
||||||
|
|
||||||
-- Only issue warning if feature is hard-deprecated as specified by MAINTAIN.md.
|
-- Only issue warning if feature is hard-deprecated as specified by MAINTAIN.md.
|
||||||
if plugin == nil then
|
-- e.g., when planned to be removed in version = '0.12' (soft-deprecated since 0.10-dev),
|
||||||
local current_version = vim.version()
|
-- show warnings since 0.11, including 0.11-dev (hard_deprecated_since = 0.11-dev).
|
||||||
local deprecated_version = assert(vim.version.parse(version))
|
if plugin == 'Nvim' then
|
||||||
local soft_deprecated_version =
|
local current_version = vim.version() ---@type Version
|
||||||
{ deprecated_version.major, deprecated_version.minor - 1, deprecated_version.patch }
|
local removal_version = assert(vim.version.parse(version))
|
||||||
local deprecate = vim.version.lt(current_version, soft_deprecated_version)
|
local is_hard_deprecated ---@type boolean
|
||||||
if deprecate then
|
|
||||||
|
if removal_version.minor > 0 then
|
||||||
|
local hard_deprecated_since = assert(vim.version._version({
|
||||||
|
major = removal_version.major,
|
||||||
|
minor = removal_version.minor - 1,
|
||||||
|
patch = 0,
|
||||||
|
prerelease = 'dev', -- Show deprecation warnings in devel (nightly) version as well
|
||||||
|
}))
|
||||||
|
is_hard_deprecated = (current_version >= hard_deprecated_since)
|
||||||
|
else
|
||||||
|
-- Assume there will be no next minor version before bumping up the major version;
|
||||||
|
-- therefore we can always show a warning.
|
||||||
|
assert(removal_version.minor == 0, vim.inspect(removal_version))
|
||||||
|
is_hard_deprecated = true
|
||||||
|
end
|
||||||
|
|
||||||
|
if not is_hard_deprecated then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local msg = ('%s is deprecated'):format(name)
|
local msg = ('%s is deprecated'):format(name)
|
||||||
plugin = plugin or 'Nvim'
|
msg = alternative and ('%s, use %s instead.'):format(msg, alternative) or (msg .. '.')
|
||||||
msg = alternative and ('%s, use %s instead.'):format(msg, alternative) or msg
|
|
||||||
msg = ('%s%s\nThis feature will be removed in %s version %s'):format(
|
msg = ('%s%s\nThis feature will be removed in %s version %s'):format(
|
||||||
msg,
|
msg,
|
||||||
(plugin == 'Nvim' and ' :help deprecated' or ''),
|
(plugin == 'Nvim' and ' :help deprecated' or ''),
|
||||||
|
@@ -128,33 +128,93 @@ describe('lua stdlib', function()
|
|||||||
eq(1, fn.luaeval('vim.stricmp("\\0C\\0", "\\0B\\0")'))
|
eq(1, fn.luaeval('vim.stricmp("\\0C\\0", "\\0B\\0")'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('vim.deprecate', function()
|
local function test_vim_deprecate(current_version)
|
||||||
-- vim.deprecate(name, alternative, version, plugin, backtrace)
|
-- vim.deprecate(name, alternative, version, plugin, backtrace)
|
||||||
eq(
|
-- See MAINTAIN.md for the soft/hard deprecation policy
|
||||||
dedent [[
|
|
||||||
foo.bar() is deprecated, use zub.wooo{ok=yay} instead. :help deprecated
|
describe(('vim.deprecate [current_version = %s]'):format(current_version), function()
|
||||||
This feature will be removed in Nvim version 0.10]],
|
before_each(function()
|
||||||
exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10')
|
-- mock vim.version() behavior, should be pinned for consistent testing
|
||||||
)
|
exec_lua(
|
||||||
-- Same message, skipped.
|
[[
|
||||||
eq(vim.NIL, exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10'))
|
local current_version_mock = vim.version.parse(...)
|
||||||
-- Don't show error if not hard deprecated
|
getmetatable(vim.version).__call = function()
|
||||||
eq(vim.NIL, exec_lua('return vim.deprecate(...)', 'foo.bar()', 'nil', '5000.0.0'))
|
return current_version_mock
|
||||||
-- When `plugin` is specified, don't show ":help deprecated". #22235
|
end
|
||||||
eq(
|
]],
|
||||||
dedent [[
|
current_version
|
||||||
foo.bar() is deprecated, use zub.wooo{ok=yay} instead.
|
)
|
||||||
This feature will be removed in my-plugin.nvim version 0.3.0]],
|
end)
|
||||||
exec_lua(
|
|
||||||
'return vim.deprecate(...)',
|
it('when plugin = nil', function()
|
||||||
'foo.bar()',
|
eq(
|
||||||
'zub.wooo{ok=yay}',
|
dedent [[
|
||||||
'0.3.0',
|
foo.bar() is deprecated, use zub.wooo{ok=yay} instead. :help deprecated
|
||||||
'my-plugin.nvim',
|
This feature will be removed in Nvim version 0.10]],
|
||||||
false
|
exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10')
|
||||||
)
|
)
|
||||||
)
|
-- Same message, skipped.
|
||||||
end)
|
eq(vim.NIL, exec_lua('return vim.deprecate(...)', 'foo.bar()', 'zub.wooo{ok=yay}', '0.10'))
|
||||||
|
|
||||||
|
-- Don't show error if not hard-deprecated (only soft-deprecated)
|
||||||
|
eq(
|
||||||
|
vim.NIL,
|
||||||
|
exec_lua('return vim.deprecate(...)', 'foo.baz()', 'foo.better_baz()', '0.12.0')
|
||||||
|
)
|
||||||
|
|
||||||
|
-- Show error if hard-deprecated
|
||||||
|
eq(
|
||||||
|
dedent [[
|
||||||
|
foo.hard_dep() is deprecated, use vim.new_api() instead. :help deprecated
|
||||||
|
This feature will be removed in Nvim version 0.11]],
|
||||||
|
exec_lua('return vim.deprecate(...)', 'foo.hard_dep()', 'vim.new_api()', '0.11')
|
||||||
|
)
|
||||||
|
|
||||||
|
-- To be deleted in the next major version (1.0)
|
||||||
|
eq(
|
||||||
|
dedent [[
|
||||||
|
foo.baz() is deprecated. :help deprecated
|
||||||
|
This feature will be removed in Nvim version 1.0]],
|
||||||
|
exec_lua [[ return vim.deprecate('foo.baz()', nil, '1.0') ]]
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('when plugin is specified', function()
|
||||||
|
-- When `plugin` is specified, don't show ":help deprecated". #22235
|
||||||
|
eq(
|
||||||
|
dedent [[
|
||||||
|
foo.bar() is deprecated, use zub.wooo{ok=yay} instead.
|
||||||
|
This feature will be removed in my-plugin.nvim version 0.3.0]],
|
||||||
|
exec_lua(
|
||||||
|
'return vim.deprecate(...)',
|
||||||
|
'foo.bar()',
|
||||||
|
'zub.wooo{ok=yay}',
|
||||||
|
'0.3.0',
|
||||||
|
'my-plugin.nvim',
|
||||||
|
false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
-- plugins: no soft deprecation period
|
||||||
|
eq(
|
||||||
|
dedent [[
|
||||||
|
foo.bar() is deprecated, use zub.wooo{ok=yay} instead.
|
||||||
|
This feature will be removed in my-plugin.nvim version 0.11.0]],
|
||||||
|
exec_lua(
|
||||||
|
'return vim.deprecate(...)',
|
||||||
|
'foo.bar()',
|
||||||
|
'zub.wooo{ok=yay}',
|
||||||
|
'0.11.0',
|
||||||
|
'my-plugin.nvim',
|
||||||
|
false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
test_vim_deprecate('0.10')
|
||||||
|
test_vim_deprecate('0.10-dev+g0000000')
|
||||||
|
|
||||||
it('vim.startswith', function()
|
it('vim.startswith', function()
|
||||||
eq(true, fn.luaeval('vim.startswith("123", "1")'))
|
eq(true, fn.luaeval('vim.startswith("123", "1")'))
|
||||||
|
Reference in New Issue
Block a user