From 631263eb75f10a43fd88111342ec12e101ddfb30 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Fri, 23 Aug 2024 19:00:39 -0700 Subject: [PATCH 01/10] Always take ownership from UIThreadContext --- .../AbstractRenameCommandHandler.cs | 12 +++++++----- ...ameCommandHandler_BackspaceDeleteHandler.cs | 4 ++-- ...ractRenameCommandHandler_CutPasteHandler.cs | 4 ++-- ...eCommandHandler_MoveSelectedLinesHandler.cs | 4 ++-- ...enameCommandHandler_OpenLineAboveHandler.cs | 3 ++- ...enameCommandHandler_OpenLineBelowHandler.cs | 3 ++- ...andHandler_RefactoringWithCommandHandler.cs | 8 ++++---- ...stractRenameCommandHandler_RenameHandler.cs | 18 ++++++++++-------- ...AbstractRenameCommandHandler_SaveHandler.cs | 1 + .../AbstractRenameCommandHandler_TabHandler.cs | 2 +- ...ractRenameCommandHandler_TypeCharHandler.cs | 2 +- 11 files changed, 34 insertions(+), 27 deletions(-) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs index 3a54313a64f99..bf820ea3a281e 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs @@ -11,6 +11,7 @@ using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Editor.Commanding; +using Microsoft.VisualStudio.Utilities; namespace Microsoft.CodeAnalysis.Editor.Implementation.InlineRename; @@ -55,7 +56,7 @@ private CommandState GetCommandState(Func nextHandler) private CommandState GetCommandState() => _renameService.ActiveSession != null ? CommandState.Available : CommandState.Unspecified; - private void HandlePossibleTypingCommand(TArgs args, Action nextHandler, Action actionIfInsideActiveSpan) + private void HandlePossibleTypingCommand(TArgs args, Action nextHandler, IUIThreadOperationContext operationContext, Action actionIfInsideActiveSpan) where TArgs : EditorCommandArgs { if (_renameService.ActiveSession == null) @@ -85,7 +86,7 @@ private void HandlePossibleTypingCommand(TArgs args, Action nextHandler, // It's in a read-only area that is open, so let's commit the rename // and then let the character go through - CommitIfActiveAndCallNextHandler(args, nextHandler); + CommitIfActiveAndCallNextHandler(args, nextHandler, operationContext); } else { @@ -94,12 +95,13 @@ private void HandlePossibleTypingCommand(TArgs args, Action nextHandler, } } - private void CommitIfActive(EditorCommandArgs args) + private void CommitIfActive(EditorCommandArgs args, IUIThreadOperationContext operationContext) { if (_renameService.ActiveSession != null) { var selection = args.TextView.Selection.VirtualSelectedSpans.First(); + operationContext.TakeOwnership(); _renameService.ActiveSession.Commit(); var translatedSelection = selection.TranslateTo(args.TextView.TextBuffer.CurrentSnapshot); @@ -108,9 +110,9 @@ private void CommitIfActive(EditorCommandArgs args) } } - private void CommitIfActiveAndCallNextHandler(EditorCommandArgs args, Action nextHandler) + private void CommitIfActiveAndCallNextHandler(EditorCommandArgs args, Action nextHandler, IUIThreadOperationContext operationContext) { - CommitIfActive(args); + CommitIfActive(args, operationContext); nextHandler(); } } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs index 21c6c04c1dea9..026c33e9d3a1a 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs @@ -21,7 +21,7 @@ public CommandState GetCommandState(DeleteKeyCommandArgs args, Func + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { var caretPoint = args.TextView.GetCaretPoint(args.SubjectBuffer); if (!args.TextView.Selection.IsEmpty || caretPoint.Value != span.Start) @@ -33,7 +33,7 @@ public void ExecuteCommand(BackspaceKeyCommandArgs args, Action nextHandler, Com public void ExecuteCommand(DeleteKeyCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { var caretPoint = args.TextView.GetCaretPoint(args.SubjectBuffer); if (!args.TextView.Selection.IsEmpty || caretPoint.Value != span.End) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs index 3448d2eda764c..7664922074cfe 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs @@ -16,7 +16,7 @@ public CommandState GetCommandState(CutCommandArgs args, Func next public void ExecuteCommand(CutCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { nextHandler(); }); @@ -27,7 +27,7 @@ public CommandState GetCommandState(PasteCommandArgs args, Func ne public void ExecuteCommand(PasteCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { nextHandler(); }); diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_MoveSelectedLinesHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_MoveSelectedLinesHandler.cs index ffee45ee36f18..e9a140815a143 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_MoveSelectedLinesHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_MoveSelectedLinesHandler.cs @@ -15,7 +15,7 @@ public CommandState GetCommandState(MoveSelectedLinesUpCommandArgs args) public bool ExecuteCommand(MoveSelectedLinesUpCommandArgs args, CommandExecutionContext context) { - CommitIfActive(args); + CommitIfActive(args, context.OperationContext); return false; } @@ -24,7 +24,7 @@ public CommandState GetCommandState(MoveSelectedLinesDownCommandArgs args) public bool ExecuteCommand(MoveSelectedLinesDownCommandArgs args, CommandExecutionContext context) { - CommitIfActive(args); + CommitIfActive(args, context.OperationContext); return false; } } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs index 6670627524316..462cce31a9801 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs @@ -15,8 +15,9 @@ public CommandState GetCommandState(OpenLineAboveCommandArgs args, Func + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { + context.OperationContext.TakeOwnership(); activeSession.Commit(); nextHandler(); }); diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs index e8649fbf5577c..40c67c9901c4e 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs @@ -15,8 +15,9 @@ public CommandState GetCommandState(OpenLineBelowCommandArgs args, Func + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { + context.OperationContext.TakeOwnership(); activeSession.Commit(); nextHandler(); }); diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RefactoringWithCommandHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RefactoringWithCommandHandler.cs index 8c403e0d14712..a3413138c2e74 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RefactoringWithCommandHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RefactoringWithCommandHandler.cs @@ -18,7 +18,7 @@ public CommandState GetCommandState(ReorderParametersCommandArgs args) public bool ExecuteCommand(ReorderParametersCommandArgs args, CommandExecutionContext context) { - CommitIfActive(args); + CommitIfActive(args, context.OperationContext); return false; } @@ -27,7 +27,7 @@ public CommandState GetCommandState(RemoveParametersCommandArgs args) public bool ExecuteCommand(RemoveParametersCommandArgs args, CommandExecutionContext context) { - CommitIfActive(args); + CommitIfActive(args, context.OperationContext); return false; } @@ -36,7 +36,7 @@ public CommandState GetCommandState(ExtractInterfaceCommandArgs args) public bool ExecuteCommand(ExtractInterfaceCommandArgs args, CommandExecutionContext context) { - CommitIfActive(args); + CommitIfActive(args, context.OperationContext); return false; } @@ -45,7 +45,7 @@ public CommandState GetCommandState(EncapsulateFieldCommandArgs args) public bool ExecuteCommand(EncapsulateFieldCommandArgs args, CommandExecutionContext context) { - CommitIfActive(args); + CommitIfActive(args, context.OperationContext); return false; } } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs index 25d0fb76612a0..e8a6de4856fac 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs @@ -14,6 +14,7 @@ using Microsoft.CodeAnalysis.Text; using Microsoft.VisualStudio.Commanding; using Microsoft.VisualStudio.Text.Editor.Commanding.Commands; +using Microsoft.VisualStudio.Utilities; namespace Microsoft.CodeAnalysis.Editor.Implementation.InlineRename; @@ -43,11 +44,11 @@ public bool ExecuteCommand(RenameCommandArgs args, CommandExecutionContext conte } var token = _listener.BeginAsyncOperation(nameof(ExecuteCommand)); - _ = ExecuteCommandAsync(args).CompletesAsyncOperation(token); + _ = ExecuteCommandAsync(args, context.OperationContext).CompletesAsyncOperation(token); return true; } - private async Task ExecuteCommandAsync(RenameCommandArgs args) + private async Task ExecuteCommandAsync(RenameCommandArgs args, IUIThreadOperationContext uIThreadOperationContext) { _threadingContext.ThrowIfNotOnUIThread(); @@ -63,12 +64,6 @@ private async Task ExecuteCommandAsync(RenameCommandArgs args) return; } - var backgroundWorkIndicatorFactory = workspace.Services.GetRequiredService(); - using var context = backgroundWorkIndicatorFactory.Create( - args.TextView, - args.TextView.GetTextElementSpan(caretPoint.Value), - EditorFeaturesResources.Finding_token_to_rename); - // If there is already an active session, commit it first if (_renameService.ActiveSession != null) { @@ -81,11 +76,18 @@ private async Task ExecuteCommandAsync(RenameCommandArgs args) } else { + uIThreadOperationContext.TakeOwnership(); // Otherwise, commit the existing session and start a new one. _renameService.ActiveSession.Commit(); } } + var backgroundWorkIndicatorFactory = workspace.Services.GetRequiredService(); + using var context = backgroundWorkIndicatorFactory.Create( + args.TextView, + args.TextView.GetTextElementSpan(caretPoint.Value), + EditorFeaturesResources.Finding_token_to_rename); + var cancellationToken = context.UserCancellationToken; var document = await args diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs index 4a9bb0c50b1e1..b55293198c0ab 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs @@ -16,6 +16,7 @@ public bool ExecuteCommand(SaveCommandArgs args, CommandExecutionContext context { if (_renameService.ActiveSession != null) { + context.OperationContext.TakeOwnership(); _renameService.ActiveSession.Commit(); SetFocusToTextView(args.TextView); } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs index b7cff5b4ed1c7..617c93af5e5e1 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs @@ -26,7 +26,7 @@ public void ExecuteCommand(TabKeyCommandArgs args, Action nextHandler, CommandEx return; } - HandlePossibleTypingCommand(args, nextHandler, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { var spans = new NormalizedSnapshotSpanCollection( activeSession.GetBufferManager(args.SubjectBuffer) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs index 6b1da07bed52b..9368a55d1fcf1 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs @@ -19,7 +19,7 @@ public CommandState GetCommandState(TypeCharCommandArgs args, Func public void ExecuteCommand(TypeCharCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => { var document = args.SubjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges(); if (document == null) From 5cc06f9f010a2903a058d650950ab8ad3a41c848 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 11:21:06 -0700 Subject: [PATCH 02/10] Add comment --- .../Core/InlineRename/InlineRenameSession.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs b/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs index 458d62ac88cf2..b6c7021f6d05d 100644 --- a/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs +++ b/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs @@ -723,6 +723,10 @@ void DismissUIAndRollbackEdits() } } + /// + /// This method would create its own UIThreadOperationContext to handle cancellation. + /// Caller must make sure to call IUIThreadOperationContext.TakeOwnership() before calling this, otherwise it won't be able to cancel the rename operation. + /// public void Commit(bool previewChanges = false) => CommitSynchronously(previewChanges); @@ -738,6 +742,10 @@ private bool CommitSynchronously(bool previewChanges) return _threadingContext.JoinableTaskFactory.Run(() => CommitWorkerAsync(previewChanges, canUseBackgroundWorkIndicator: false)); } + /// + /// This method would create its own UIThreadOperationContext to handle cancellation. + /// Caller must make sure to call IUIThreadOperationContext.TakeOwnership() before calling this, otherwise it won't be able to cancel the rename operation. + /// public async Task CommitAsync(bool previewChanges) { if (this.RenameService.GlobalOptions.GetOption(InlineRenameSessionOptionsStorage.RenameAsynchronously)) From f96221d09f75476a1a747ba59cbff49483b1f028 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 11:43:43 -0700 Subject: [PATCH 03/10] Move call to single function --- .../CommandHandlers/RenameCommandHandler.cs | 4 ++-- .../AbstractRenameCommandHandler.cs | 16 ++++++++++++---- ...enameCommandHandler_BackspaceDeleteHandler.cs | 4 ++-- ...stractRenameCommandHandler_CutPasteHandler.cs | 4 ++-- ...tRenameCommandHandler_OpenLineAboveHandler.cs | 5 ++--- ...tRenameCommandHandler_OpenLineBelowHandler.cs | 5 ++--- ...AbstractRenameCommandHandler_RenameHandler.cs | 3 +-- ...AbstractRenameCommandHandler_ReturnHandler.cs | 4 ++-- .../AbstractRenameCommandHandler_SaveHandler.cs | 3 +-- .../AbstractRenameCommandHandler_TabHandler.cs | 2 +- ...stractRenameCommandHandler_TypeCharHandler.cs | 2 +- 11 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs b/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs index 57f249768fa80..3cd9016fafcdd 100644 --- a/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs +++ b/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs @@ -94,11 +94,11 @@ protected override void SetAdornmentFocusToPreviousElement(ITextView textView) } } - protected override void Commit(InlineRenameSession activeSession, ITextView textView) + protected override void CommitAndSetFocus(InlineRenameSession activeSession, ITextView textView) { try { - base.Commit(activeSession, textView); + base.CommitAndSetFocus(activeSession, textView); } catch (NotSupportedException ex) { diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs index bf820ea3a281e..275ced4c6c261 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs @@ -12,6 +12,7 @@ using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Editor.Commanding; using Microsoft.VisualStudio.Utilities; +using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.Editor.Implementation.InlineRename; @@ -56,7 +57,7 @@ private CommandState GetCommandState(Func nextHandler) private CommandState GetCommandState() => _renameService.ActiveSession != null ? CommandState.Available : CommandState.Unspecified; - private void HandlePossibleTypingCommand(TArgs args, Action nextHandler, IUIThreadOperationContext operationContext, Action actionIfInsideActiveSpan) + private void HandlePossibleTypingCommand(TArgs args, Action nextHandler, IUIThreadOperationContext operationContext, Action actionIfInsideActiveSpan) where TArgs : EditorCommandArgs { if (_renameService.ActiveSession == null) @@ -79,7 +80,7 @@ private void HandlePossibleTypingCommand(TArgs args, Action nextHandler, if (_renameService.ActiveSession.TryGetContainingEditableSpan(singleSpan.Start, out var containingSpan) && containingSpan.Contains(singleSpan)) { - actionIfInsideActiveSpan(_renameService.ActiveSession, containingSpan); + actionIfInsideActiveSpan(_renameService.ActiveSession, operationContext, containingSpan); } else if (_renameService.ActiveSession.IsInOpenTextBuffer(singleSpan.Start)) { @@ -101,8 +102,7 @@ private void CommitIfActive(EditorCommandArgs args, IUIThreadOperationContext op { var selection = args.TextView.Selection.VirtualSelectedSpans.First(); - operationContext.TakeOwnership(); - _renameService.ActiveSession.Commit(); + Commit(operationContext); var translatedSelection = selection.TranslateTo(args.TextView.TextBuffer.CurrentSnapshot); args.TextView.Selection.Select(translatedSelection.Start, translatedSelection.End); @@ -115,4 +115,12 @@ private void CommitIfActiveAndCallNextHandler(EditorCommandArgs args, Action nex CommitIfActive(args, operationContext); nextHandler(); } + + private void Commit(IUIThreadOperationContext operationContext) + { + // Take ownership from editor to make sure it can rename commit could be controlled by its own IUIThreadOperationContext + operationContext.TakeOwnership(); + RoslynDebug.AssertNotNull(_renameService.ActiveSession); + _renameService.ActiveSession.Commit(); + } } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs index 026c33e9d3a1a..d068c352e5600 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_BackspaceDeleteHandler.cs @@ -21,7 +21,7 @@ public CommandState GetCommandState(DeleteKeyCommandArgs args, Func + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, _, span) => { var caretPoint = args.TextView.GetCaretPoint(args.SubjectBuffer); if (!args.TextView.Selection.IsEmpty || caretPoint.Value != span.Start) @@ -33,7 +33,7 @@ public void ExecuteCommand(BackspaceKeyCommandArgs args, Action nextHandler, Com public void ExecuteCommand(DeleteKeyCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, _, span) => { var caretPoint = args.TextView.GetCaretPoint(args.SubjectBuffer); if (!args.TextView.Selection.IsEmpty || caretPoint.Value != span.End) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs index 7664922074cfe..89affbfabdeb9 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_CutPasteHandler.cs @@ -16,7 +16,7 @@ public CommandState GetCommandState(CutCommandArgs args, Func next public void ExecuteCommand(CutCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, _, span) => { nextHandler(); }); @@ -27,7 +27,7 @@ public CommandState GetCommandState(PasteCommandArgs args, Func ne public void ExecuteCommand(PasteCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, _, span) => { nextHandler(); }); diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs index 462cce31a9801..830552a35e14c 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineAboveHandler.cs @@ -15,10 +15,9 @@ public CommandState GetCommandState(OpenLineAboveCommandArgs args, Func + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, operationContext, span) => { - context.OperationContext.TakeOwnership(); - activeSession.Commit(); + Commit(operationContext); nextHandler(); }); } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs index 40c67c9901c4e..5bb99425cdae2 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_OpenLineBelowHandler.cs @@ -15,10 +15,9 @@ public CommandState GetCommandState(OpenLineBelowCommandArgs args, Func + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, operationContext, span) => { - context.OperationContext.TakeOwnership(); - activeSession.Commit(); + Commit(operationContext); nextHandler(); }); } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs index e8a6de4856fac..90e2f61c8c399 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs @@ -76,9 +76,8 @@ private async Task ExecuteCommandAsync(RenameCommandArgs args, IUIThreadOperatio } else { - uIThreadOperationContext.TakeOwnership(); // Otherwise, commit the existing session and start a new one. - _renameService.ActiveSession.Commit(); + Commit(uIThreadOperationContext); } } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs index 5cb04c3f18579..2834a1a9caf2e 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs @@ -21,14 +21,14 @@ public bool ExecuteCommand(ReturnKeyCommandArgs args, CommandExecutionContext co // InlineRenameSession will call IUIThreadOperationExecutor to sets up our own IUIThreadOperationContext context.OperationContext.TakeOwnership(); - Commit(_renameService.ActiveSession, args.TextView); + CommitAndSetFocus(_renameService.ActiveSession, args.TextView); return true; } return false; } - protected virtual void Commit(InlineRenameSession activeSession, ITextView textView) + protected virtual void CommitAndSetFocus(InlineRenameSession activeSession, ITextView textView) { activeSession.Commit(); SetFocusToTextView(textView); diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs index b55293198c0ab..132c8d0f42a5d 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_SaveHandler.cs @@ -16,8 +16,7 @@ public bool ExecuteCommand(SaveCommandArgs args, CommandExecutionContext context { if (_renameService.ActiveSession != null) { - context.OperationContext.TakeOwnership(); - _renameService.ActiveSession.Commit(); + Commit(context.OperationContext); SetFocusToTextView(args.TextView); } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs index 617c93af5e5e1..9846afad5f315 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TabHandler.cs @@ -26,7 +26,7 @@ public void ExecuteCommand(TabKeyCommandArgs args, Action nextHandler, CommandEx return; } - HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, _, span) => { var spans = new NormalizedSnapshotSpanCollection( activeSession.GetBufferManager(args.SubjectBuffer) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs index 9368a55d1fcf1..d154e4f9fc438 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_TypeCharHandler.cs @@ -19,7 +19,7 @@ public CommandState GetCommandState(TypeCharCommandArgs args, Func public void ExecuteCommand(TypeCharCommandArgs args, Action nextHandler, CommandExecutionContext context) { - HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, span) => + HandlePossibleTypingCommand(args, nextHandler, context.OperationContext, (activeSession, _, span) => { var document = args.SubjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges(); if (document == null) From 6181bc3e887607345850176b59d632ec0d99fef6 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 11:50:18 -0700 Subject: [PATCH 04/10] Put assert --- .../CommandHandlers/AbstractRenameCommandHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs index 275ced4c6c261..2af0ecc1637cd 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs @@ -118,9 +118,9 @@ private void CommitIfActiveAndCallNextHandler(EditorCommandArgs args, Action nex private void Commit(IUIThreadOperationContext operationContext) { + RoslynDebug.AssertNotNull(_renameService.ActiveSession); // Take ownership from editor to make sure it can rename commit could be controlled by its own IUIThreadOperationContext operationContext.TakeOwnership(); - RoslynDebug.AssertNotNull(_renameService.ActiveSession); _renameService.ActiveSession.Commit(); } } From 4112c210f5d918a416d2bd63dcfbeec4446084c4 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 11:53:24 -0700 Subject: [PATCH 05/10] Also let return handler use the function --- .../CommandHandlers/RenameCommandHandler.cs | 2 +- .../CommandHandlers/AbstractRenameCommandHandler.cs | 3 ++- .../AbstractRenameCommandHandler_ReturnHandler.cs | 11 ++++------- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs b/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs index 3cd9016fafcdd..b0c8888abc488 100644 --- a/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs +++ b/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs @@ -94,7 +94,7 @@ protected override void SetAdornmentFocusToPreviousElement(ITextView textView) } } - protected override void CommitAndSetFocus(InlineRenameSession activeSession, ITextView textView) + protected override void CommitAndSetFocus(InlineRenameSession activeSession, ITextView textView, IUIThreadOperationContext operationContext) { try { diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs index 2af0ecc1637cd..b79327c16c91c 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs @@ -119,7 +119,8 @@ private void CommitIfActiveAndCallNextHandler(EditorCommandArgs args, Action nex private void Commit(IUIThreadOperationContext operationContext) { RoslynDebug.AssertNotNull(_renameService.ActiveSession); - // Take ownership from editor to make sure it can rename commit could be controlled by its own IUIThreadOperationContext + // Prevent Editor's typing responsiveness auto canceling the rename operation. + // InlineRenameSession will call IUIThreadOperationExecutor to sets up our own IUIThreadOperationContext operationContext.TakeOwnership(); _renameService.ActiveSession.Commit(); } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs index 2834a1a9caf2e..db18065f46759 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_ReturnHandler.cs @@ -5,6 +5,7 @@ using Microsoft.VisualStudio.Commanding; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Editor.Commanding.Commands; +using Microsoft.VisualStudio.Utilities; namespace Microsoft.CodeAnalysis.Editor.Implementation.InlineRename; @@ -17,20 +18,16 @@ public bool ExecuteCommand(ReturnKeyCommandArgs args, CommandExecutionContext co { if (_renameService.ActiveSession != null) { - // Prevent Editor's typing responsiveness auto canceling the rename operation. - // InlineRenameSession will call IUIThreadOperationExecutor to sets up our own IUIThreadOperationContext - context.OperationContext.TakeOwnership(); - - CommitAndSetFocus(_renameService.ActiveSession, args.TextView); + CommitAndSetFocus(_renameService.ActiveSession, args.TextView, context.OperationContext); return true; } return false; } - protected virtual void CommitAndSetFocus(InlineRenameSession activeSession, ITextView textView) + protected virtual void CommitAndSetFocus(InlineRenameSession activeSession, ITextView textView, IUIThreadOperationContext operationContext) { - activeSession.Commit(); + Commit(operationContext); SetFocusToTextView(textView); } } From 672264bd802a4fb44f807d1a68d3689c4eb8e4c8 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 11:59:49 -0700 Subject: [PATCH 06/10] Rename --- .../AbstractRenameCommandHandler_RenameHandler.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs index 90e2f61c8c399..8fce77aa75c2b 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler_RenameHandler.cs @@ -48,7 +48,7 @@ public bool ExecuteCommand(RenameCommandArgs args, CommandExecutionContext conte return true; } - private async Task ExecuteCommandAsync(RenameCommandArgs args, IUIThreadOperationContext uIThreadOperationContext) + private async Task ExecuteCommandAsync(RenameCommandArgs args, IUIThreadOperationContext editorOperationContext) { _threadingContext.ThrowIfNotOnUIThread(); @@ -77,7 +77,7 @@ private async Task ExecuteCommandAsync(RenameCommandArgs args, IUIThreadOperatio else { // Otherwise, commit the existing session and start a new one. - Commit(uIThreadOperationContext); + Commit(editorOperationContext); } } From c221d37ebf18a580bd3649e849e577429408d281 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 14:08:14 -0700 Subject: [PATCH 07/10] Fix build --- .../InlineRename/CommandHandlers/RenameCommandHandler.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs b/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs index b0c8888abc488..9283a50c0bf08 100644 --- a/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs +++ b/src/EditorFeatures/Core.Wpf/InlineRename/CommandHandlers/RenameCommandHandler.cs @@ -98,7 +98,7 @@ protected override void CommitAndSetFocus(InlineRenameSession activeSession, ITe { try { - base.CommitAndSetFocus(activeSession, textView); + base.CommitAndSetFocus(activeSession, textView, operationContext); } catch (NotSupportedException ex) { From d35453f9f3d9d738e0c1e5c78bba5d412fe19749 Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 15:54:58 -0700 Subject: [PATCH 08/10] Put context in commit method --- .../ExtractMethodCommandHandler.cs | 2 +- .../Core/IInlineRenameSession.cs | 3 +- .../AbstractRenameCommandHandler.cs | 2 -- .../Core/InlineRename/InlineRenameSession.cs | 29 +++++++++++-------- .../LineCommit/CommitTestData.vb | 3 +- 5 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/EditorFeatures/Core/ExtractMethod/ExtractMethodCommandHandler.cs b/src/EditorFeatures/Core/ExtractMethod/ExtractMethodCommandHandler.cs index ef1fb91477479..4c5351e60b5c7 100644 --- a/src/EditorFeatures/Core/ExtractMethod/ExtractMethodCommandHandler.cs +++ b/src/EditorFeatures/Core/ExtractMethod/ExtractMethodCommandHandler.cs @@ -88,7 +88,7 @@ public bool ExecuteCommand(ExtractMethodCommandArgs args, CommandExecutionContex // wait indicator for Extract Method if (_renameService.ActiveSession != null) { - _threadingContext.JoinableTaskFactory.Run(() => _renameService.ActiveSession.CommitAsync(previewChanges: false)); + _threadingContext.JoinableTaskFactory.Run(() => _renameService.ActiveSession.CommitAsync(previewChanges: false, context.OperationContext)); } if (!args.SubjectBuffer.SupportsRefactorings()) diff --git a/src/EditorFeatures/Core/IInlineRenameSession.cs b/src/EditorFeatures/Core/IInlineRenameSession.cs index 431a1f6491f0d..36bc73cebd506 100644 --- a/src/EditorFeatures/Core/IInlineRenameSession.cs +++ b/src/EditorFeatures/Core/IInlineRenameSession.cs @@ -6,6 +6,7 @@ using System.Threading; using System.Threading.Tasks; +using Microsoft.VisualStudio.Utilities; namespace Microsoft.CodeAnalysis.Editor; @@ -50,5 +51,5 @@ internal interface IInlineRenameSession /// /// Dismisses the rename session, completing the rename operation across all files. /// - Task CommitAsync(bool previewChanges); + Task CommitAsync(bool previewChanges, IUIThreadOperationContext editorOperationContext = null); } diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs index b79327c16c91c..5db002fc67199 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs @@ -119,8 +119,6 @@ private void CommitIfActiveAndCallNextHandler(EditorCommandArgs args, Action nex private void Commit(IUIThreadOperationContext operationContext) { RoslynDebug.AssertNotNull(_renameService.ActiveSession); - // Prevent Editor's typing responsiveness auto canceling the rename operation. - // InlineRenameSession will call IUIThreadOperationExecutor to sets up our own IUIThreadOperationContext operationContext.TakeOwnership(); _renameService.ActiveSession.Commit(); } diff --git a/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs b/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs index b6c7021f6d05d..3f04e517b89ad 100644 --- a/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs +++ b/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs @@ -724,45 +724,50 @@ void DismissUIAndRollbackEdits() } /// - /// This method would create its own UIThreadOperationContext to handle cancellation. - /// Caller must make sure to call IUIThreadOperationContext.TakeOwnership() before calling this, otherwise it won't be able to cancel the rename operation. + /// Caller should pass in the IUIThreadOperationContext if it is called from editor so rename commit operation could set up the its own context correctly. /// - public void Commit(bool previewChanges = false) - => CommitSynchronously(previewChanges); + public void Commit(bool previewChanges = false, IUIThreadOperationContext editorOperationContext = null) + => CommitSynchronously(previewChanges, editorOperationContext); /// if the rename operation was committed, otherwise - private bool CommitSynchronously(bool previewChanges) + private bool CommitSynchronously(bool previewChanges, IUIThreadOperationContext operationContext = null) { // We're going to synchronously block the UI thread here. So we can't use the background work indicator (as // it needs the UI thread to update itself. This will force us to go through the Threaded-Wait-Dialog path // which at least will allow the user to cancel the rename if they want. // // In the future we should remove this entrypoint and have all callers use CommitAsync instead. - return _threadingContext.JoinableTaskFactory.Run(() => CommitWorkerAsync(previewChanges, canUseBackgroundWorkIndicator: false)); + return _threadingContext.JoinableTaskFactory.Run(() => CommitWorkerAsync(previewChanges, canUseBackgroundWorkIndicator: false, operationContext)); } /// - /// This method would create its own UIThreadOperationContext to handle cancellation. - /// Caller must make sure to call IUIThreadOperationContext.TakeOwnership() before calling this, otherwise it won't be able to cancel the rename operation. + /// Caller should pass in the IUIThreadOperationContext if it is called from editor so rename commit operation could set up the its own context correctly. /// - public async Task CommitAsync(bool previewChanges) + public async Task CommitAsync(bool previewChanges, IUIThreadOperationContext editorOperationContext = null) { if (this.RenameService.GlobalOptions.GetOption(InlineRenameSessionOptionsStorage.RenameAsynchronously)) { - await CommitWorkerAsync(previewChanges, canUseBackgroundWorkIndicator: true).ConfigureAwait(false); + await CommitWorkerAsync(previewChanges, canUseBackgroundWorkIndicator: true, editorOperationContext).ConfigureAwait(false); } else { - CommitSynchronously(previewChanges); + CommitSynchronously(previewChanges, editorOperationContext); } } /// if the rename operation was committed, otherwise - private async Task CommitWorkerAsync(bool previewChanges, bool canUseBackgroundWorkIndicator) + private async Task CommitWorkerAsync(bool previewChanges, bool canUseBackgroundWorkIndicator, IUIThreadOperationContext editorUIOperationContext) { await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(); + if (editorUIOperationContext is not null) + { + // Prevent Editor's typing responsiveness auto canceling the rename operation. + // InlineRenameSession will call IUIThreadOperationExecutor to sets up our own IUIThreadOperationContext + editorUIOperationContext.TakeOwnership(); + } + VerifyNotDismissed(); // If the identifier was deleted (or didn't change at all) then cancel the operation. diff --git a/src/EditorFeatures/VisualBasicTest/LineCommit/CommitTestData.vb b/src/EditorFeatures/VisualBasicTest/LineCommit/CommitTestData.vb index a97faa06717eb..a59c2e7eeffb4 100644 --- a/src/EditorFeatures/VisualBasicTest/LineCommit/CommitTestData.vb +++ b/src/EditorFeatures/VisualBasicTest/LineCommit/CommitTestData.vb @@ -16,6 +16,7 @@ Imports Microsoft.CodeAnalysis.Text.Shared.Extensions Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Operations +Imports Microsoft.VisualStudio.Utilities Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.LineCommit Friend Class CommitTestData @@ -111,7 +112,7 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.LineCommit Throw New NotImplementedException() End Sub - Public Function CommitAsync(previewChanges As Boolean) As Task Implements IInlineRenameSession.CommitAsync + Public Function CommitAsync(previewChanges As Boolean, Optional editorOperationContext As IUIThreadOperationContext = Nothing) As Task Implements IInlineRenameSession.CommitAsync Throw New NotImplementedException() End Function End Class From 73c2f8564ccd1677cb17635c71c9805ad7fcfb5b Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 15:58:58 -0700 Subject: [PATCH 09/10] Add parameter --- .../CommandHandlers/AbstractRenameCommandHandler.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs index 5db002fc67199..327254149e670 100644 --- a/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs +++ b/src/EditorFeatures/Core/InlineRename/CommandHandlers/AbstractRenameCommandHandler.cs @@ -119,7 +119,6 @@ private void CommitIfActiveAndCallNextHandler(EditorCommandArgs args, Action nex private void Commit(IUIThreadOperationContext operationContext) { RoslynDebug.AssertNotNull(_renameService.ActiveSession); - operationContext.TakeOwnership(); - _renameService.ActiveSession.Commit(); + _renameService.ActiveSession.Commit(previewChanges: false, operationContext); } } From 23a72fb033c0e79c42a6d7bdc3e8cd1951b5c59a Mon Sep 17 00:00:00 2001 From: Shen Chen Date: Tue, 27 Aug 2024 16:25:57 -0700 Subject: [PATCH 10/10] Put the method after the check --- .../Core/InlineRename/InlineRenameSession.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs b/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs index 3f04e517b89ad..bc22473d91a88 100644 --- a/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs +++ b/src/EditorFeatures/Core/InlineRename/InlineRenameSession.cs @@ -761,13 +761,6 @@ public async Task CommitAsync(bool previewChanges, IUIThreadOperationContext edi private async Task CommitWorkerAsync(bool previewChanges, bool canUseBackgroundWorkIndicator, IUIThreadOperationContext editorUIOperationContext) { await _threadingContext.JoinableTaskFactory.SwitchToMainThreadAsync(); - if (editorUIOperationContext is not null) - { - // Prevent Editor's typing responsiveness auto canceling the rename operation. - // InlineRenameSession will call IUIThreadOperationExecutor to sets up our own IUIThreadOperationContext - editorUIOperationContext.TakeOwnership(); - } - VerifyNotDismissed(); // If the identifier was deleted (or didn't change at all) then cancel the operation. @@ -788,6 +781,13 @@ private async Task CommitWorkerAsync(bool previewChanges, bool canUseBackg previewChanges = previewChanges || PreviewChanges; + if (editorUIOperationContext is not null) + { + // Prevent Editor's typing responsiveness auto canceling the rename operation. + // InlineRenameSession will call IUIThreadOperationExecutor to sets up our own IUIThreadOperationContext + editorUIOperationContext.TakeOwnership(); + } + try { if (canUseBackgroundWorkIndicator)