@@ -147,9 +147,13 @@ public TextDocumentIdentifier GetTextDocumentIdentifier(LSP.CodeAction request)
147147 || projectChange . GetAddedAdditionalDocuments ( ) . Any ( )
148148 || projectChange . GetAddedAnalyzerConfigDocuments ( ) . Any ( ) )
149149 {
150- // Adding documents is not currently supported
151- codeAction . Edit = new LSP . WorkspaceEdit { DocumentChanges = Array . Empty < TextDocumentEdit > ( ) } ;
152- return codeAction ;
150+ if ( context . GetRequiredClientCapabilities ( ) is not { Workspace . WorkspaceEdit . ResourceOperations : { } resourceOperations }
151+ || ! resourceOperations . Contains ( ResourceOperationKind . Create ) )
152+ {
153+ // Adding documents is not supported by this workspace
154+ codeAction . Edit = new LSP . WorkspaceEdit { DocumentChanges = Array . Empty < TextDocumentEdit > ( ) } ;
155+ return codeAction ;
156+ }
153157 }
154158 }
155159
@@ -196,6 +200,21 @@ await AddTextDocumentDeletionsAsync(
196200 projectChanges . SelectMany ( pc => pc . GetRemovedAdditionalDocuments ( ) ) ,
197201 solution . GetAdditionalDocument ) . ConfigureAwait ( false ) ;
198202
203+ // Added documents
204+ await AddTextDocumentAdditionsAsync (
205+ projectChanges . SelectMany ( pc => pc . GetAddedDocuments ( ) ) ,
206+ applyChangesOperation . ChangedSolution . GetDocument ) . ConfigureAwait ( false ) ;
207+
208+ // Added analyzer config documents
209+ await AddTextDocumentAdditionsAsync (
210+ projectChanges . SelectMany ( pc => pc . GetAddedAnalyzerConfigDocuments ( ) ) ,
211+ applyChangesOperation . ChangedSolution . GetAnalyzerConfigDocument ) . ConfigureAwait ( false ) ;
212+
213+ // Added additional documents
214+ await AddTextDocumentAdditionsAsync (
215+ projectChanges . SelectMany ( pc => pc . GetAddedAdditionalDocuments ( ) ) ,
216+ applyChangesOperation . ChangedSolution . GetAdditionalDocument ) . ConfigureAwait ( false ) ;
217+
199218 // Changed documents
200219 await AddTextDocumentEditsAsync (
201220 projectChanges . SelectMany ( pc => pc . GetChangedDocuments ( ) ) ,
@@ -235,6 +254,28 @@ Task AddTextDocumentDeletionsAsync<TTextDocument>(
235254 return Task . CompletedTask ;
236255 }
237256
257+ async Task AddTextDocumentAdditionsAsync < TTextDocument > (
258+ IEnumerable < DocumentId > addedDocuments ,
259+ Func < DocumentId , TTextDocument ? > getNewDocument )
260+ where TTextDocument : TextDocument
261+ {
262+ foreach ( var docId in addedDocuments )
263+ {
264+ var newTextDoc = getNewDocument ( docId ) ;
265+ Contract . ThrowIfNull ( newTextDoc ) ;
266+
267+ // Create the document as empty
268+ textDocumentEdits . Add ( new CreateFile { Uri = newTextDoc . GetURI ( ) } ) ;
269+
270+ // And then give it content
271+ var newText = await newTextDoc . GetTextAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
272+ var emptyDocumentRange = new LSP . Range { Start = new Position { Line = 0 , Character = 0 } , End = new Position { Line = 0 , Character = 0 } } ;
273+ var edit = new TextEdit { Range = emptyDocumentRange , NewText = newText . ToString ( ) } ;
274+ var documentIdentifier = new OptionalVersionedTextDocumentIdentifier { Uri = newTextDoc . GetURI ( ) } ;
275+ textDocumentEdits . Add ( new TextDocumentEdit { TextDocument = documentIdentifier , Edits = new [ ] { edit } } ) ;
276+ }
277+ }
278+
238279 async Task AddTextDocumentEditsAsync < TTextDocument > (
239280 IEnumerable < DocumentId > changedDocuments ,
240281 Func < DocumentId , TTextDocument ? > getNewDocument ,
0 commit comments