Skip to content

Commit 6f8ea71

Browse files
Remove usage of WaitAndGetResult (#76474)
2 parents f9ccce0 + ccaf149 commit 6f8ea71

File tree

39 files changed

+517
-471
lines changed

39 files changed

+517
-471
lines changed

src/EditorFeatures/Core.Wpf/Interactive/InteractiveEvaluator.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
1515
using Microsoft.CodeAnalysis.ErrorReporting;
1616
using Microsoft.CodeAnalysis.Host;
17-
using Microsoft.CodeAnalysis.Options;
1817
using Microsoft.CodeAnalysis.Shared.TestHooks;
1918
using Microsoft.VisualStudio.InteractiveWindow;
2019
using Microsoft.VisualStudio.InteractiveWindow.Commands;
@@ -70,7 +69,6 @@ internal CSharpInteractiveEvaluator(
7069
IInteractiveWindowCommandsFactory commandsFactory,
7170
ImmutableArray<IInteractiveWindowCommand> commands,
7271
ITextDocumentFactoryService textDocumentFactoryService,
73-
EditorOptionsService editorOptionsService,
7472
InteractiveEvaluatorLanguageInfoProvider languageInfo,
7573
string initialWorkingDirectory)
7674
{
@@ -87,10 +85,8 @@ internal CSharpInteractiveEvaluator(
8785

8886
_session = new InteractiveSession(
8987
_workspace,
90-
threadingContext,
9188
listener,
9289
textDocumentFactoryService,
93-
editorOptionsService,
9490
languageInfo,
9591
initialWorkingDirectory);
9692

src/EditorFeatures/Core/Formatting/FormatCommandHandler.Paste.cs

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6-
using System.Threading;
6+
using System.Threading.Tasks;
77
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
88
using Microsoft.CodeAnalysis.Formatting.Rules;
99
using Microsoft.CodeAnalysis.Shared.Extensions;
1010
using Microsoft.CodeAnalysis.Text;
1111
using Microsoft.VisualStudio.Commanding;
1212
using Microsoft.VisualStudio.Text;
1313
using Microsoft.VisualStudio.Text.Editor.Commanding.Commands;
14-
using Roslyn.Utilities;
1514

1615
namespace Microsoft.CodeAnalysis.Formatting;
1716

@@ -29,59 +28,59 @@ public void ExecuteCommand(PasteCommandArgs args, Action nextHandler, CommandExe
2928

3029
var cancellationToken = context.OperationContext.UserCancellationToken;
3130
if (cancellationToken.IsCancellationRequested)
32-
{
3331
return;
34-
}
3532

3633
try
3734
{
38-
ExecuteCommandWorker(args, caretPosition, cancellationToken);
35+
_threadingContext.JoinableTaskFactory.Run(() => ExecuteCommandWorkerAsync());
3936
}
4037
catch (OperationCanceledException)
4138
{
4239
// According to Editor command handler API guidelines, it's best if we return early if cancellation
4340
// is requested instead of throwing. Otherwise, we could end up in an invalid state due to already
4441
// calling nextHandler().
4542
}
46-
}
4743

48-
private void ExecuteCommandWorker(PasteCommandArgs args, SnapshotPoint? caretPosition, CancellationToken cancellationToken)
49-
{
50-
if (!caretPosition.HasValue)
51-
return;
44+
return;
5245

53-
var subjectBuffer = args.SubjectBuffer;
54-
if (!subjectBuffer.TryGetWorkspace(out var workspace) ||
55-
!workspace.CanApplyChange(ApplyChangesKind.ChangeDocument))
46+
async Task ExecuteCommandWorkerAsync()
5647
{
57-
return;
48+
if (!caretPosition.HasValue)
49+
return;
50+
51+
var subjectBuffer = args.SubjectBuffer;
52+
if (!subjectBuffer.TryGetWorkspace(out var workspace) ||
53+
!workspace.CanApplyChange(ApplyChangesKind.ChangeDocument))
54+
{
55+
return;
56+
}
57+
58+
var document = subjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges();
59+
if (document == null)
60+
return;
61+
62+
if (!_globalOptions.GetOption(FormattingOptionsStorage.FormatOnPaste, document.Project.Language))
63+
return;
64+
65+
var solution = document.Project.Solution;
66+
var services = solution.Services;
67+
var formattingRuleService = services.GetService<IHostDependentFormattingRuleFactoryService>();
68+
if (formattingRuleService != null && formattingRuleService.ShouldNotFormatOrCommitOnPaste(document.Id))
69+
return;
70+
71+
var formattingService = document.GetLanguageService<IFormattingInteractionService>();
72+
if (formattingService == null || !formattingService.SupportsFormatOnPaste)
73+
return;
74+
75+
var trackingSpan = caretPosition.Value.Snapshot.CreateTrackingSpan(caretPosition.Value.Position, 0, SpanTrackingMode.EdgeInclusive);
76+
var span = trackingSpan.GetSpan(subjectBuffer.CurrentSnapshot).Span.ToTextSpan();
77+
78+
// Note: C# always completes synchronously, TypeScript is async
79+
var changes = await formattingService.GetFormattingChangesOnPasteAsync(document, subjectBuffer, span, cancellationToken).ConfigureAwait(true);
80+
if (changes.IsEmpty)
81+
return;
82+
83+
subjectBuffer.ApplyChanges(changes);
5884
}
59-
60-
var document = subjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges();
61-
if (document == null)
62-
return;
63-
64-
if (!_globalOptions.GetOption(FormattingOptionsStorage.FormatOnPaste, document.Project.Language))
65-
return;
66-
67-
var solution = document.Project.Solution;
68-
var services = solution.Services;
69-
var formattingRuleService = services.GetService<IHostDependentFormattingRuleFactoryService>();
70-
if (formattingRuleService != null && formattingRuleService.ShouldNotFormatOrCommitOnPaste(document.Id))
71-
return;
72-
73-
var formattingService = document.GetLanguageService<IFormattingInteractionService>();
74-
if (formattingService == null || !formattingService.SupportsFormatOnPaste)
75-
return;
76-
77-
var trackingSpan = caretPosition.Value.Snapshot.CreateTrackingSpan(caretPosition.Value.Position, 0, SpanTrackingMode.EdgeInclusive);
78-
var span = trackingSpan.GetSpan(subjectBuffer.CurrentSnapshot).Span.ToTextSpan();
79-
80-
// Note: C# always completes synchronously, TypeScript is async
81-
var changes = formattingService.GetFormattingChangesOnPasteAsync(document, subjectBuffer, span, cancellationToken).WaitAndGetResult(cancellationToken);
82-
if (changes.IsEmpty)
83-
return;
84-
85-
subjectBuffer.ApplyChanges(changes);
8685
}
8786
}

src/EditorFeatures/Core/InlineRename/InlineRenameSession.OpenTextBufferManager.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ internal void DisconnectAndRollbackEdits(bool documentIsClosed)
312312
}
313313
}
314314

