From 72301ac00707579f7e85f91c6ba95e3a962123d5 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Wed, 24 Jan 2024 20:03:06 -0800 Subject: [PATCH] Add support for renaming and deleting files --- autoload/lsp/textedit.vim | 69 ++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/autoload/lsp/textedit.vim b/autoload/lsp/textedit.vim index 5c09c81..9a2b8c5 100644 --- a/autoload/lsp/textedit.vim +++ b/autoload/lsp/textedit.vim @@ -223,46 +223,61 @@ enddef # Create the "createFile.uri" file def FileCreate(createFile: dict) var fname: string = util.LspUriToFile(createFile.uri) - var opts: dict = createFile->get('options', {ignoreIfExists: false, overwrite: true}) + var opts: dict = createFile->get('options', {}) + var ignoreIfExists: bool = opts->get('ignoreIfExists', true) + var overwrite: bool = opts->get('overwrite', false) # LSP Spec: Overwrite wins over `ignoreIfExists` - if (opts->has_key('ignoreIfExists') && !opts.ignoreIfExists) - || (opts->has_key('overwrite') && opts.overwrite) - fnamemodify(fname, ':p:h')->mkdir('p') - []->writefile(fname) + if fname->filereadable() && ignoreIfExists && !overwrite + return endif + + fname->fnamemodify(':p:h')->mkdir('p') + []->writefile(fname) fname->bufadd() enddef # interface DeleteFile # Delete the "deleteFile.uri" file def FileDelete(deleteFile: dict) - util.ErrMsg($'Deleting files not supported') - - # var fname: string = util.LspUriToFile(createFile.uri) - # var opts: dict = createFile->get('options', {recursive: false, ignoreIfNotExists: true}) - - # if !filereadable(fname) && opts.ignoreIfNotExists - # return - # endif - - # var flags: string = '' - # if opts.recursive - # # NOTE: is this a dangerous operation? The LSP server can send a - # # DeleteFile message to recursively delete all the files in the disk. - # flags = 'rf' - # elseif isdirectory(fname) - # flags = 'd' - # endif - # var bnr: number = fname->bufadd() - # delete(fname, flags) - # exe $'{bnr}bwipe!' + var fname: string = util.LspUriToFile(deleteFile.uri) + var opts: dict = deleteFile->get('options', {}) + var recursive: bool = opts->get('recursive', false) + var ignoreIfNotExists: bool = opts->get('ignoreIfNotExists', true) + + if !fname->filereadable() && ignoreIfNotExists + return + endif + + var flags: string = '' + if recursive + # # NOTE: is this a dangerous operation? The LSP server can send a + # # DeleteFile message to recursively delete all the files in the disk. + # flags = 'rf' + util.ErrMsg($'Recursively deleting files is not supported') + return + elseif fname->isdirectory() + flags = 'd' + endif + var bnr: number = fname->bufadd() + fname->delete(flags) + exe $'{bnr}bwipe!' enddef # interface RenameFile -# Delete the "renameFile.uri" file +# Rename file "renameFile.oldUri" to "renameFile.newUri" def FileRename(renameFile: dict) - util.ErrMsg($'Renaming files not supported') + var old_fname: string = util.LspUriToFile(renameFile.oldUri) + var new_fname: string = util.LspUriToFile(renameFile.newUri) + var opts: dict = renameFile->get('options', {}) + var overwrite: bool = opts->get('overwrite', false) + var ignoreIfExists: bool = opts->get('ignoreIfExists', true) + + if new_fname->filereadable() && (!overwrite || ignoreIfExists) + return + endif + + old_fname->rename(new_fname) enddef # interface WorkspaceEdit -- 2.48.1