@@ -634,30 +634,47 @@ pub(crate) fn snippet_text_document_edit(
634634 Ok ( lsp_ext:: SnippetTextDocumentEdit { text_document, edits } )
635635}
636636
637- pub ( crate ) fn resource_op (
637+ pub ( crate ) fn snippet_text_document_ops (
638638 snap : & GlobalStateSnapshot ,
639639 file_system_edit : FileSystemEdit ,
640- ) -> lsp_types:: ResourceOp {
640+ ) -> Vec < lsp_ext:: SnippetDocumentChangeOperation > {
641+ let mut ops = Vec :: new ( ) ;
641642 match file_system_edit {
642- FileSystemEdit :: CreateFile { dst } => {
643+ FileSystemEdit :: CreateFile { dst, initial_contents } => {
643644 let uri = snap. anchored_path ( & dst) ;
644- lsp_types:: ResourceOp :: Create ( lsp_types:: CreateFile {
645- uri,
645+ let create_file = lsp_types:: ResourceOp :: Create ( lsp_types:: CreateFile {
646+ uri : uri . clone ( ) ,
646647 options : None ,
647648 annotation_id : None ,
648- } )
649+ } ) ;
650+ ops. push ( lsp_ext:: SnippetDocumentChangeOperation :: Op ( create_file) ) ;
651+ if !initial_contents. is_empty ( ) {
652+ let text_document =
653+ lsp_types:: OptionalVersionedTextDocumentIdentifier { uri, version : None } ;
654+ let range = range ( & LineIndex :: new ( "" ) , TextRange :: empty ( TextSize :: from ( 0 ) ) ) ;
655+ let text_edit = lsp_ext:: SnippetTextEdit {
656+ range,
657+ new_text : initial_contents,
658+ insert_text_format : Some ( lsp_types:: InsertTextFormat :: PlainText ) ,
659+ } ;
660+ let edit_file =
661+ lsp_ext:: SnippetTextDocumentEdit { text_document, edits : vec ! [ text_edit] } ;
662+ ops. push ( lsp_ext:: SnippetDocumentChangeOperation :: Edit ( edit_file) ) ;
663+ }
649664 }
650665 FileSystemEdit :: MoveFile { src, dst } => {
651666 let old_uri = snap. file_id_to_url ( src) ;
652667 let new_uri = snap. anchored_path ( & dst) ;
653- lsp_types:: ResourceOp :: Rename ( lsp_types:: RenameFile {
668+ let rename_file = lsp_types:: ResourceOp :: Rename ( lsp_types:: RenameFile {
654669 old_uri,
655670 new_uri,
656671 options : None ,
657672 annotation_id : None ,
658- } )
673+ } ) ;
674+ ops. push ( lsp_ext:: SnippetDocumentChangeOperation :: Op ( rename_file) )
659675 }
660676 }
677+ ops
661678}
662679
663680pub ( crate ) fn snippet_workspace_edit (
@@ -666,8 +683,8 @@ pub(crate) fn snippet_workspace_edit(
666683) -> Result < lsp_ext:: SnippetWorkspaceEdit > {
667684 let mut document_changes: Vec < lsp_ext:: SnippetDocumentChangeOperation > = Vec :: new ( ) ;
668685 for op in source_change. file_system_edits {
669- let op = resource_op ( & snap, op) ;
670- document_changes. push ( lsp_ext :: SnippetDocumentChangeOperation :: Op ( op ) ) ;
686+ let ops = snippet_text_document_ops ( snap, op) ;
687+ document_changes. extend_from_slice ( & ops ) ;
671688 }
672689 for edit in source_change. source_file_edits {
673690 let edit = snippet_text_document_edit ( & snap, source_change. is_snippet , edit) ?;
0 commit comments