315-
internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflictResolution, LinkedFileMergeSessionResult mergeResult, IEnumerable<Document> documents, CancellationToken cancellationToken)
315+
internal async Task ApplyConflictResolutionEditsAsync(IInlineRenameReplacementInfo conflictResolution, LinkedFileMergeSessionResult mergeResult, IEnumerable<Document> documents, CancellationToken cancellationToken)
316316
{
317317
_session._threadingContext.ThrowIfNotOnUIThread();
318318

@@ -330,7 +330,8 @@ internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflict
330330
var newDocument = mergeResult.MergedSolution.GetDocument(documents.First().Id);
331331
var originalDocument = _baseDocuments.Single(d => d.Id == newDocument.Id);
332332

333-
var changes = GetTextChangesFromTextDifferencingServiceAsync(originalDocument, newDocument, cancellationToken).WaitAndGetResult(cancellationToken);
333+
var changes = await GetTextChangesFromTextDifferencingServiceAsync(
334+
originalDocument, newDocument, cancellationToken).ConfigureAwait(true);
334335

335336
// TODO: why does the following line stop responding when uncommented?
336337
// newDocument.GetTextChangesAsync(this.baseDocuments.Single(d => d.Id == newDocument.Id), cancellationToken).WaitAndGetResult(cancellationToken).Reverse();
@@ -436,18 +437,19 @@ internal void ApplyConflictResolutionEdits(IInlineRenameReplacementInfo conflict
436437

437438
foreach (var document in documents)
438439
{
439-
var relevantReplacements = conflictResolution.GetReplacements(document.Id).Where(r => GetRenameSpanKind(r.Kind) != RenameSpanKind.None);
440+
var relevantReplacements = conflictResolution
441+
.GetReplacements(document.Id)
442+
.Where(r => GetRenameSpanKind(r.Kind) != RenameSpanKind.None)
443+
.ToImmutableArray();
440444
if (!relevantReplacements.Any())
441-
{
442445
continue;
443-
}
444446

445447
var mergedReplacements = linkedDocumentsMightConflict
446-
? GetMergedReplacementInfos(
448+
? await GetMergedReplacementInfosAsync(
447449
relevantReplacements,
448450
conflictResolution.NewSolution.GetDocument(document.Id),
449451
mergeResult.MergedSolution.GetDocument(document.Id),
450-
cancellationToken)
452+
cancellationToken).ConfigureAwait(true)
451453
: relevantReplacements;
452454

453455
// Show merge conflicts comments as unresolvable conflicts, and do not
@@ -578,8 +580,8 @@ private static async Task<IEnumerable<TextChange>> GetTextChangesFromTextDiffere
578580
}
579581
}
580582

581-
private IEnumerable<InlineRenameReplacement> GetMergedReplacementInfos(
582-
IEnumerable<InlineRenameReplacement> relevantReplacements,
583+
private async Task<ImmutableArray<InlineRenameReplacement>> GetMergedReplacementInfosAsync(
584+
ImmutableArray<InlineRenameReplacement> relevantReplacements,
583585
Document preMergeDocument,
584586
Document postMergeDocument,
585587
CancellationToken cancellationToken)
@@ -606,23 +608,27 @@ private IEnumerable<InlineRenameReplacement> GetMergedReplacementInfos(
606608
preMergeDocumentTextString = preMergeDocument.GetTextSynchronously(cancellationToken).ToString();
607609
}
608610

611+
var result = new FixedSizeArrayBuilder<InlineRenameReplacement>(relevantReplacements.Length);
609612
foreach (var replacement in relevantReplacements)
610613
{
611614
var buffer = snapshotSpanToClone.HasValue ? _textBufferCloneService.CloneWithUnknownContentType(snapshotSpanToClone.Value) : _textBufferFactoryService.CreateTextBuffer(preMergeDocumentTextString, contentType);
612615
var trackingSpan = buffer.CurrentSnapshot.CreateTrackingSpan(replacement.NewSpan.ToSpan(), SpanTrackingMode.EdgeExclusive, TrackingFidelityMode.Forward);
613616

614617
using (var edit = _subjectBuffer.CreateEdit(EditOptions.None, null, s_calculateMergedSpansEditTag))
615618
{
616-
foreach (var change in textDiffService.GetTextChangesAsync(preMergeDocument, postMergeDocument, cancellationToken).WaitAndGetResult(cancellationToken))
617-
{
619+
var textChanges = await textDiffService.GetTextChangesAsync(
620+
preMergeDocument, postMergeDocument, cancellationToken).ConfigureAwait(true);
621+
foreach (var change in textChanges)
618622
buffer.Replace(change.Span.ToSpan(), change.NewText);
619-
}
620623

621624
edit.ApplyAndLogExceptions();
622625
}
623626

624-
yield return new InlineRenameReplacement(replacement.Kind, replacement.OriginalSpan, trackingSpan.GetSpan(buffer.CurrentSnapshot).Span.ToTextSpan());
627+
result.Add(new InlineRenameReplacement(
628+
replacement.Kind, replacement.OriginalSpan, trackingSpan.GetSpan(buffer.CurrentSnapshot).Span.ToTextSpan()));
625629
}
630+
631+
return result.MoveToImmutable();
626632
}
627633

628634
private static RenameSpanKind GetRenameSpanKind(InlineRenameReplacementKind kind)

src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -574,9 +574,9 @@ private void QueueApplyReplacements()
574574

575575
// Switch to a background thread for expensive work
576576
await TaskScheduler.Default;
577-
var computedMergeResult = await ComputeMergeResultAsync(replacementInfo, cancellationToken);
578-
await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(alwaysYield: true, cancellationToken);
579-
ApplyReplacements(computedMergeResult.replacementInfo, computedMergeResult.mergeResult, cancellationToken);
577+
var computedMergeResult = await ComputeMergeResultAsync(replacementInfo, cancellationToken).ConfigureAwait(false);
578+
await ApplyReplacementsAsync(
579+
computedMergeResult.replacementInfo, computedMergeResult.mergeResult, cancellationToken).ConfigureAwait(true);
580580
});
581581
replacementOperation.Task.CompletesAsyncOperation(asyncToken);
582582
}
@@ -588,10 +588,10 @@ private void QueueApplyReplacements()
588588
return (replacementInfo, mergeResult);
589589
}
590590

591-
private void ApplyReplacements(IInlineRenameReplacementInfo replacementInfo, LinkedFileMergeSessionResult mergeResult, CancellationToken cancellationToken)
591+
private async Task ApplyReplacementsAsync(
592+
IInlineRenameReplacementInfo replacementInfo, LinkedFileMergeSessionResult mergeResult, CancellationToken cancellationToken)
592593
{
593-
_threadingContext.ThrowIfNotOnUIThread();
594-
cancellationToken.ThrowIfCancellationRequested();
594+
await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
595595

596596
RaiseReplacementsComputed(replacementInfo);
597597

@@ -602,7 +602,8 @@ private void ApplyReplacements(IInlineRenameReplacementInfo replacementInfo, Lin
602602
if (documents.Any())
603603
{
604604
var textBufferManager = _openTextBuffers[textBuffer];
605-
textBufferManager.ApplyConflictResolutionEdits(replacementInfo, mergeResult, documents, cancellationToken);
605+
await textBufferManager.ApplyConflictResolutionEditsAsync(
606+
replacementInfo, mergeResult, documents, cancellationToken).ConfigureAwait(true);
606607
}
607608
}
608609

0 commit comments

Comments
 (0)