提交 d9fe66e6 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #15091 from CyrusNajmabadi/changeSigWaitDialog

Show a cancellable wait-dialog when invoking change-signature manually.

Fixes #4891
......@@ -5,7 +5,6 @@
using System.Collections.Immutable;
using System.Diagnostics;
using System.Threading;
using Microsoft.CodeAnalysis.Semantics;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis
......
......@@ -85,7 +85,7 @@
<Compile Include="BraceMatching\CSharpDirectiveTriviaBraceMatcher.cs" />
<Compile Include="BraceMatching\StringLiteralBraceMatcher.cs" />
<Compile Include="CallHierarchy\CallHierarchyCommandHandler.cs" />
<Compile Include="ChangeSignature\ChangeSignatureCommandHandler.cs" />
<Compile Include="ChangeSignature\CSharpChangeSignatureCommandHandler.cs" />
<Compile Include="Classification\CSharpEditorClassificationService.cs" />
<Compile Include="CommentSelection\CSharpCommentUncommentService.cs" />
<Compile Include="ContentType\ContentTypeDefinitions.cs" />
......@@ -182,4 +182,4 @@
</ItemGroup>
<ItemGroup />
<Import Project="..\..\..\build\Targets\Imports.targets" />
</Project>
</Project>
\ No newline at end of file
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.ComponentModel.Composition;
using Microsoft.CodeAnalysis.Editor.Host;
using Microsoft.CodeAnalysis.Editor.Implementation.ChangeSignature;
namespace Microsoft.CodeAnalysis.Editor.CSharp.ChangeSignature
{
[ExportCommandHandler(PredefinedCommandHandlerNames.ChangeSignature, ContentTypeNames.CSharpContentType)]
internal class ChangeSignatureCommandHandler : AbstractChangeSignatureCommandHandler
internal class CSharpChangeSignatureCommandHandler : AbstractChangeSignatureCommandHandler
{
[ImportingConstructor]
public CSharpChangeSignatureCommandHandler(IWaitIndicator waitIndicator)
: base(waitIndicator)
{
}
}
}
}
\ No newline at end of file
......@@ -9,6 +9,7 @@
using Microsoft.CodeAnalysis.Editor.Implementation.Interactive;
using Microsoft.CodeAnalysis.Editor.UnitTests;
using Microsoft.CodeAnalysis.Editor.UnitTests.ChangeSignature;
using Microsoft.CodeAnalysis.Editor.UnitTests.Utilities;
using Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces;
using Roslyn.Test.Utilities;
using Xunit;
......@@ -290,7 +291,7 @@ class C
var textView = workspace.Documents.Single().GetTextView();
var handler = new ChangeSignatureCommandHandler();
var handler = new CSharpChangeSignatureCommandHandler(TestWaitIndicator.Default);
var delegatedToNext = false;
Func<CommandState> nextHandler = () =>
{
......@@ -309,4 +310,4 @@ class C
}
}
}
}
}
\ No newline at end of file
......@@ -18,15 +18,19 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.ChangeSignature
{
internal abstract class AbstractChangeSignatureCommandHandler : ICommandHandler<ReorderParametersCommandArgs>, ICommandHandler<RemoveParametersCommandArgs>
{
public CommandState GetCommandState(ReorderParametersCommandArgs args, Func<CommandState> nextHandler)
private readonly IWaitIndicator _waitIndicator;
protected AbstractChangeSignatureCommandHandler(
IWaitIndicator waitIndicator)
{
return GetCommandState(args.SubjectBuffer, nextHandler);
_waitIndicator = waitIndicator;
}
public CommandState GetCommandState(ReorderParametersCommandArgs args, Func<CommandState> nextHandler)
=> GetCommandState(args.SubjectBuffer, nextHandler);
public CommandState GetCommandState(RemoveParametersCommandArgs args, Func<CommandState> nextHandler)
{
return GetCommandState(args.SubjectBuffer, nextHandler);
}
=> GetCommandState(args.SubjectBuffer, nextHandler);
private static CommandState GetCommandState(ITextBuffer subjectBuffer, Func<CommandState> nextHandler)
{
......@@ -47,16 +51,12 @@ private static CommandState GetCommandState(ITextBuffer subjectBuffer, Func<Comm
}
public void ExecuteCommand(RemoveParametersCommandArgs args, Action nextHandler)
{
ExecuteCommand(args.TextView, args.SubjectBuffer, nextHandler);
}
=> ExecuteCommand(args.TextView, args.SubjectBuffer, nextHandler);
public void ExecuteCommand(ReorderParametersCommandArgs args, Action nextHandler)
{
ExecuteCommand(args.TextView, args.SubjectBuffer, nextHandler);
}
=> ExecuteCommand(args.TextView, args.SubjectBuffer, nextHandler);
private static void ExecuteCommand(ITextView textView, ITextBuffer subjectBuffer, Action nextHandler)
private void ExecuteCommand(ITextView textView, ITextBuffer subjectBuffer, Action nextHandler)
{
var document = subjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges();
if (document == null)
......@@ -87,13 +87,24 @@ private static void ExecuteCommand(ITextView textView, ITextBuffer subjectBuffer
return;
}
// Reorder parameters is not cancellable.
var reorderParametersService = document.GetLanguageService<AbstractChangeSignatureService>();
var result = reorderParametersService.ChangeSignature(
document,
caretPoint.Value.Position,
(errorMessage, severity) => workspace.Services.GetService<INotificationService>().SendNotification(errorMessage, severity: severity),
CancellationToken.None);
ChangeSignatureResult result = null;
var waitResult = _waitIndicator.Wait(
FeaturesResources.Change_signature,
allowCancel: true,
action: w =>
{
var reorderParametersService = document.GetLanguageService<AbstractChangeSignatureService>();
result = reorderParametersService.ChangeSignature(
document,
caretPoint.Value.Position,
(errorMessage, severity) => workspace.Services.GetService<INotificationService>().SendNotification(errorMessage, severity: severity),
w.CancellationToken);
});
if (waitResult == WaitIndicatorResult.Canceled)
{
return;
}
if (result == null || !result.Succeeded)
{
......
......@@ -8,8 +8,9 @@ namespace Microsoft.CodeAnalysis.Editor.Shared.Extensions
internal static class IWaitIndicatorExtensions
{
public static WaitIndicatorResult Wait(this IWaitIndicator waitIndicator, string titleAndMessage, bool allowCancel, Action<IWaitContext> action)
{
return waitIndicator.Wait(titleAndMessage, titleAndMessage, allowCancel, action);
}
=> waitIndicator.Wait(titleAndMessage, titleAndMessage, allowCancel, action);
public static WaitIndicatorResult Wait(this IWaitIndicator waitIndicator, string titleAndMessage, bool allowCancel, bool showProgress, Action<IWaitContext> action)
=> waitIndicator.Wait(titleAndMessage, titleAndMessage, allowCancel, showProgress, action);
}
}
}
\ No newline at end of file
......@@ -78,7 +78,7 @@
<Compile Include="BraceMatching\VisualBasicDirectiveTriviaBraceMatcher.vb" />
<Compile Include="BraceMatching\StringLiteralBraceMatcher.vb" />
<Compile Include="CallHierarchy\CallHierarchyCommandHandler.vb" />
<Compile Include="ChangeSignature\ChangeSignatureCommandHandler.vb" />
<Compile Include="ChangeSignature\VisualBasicChangeSignatureCommandHandler.vb" />
<Compile Include="Classification\VisualBasicEditorClassificationService.vb" />
<Compile Include="CommentSelection\VisualBasicCommentUncommentService.vb" />
<Compile Include="ContentType\ContentTypeDefinitions.vb" />
......@@ -227,4 +227,4 @@
<PublicAPI Include="PublicAPI.Unshipped.txt" />
</ItemGroup>
<Import Project="..\..\..\build\Targets\Imports.targets" />
</Project>
</Project>
\ No newline at end of file
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.ComponentModel.Composition
Imports Microsoft.CodeAnalysis.Editor.Host
Imports Microsoft.CodeAnalysis.Editor.Implementation.ChangeSignature
Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.ChangeSignature
<ExportCommandHandler(PredefinedCommandHandlerNames.ChangeSignature, ContentTypeNames.VisualBasicContentType)>
Friend Class ChangeSignatureCommandHandler
Friend Class VisualBasicChangeSignatureCommandHandler
Inherits AbstractChangeSignatureCommandHandler
<ImportingConstructor>
Public Sub New(waitIndicator As IWaitIndicator)
MyBase.New(waitIndicator)
End Sub
End Class
End Namespace
End Namespace
\ No newline at end of file
......@@ -4,6 +4,7 @@ Imports Microsoft.CodeAnalysis.Editor.Implementation.Interactive
Imports Microsoft.CodeAnalysis.Editor.UnitTests
Imports Microsoft.CodeAnalysis.Editor.UnitTests.ChangeSignature
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Utilities
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.CodeAnalysis.Editor.VisualBasic.ChangeSignature
......@@ -114,7 +115,7 @@ End Module
Dim textView = workspace.Documents.Single().GetTextView()
Dim handler = New ChangeSignatureCommandHandler()
Dim handler = New VisualBasicChangeSignatureCommandHandler(TestWaitIndicator.Default)
Dim delegatedToNext = False
Dim nextHandler =
Function()
......
......@@ -19,10 +19,7 @@ public ChangeSignatureCodeAction(AbstractChangeSignatureService changeSignatureS
_context = context;
}
public override string Title
{
get { return FeaturesResources.Change_signature; }
}
public override string Title => FeaturesResources.Change_signature;
public override object GetOptions(CancellationToken cancellationToken)
{
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册