Skip to content

Commit 9449fc7

Browse files
committed
Update CodeActionResolveHandler to support adding documents
1 parent 091e84c commit 9449fc7

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

src/Features/LanguageServer/Protocol/Handler/CodeActions/CodeActionResolveHandler.cs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)