aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshaunsingh <shaunsingh0207@gmail.com>2022-09-24 06:46:21 -0400
committerGitHub <noreply@github.com>2022-09-24 12:46:21 +0200
commitcaf5738fa9cc12fd448a9c0787a3ebf0c8e696e9 (patch)
tree8c5758cc49f5a8a27547727e81ef25d46b4df028
parent24b5449b3d9b39a436bb8fe935116afa15a9473e (diff)
downloadrneovim-caf5738fa9cc12fd448a9c0787a3ebf0c8e696e9.tar.gz
rneovim-caf5738fa9cc12fd448a9c0787a3ebf0c8e696e9.tar.bz2
rneovim-caf5738fa9cc12fd448a9c0787a3ebf0c8e696e9.zip
fix(lsp): create missing directory before creating file (#19835)
Co-authored-by: Mathias Fussenegger <f.mathias@zignar.net>
-rw-r--r--runtime/lua/vim/lsp/util.lua5
-rw-r--r--test/functional/plugin/lsp_spec.lua16
2 files changed, 20 insertions, 1 deletions
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua
index 1909dbd4d1..64512a9739 100644
--- a/runtime/lua/vim/lsp/util.lua
+++ b/runtime/lua/vim/lsp/util.lua
@@ -772,8 +772,11 @@ local function create_file(change)
-- from spec: Overwrite wins over `ignoreIfExists`
local fname = vim.uri_to_fname(change.uri)
if not opts.ignoreIfExists or opts.overwrite then
+ vim.fn.mkdir(vim.fs.dirname(fname), 'p')
local file = io.open(fname, 'w')
- file:close()
+ if file then
+ file:close()
+ end
end
vim.fn.bufadd(fname)
end
diff --git a/test/functional/plugin/lsp_spec.lua b/test/functional/plugin/lsp_spec.lua
index e032f3bc2b..bcae9b4084 100644
--- a/test/functional/plugin/lsp_spec.lua
+++ b/test/functional/plugin/lsp_spec.lua
@@ -1977,6 +1977,22 @@ describe('LSP', function()
exec_lua('vim.lsp.util.apply_workspace_edit(...)', edit, 'utf-16')
eq(true, exec_lua('return vim.loop.fs_stat(...) ~= nil', tmpfile))
end)
+ it('Supports file creation in folder that needs to be created with CreateFile payload', function()
+ local tmpfile = helpers.tmpname()
+ os.remove(tmpfile) -- Should not exist, only interested in a tmpname
+ tmpfile = tmpfile .. '/dummy/x/'
+ local uri = exec_lua('return vim.uri_from_fname(...)', tmpfile)
+ local edit = {
+ documentChanges = {
+ {
+ kind = 'create',
+ uri = uri,
+ },
+ }
+ }
+ exec_lua('vim.lsp.util.apply_workspace_edit(...)', edit, 'utf-16')
+ eq(true, exec_lua('return vim.loop.fs_stat(...) ~= nil', tmpfile))
+ end)
it('createFile does not touch file if it exists and ignoreIfExists is set', function()
local tmpfile = helpers.tmpname()
write_file(tmpfile, 'Dummy content')