commit 0190771713241b10872b9e2118e16ea4e4b2d1a0
parent cb146cc4aad746053535533cbea8834414ea82a2
Author: Ilia Choly <ilia.choly@gmail.com>
Date: Wed, 28 Feb 2024 04:50:53 -0500
fix(lua): remove uri fragment from file paths (#27647)
Problem: Some LSP servers return `textDocument/documentLink` responses
containing file URIs with line/column numbers in the fragment.
`vim.uri_to_fname` returns invalid file names for these URIs.
Solution: Remove the URI fragment from file URIs.
Diffstat:
2 files changed, 19 insertions(+), 0 deletions(-)
diff --git a/runtime/lua/vim/uri.lua b/runtime/lua/vim/uri.lua
@@ -104,6 +104,10 @@ function M.uri_to_fname(uri)
if scheme ~= 'file' then
return uri
end
+ local fragment_index = uri:find('#')
+ if fragment_index ~= nil then
+ uri = uri:sub(1, fragment_index - 1)
+ end
uri = M.uri_decode(uri)
--TODO improve this.
if is_windows_file_uri(uri) then
diff --git a/test/functional/lua/uri_spec.lua b/test/functional/lua/uri_spec.lua
@@ -88,6 +88,12 @@ describe('URI methods', function()
eq('/xy/åäö/ɧ/汉语/↥/🤦/🦄/å/بِيَّ.txt', exec_lua(test_case))
end)
+
+ it('file path with uri fragment', function()
+ exec_lua("uri = 'file:///Foo/Bar/Baz.txt#fragment'")
+
+ eq('/Foo/Bar/Baz.txt', exec_lua('return vim.uri_to_fname(uri)'))
+ end)
end)
describe('decode Windows filepath', function()
@@ -184,6 +190,15 @@ describe('URI methods', function()
]]
)
end)
+
+ it('uri_to_fname returns non-file schema URI with fragment unchanged', function()
+ eq(
+ 'scheme://path#fragment',
+ exec_lua [[
+ return vim.uri_to_fname('scheme://path#fragment')
+ ]]
+ )
+ end)
end)
end)