提交 bc3fd5fc 编写于 作者: A Allison Chou

Address feedback - add unifying classes

上级 b31f01bc
......@@ -7,6 +7,7 @@
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions;
using Microsoft.VisualStudio.Language.Intellisense;
using Microsoft.VisualStudio.Text;
......@@ -15,9 +16,9 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.Suggestions
/// <summary>
/// Represents light bulb menu item for code fixes.
/// </summary>
internal sealed class CodeFixSuggestedAction : SuggestedActionWithNestedFlavors, ITelemetryDiagnosticID<string>
internal sealed class CodeFixSuggestedAction : SuggestedActionWithNestedFlavors, ICodeFixSuggestedAction, ITelemetryDiagnosticID<string>
{
private readonly CodeFix _fix;
public CodeFix CodeFix { get; }
public CodeFixSuggestedAction(
IThreadingContext threadingContext,
......@@ -31,13 +32,13 @@ internal sealed class CodeFixSuggestedAction : SuggestedActionWithNestedFlavors,
: base(threadingContext, sourceProvider, workspace, subjectBuffer,
provider, action, fixAllFlavors)
{
_fix = fix;
CodeFix = fix;
}
public string GetDiagnosticID()
=> _fix.PrimaryDiagnostic.GetTelemetryDiagnosticID();
=> CodeFix.PrimaryDiagnostic.GetTelemetryDiagnosticID();
protected override DiagnosticData GetDiagnostic()
=> _fix.GetPrimaryDiagnosticData();
=> CodeFix.GetPrimaryDiagnosticData();
}
}
......@@ -5,6 +5,7 @@
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions;
using Microsoft.VisualStudio.Text;
namespace Microsoft.CodeAnalysis.Editor.Implementation.Suggestions
......@@ -12,8 +13,10 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.Suggestions
/// <summary>
/// Represents light bulb menu item for code refactorings.
/// </summary>
internal sealed class CodeRefactoringSuggestedAction : SuggestedActionWithNestedFlavors
internal sealed class CodeRefactoringSuggestedAction : SuggestedActionWithNestedFlavors, ICodeRefactoringSuggestedAction
{
public CodeRefactoringProvider CodeRefactoringProvider { get; }
public CodeRefactoringSuggestedAction(
IThreadingContext threadingContext,
SuggestedActionsSourceProvider sourceProvider,
......@@ -23,6 +26,7 @@ internal sealed class CodeRefactoringSuggestedAction : SuggestedActionWithNested
CodeAction codeAction)
: base(threadingContext, sourceProvider, workspace, subjectBuffer, provider, codeAction)
{
CodeRefactoringProvider = provider;
}
}
}
......@@ -10,6 +10,7 @@
using Microsoft.CodeAnalysis.Editor.Shared.Utilities;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.Shared.Utilities;
using Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions;
using Microsoft.VisualStudio.Language.Intellisense;
using Microsoft.VisualStudio.Text;
......@@ -19,9 +20,9 @@ namespace Microsoft.CodeAnalysis.Editor.Implementation.Suggestions
/// Suggested action for fix all occurrences code fix. Note: this is only used
/// as a 'flavor' inside CodeFixSuggestionAction.
/// </summary>
internal sealed partial class FixAllSuggestedAction : SuggestedAction, ITelemetryDiagnosticID<string>
internal sealed partial class FixAllSuggestedAction : SuggestedAction, ITelemetryDiagnosticID<string>, IFixAllSuggestedAction
{
private readonly Diagnostic _fixedDiagnostic;
public Diagnostic Diagnostic { get; }
/// <summary>
/// The original code-action that we are a fix-all for. i.e. _originalCodeAction
......@@ -29,8 +30,9 @@ internal sealed partial class FixAllSuggestedAction : SuggestedAction, ITelemetr
/// and our <see cref="SuggestedAction.CodeAction"/> is the actual action that
/// will perform the fix in the appropriate document/project/solution scope.
/// </summary>
private readonly CodeAction _originalCodeAction;
private readonly FixAllState _fixAllState;
public CodeAction OriginalCodeAction { get; }
public FixAllState FixAllState { get; }
internal FixAllSuggestedAction(
IThreadingContext threadingContext,
......@@ -43,9 +45,9 @@ internal sealed partial class FixAllSuggestedAction : SuggestedAction, ITelemetr
: base(threadingContext, sourceProvider, workspace, subjectBuffer,
fixAllState.FixAllProvider, new FixAllCodeAction(fixAllState))
{
_fixedDiagnostic = originalFixedDiagnostic;
_originalCodeAction = originalCodeAction;
_fixAllState = fixAllState;
Diagnostic = originalFixedDiagnostic;
OriginalCodeAction = originalCodeAction;
FixAllState = fixAllState;
}
public override bool TryGetTelemetryId(out Guid telemetryId)
......@@ -53,19 +55,19 @@ public override bool TryGetTelemetryId(out Guid telemetryId)
// We get the telemetry id for the original code action we are fixing,
// not the special 'FixAllCodeAction'. that is the .CodeAction this
// SuggestedAction is pointing at.
telemetryId = _originalCodeAction.GetType().GetTelemetryId(_fixAllState.Scope.GetScopeIdForTelemetry());
telemetryId = OriginalCodeAction.GetType().GetTelemetryId(FixAllState.Scope.GetScopeIdForTelemetry());
return true;
}
public string GetDiagnosticID()
=> _fixedDiagnostic.GetTelemetryDiagnosticID();
=> Diagnostic.GetTelemetryDiagnosticID();
protected override void InnerInvoke(
IProgressTracker progressTracker, CancellationToken cancellationToken)
{
this.AssertIsForeground();
using (Logger.LogBlock(FunctionId.CodeFixes_FixAllOccurrencesSession, FixAllLogger.CreateCorrelationLogMessage(_fixAllState.CorrelationId), cancellationToken))
using (Logger.LogBlock(FunctionId.CodeFixes_FixAllOccurrencesSession, FixAllLogger.CreateCorrelationLogMessage(FixAllState.CorrelationId), cancellationToken))
{
base.InnerInvoke(progressTracker, cancellationToken);
}
......
......@@ -252,17 +252,17 @@ ISuggestedAction ConvertToSuggestedAction(IUnifiedSuggestedAction unifiedSuggest
{
UnifiedCodeFixSuggestedAction codeFixAction => new CodeFixSuggestedAction(
ThreadingContext, _owner, codeFixAction.Workspace, _subjectBuffer,
codeFixAction.CodeFix, codeFixAction.Provider, codeFixAction.CodeAction,
codeFixAction.CodeFix, codeFixAction.Provider, codeFixAction.OriginalCodeAction,
ConvertToSuggestedActionSet(codeFixAction.FixAllFlavors)),
UnifiedCodeRefactoringSuggestedAction codeRefactoringAction => new CodeRefactoringSuggestedAction(
ThreadingContext, _owner, codeRefactoringAction.Workspace, _subjectBuffer,
codeRefactoringAction.CodeRefactoringProvider, codeRefactoringAction.CodeAction),
codeRefactoringAction.CodeRefactoringProvider, codeRefactoringAction.OriginalCodeAction),
UnifiedFixAllSuggestedAction fixAllAction => new FixAllSuggestedAction(
ThreadingContext, _owner, fixAllAction.Workspace, _subjectBuffer,
fixAllAction.FixAllState, fixAllAction.Diagnostic, fixAllAction.CodeAction),
fixAllAction.FixAllState, fixAllAction.Diagnostic, fixAllAction.OriginalCodeAction),
UnifiedSuggestedActionWithNestedActions nestedAction => new SuggestedActionWithNestedActions(
ThreadingContext, _owner, nestedAction.Workspace, _subjectBuffer,
nestedAction.Provider ?? this, nestedAction.CodeAction,
nestedAction.Provider ?? this, nestedAction.OriginalCodeAction,
nestedAction.NestedActionSets.SelectAsArray(s => ConvertToSuggestedActionSet(s))),
_ => throw ExceptionUtilities.Unreachable
};
......
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable enable
using Microsoft.CodeAnalysis.CodeFixes;
namespace Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions
{
/// <summary>
/// Common interface used by both local Roslyn and LSP to implement
/// their specific versions of CodeFixSuggestedAction.
/// </summary>
internal interface ICodeFixSuggestedAction
{
public CodeFix CodeFix { get; }
}
}
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable enable
using Microsoft.CodeAnalysis.CodeRefactorings;
namespace Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions
{
/// <summary>
/// Common interface used by both local Roslyn and LSP to implement
/// their specific versions of CodeRefactoringSuggestedAction.
/// </summary>
internal interface ICodeRefactoringSuggestedAction
{
CodeRefactoringProvider CodeRefactoringProvider { get; }
}
}
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
#nullable enable
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
namespace Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions
{
/// <summary>
/// Common interface used by both local Roslyn and LSP to implement
/// their specific versions of FixAllSuggestedAction.
/// </summary>
internal interface IFixAllSuggestedAction
{
Diagnostic Diagnostic { get; }
CodeAction OriginalCodeAction { get; }
FixAllState? FixAllState { get; }
}
}
......@@ -14,7 +14,9 @@ namespace Microsoft.CodeAnalysis.UnifiedSuggestions
internal interface IUnifiedSuggestedAction
{
Workspace Workspace { get; }
CodeAction CodeAction { get; }
CodeAction OriginalCodeAction { get; }
CodeActionPriority CodeActionPriority { get; }
}
}
......@@ -6,14 +6,15 @@
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions;
namespace Microsoft.CodeAnalysis.UnifiedSuggestions
{
/// <summary>
/// Similar to UnifiedCodeFixSuggestionAction, but in a location that can be used by
/// Similar to CodeFixSuggestionAction, but in a location that can be used by
/// both local Roslyn and LSP.
/// </summary>
internal class UnifiedCodeFixSuggestedAction : UnifiedSuggestedAction
internal class UnifiedCodeFixSuggestedAction : UnifiedSuggestedAction, ICodeFixSuggestedAction
{
public CodeFix CodeFix { get; }
......
......@@ -6,6 +6,7 @@
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions;
namespace Microsoft.CodeAnalysis.UnifiedSuggestions
{
......@@ -13,7 +14,7 @@ namespace Microsoft.CodeAnalysis.UnifiedSuggestions
/// Similar to CodeRefactoringSuggestedAction, but in a location that can be used by
/// both local Roslyn and LSP.
/// </summary>
internal class UnifiedCodeRefactoringSuggestedAction : UnifiedSuggestedAction
internal class UnifiedCodeRefactoringSuggestedAction : UnifiedSuggestedAction, ICodeRefactoringSuggestedAction
{
public CodeRefactoringProvider CodeRefactoringProvider { get; }
......
......@@ -6,6 +6,7 @@
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.UnifiedSuggestions.UnifiedSuggestedActions;
namespace Microsoft.CodeAnalysis.UnifiedSuggestions
{
......@@ -13,7 +14,7 @@ namespace Microsoft.CodeAnalysis.UnifiedSuggestions
/// Similar to FixAllSuggestedAction, but in a location that can be used by
/// both local Roslyn and LSP.
/// </summary>
internal class UnifiedFixAllSuggestedAction : UnifiedSuggestedAction
internal class UnifiedFixAllSuggestedAction : UnifiedSuggestedAction, IFixAllSuggestedAction
{
public Diagnostic Diagnostic { get; }
......
......@@ -9,21 +9,21 @@
namespace Microsoft.CodeAnalysis.UnifiedSuggestions
{
/// <summary>
/// Similar to UnifiedSuggestedAction, but in a location that can be used by
/// Similar to SuggestedAction, but in a location that can be used by
/// both local Roslyn and LSP.
/// </summary>
internal class UnifiedSuggestedAction : IUnifiedSuggestedAction
{
public Workspace Workspace { get; }
public CodeAction CodeAction { get; }
public CodeAction OriginalCodeAction { get; }
public CodeActionPriority CodeActionPriority { get; }
public UnifiedSuggestedAction(Workspace workspace, CodeAction codeAction, CodeActionPriority codeActionPriority)
{
Workspace = workspace;
CodeAction = codeAction;
OriginalCodeAction = codeAction;
CodeActionPriority = codeActionPriority;
}
}
......
......@@ -284,14 +284,14 @@ static CodeFixGroupKey GetGroupKey(CodeFix fix)
{
var actions = map[groupKey];
var nonSuppressionActions = actions.Where(a => !IsTopLevelSuppressionAction(a.CodeAction));
var nonSuppressionActions = actions.Where(a => !IsTopLevelSuppressionAction(a.OriginalCodeAction));
AddUnifiedSuggestedActionsSet(nonSuppressionActions, groupKey, nonSuppressionSets);
var suppressionActions = actions.Where(a => IsTopLevelSuppressionAction(a.CodeAction) &&
!IsBulkConfigurationAction(a.CodeAction));
var suppressionActions = actions.Where(a => IsTopLevelSuppressionAction(a.OriginalCodeAction) &&
!IsBulkConfigurationAction(a.OriginalCodeAction));
AddUnifiedSuggestedActionsSet(suppressionActions, groupKey, suppressionSets);
bulkConfigurationActions.AddRange(actions.Where(a => IsBulkConfigurationAction(a.CodeAction)));
bulkConfigurationActions.AddRange(actions.Where(a => IsBulkConfigurationAction(a.OriginalCodeAction)));
}
var sets = nonSuppressionSets.ToImmutable();
......@@ -667,7 +667,7 @@ private static UnifiedSuggestedActionSet InlineActions(UnifiedSuggestedActionSet
var actionWithNestedActions = action as UnifiedSuggestedActionWithNestedActions;
// Only inline if the underlying code action allows it.
if (actionWithNestedActions?.CodeAction.IsInlinable == true)
if (actionWithNestedActions?.OriginalCodeAction.IsInlinable == true)
{
newActions.AddRange(actionWithNestedActions.NestedActionSets.SelectMany(set => set.Actions));
}
......@@ -709,7 +709,7 @@ private static UnifiedSuggestedActionSet InlineActions(UnifiedSuggestedActionSet
foreach (var action in set.Actions)
{
if (seenTitles.Add(action.CodeAction.Title))
if (seenTitles.Add(action.OriginalCodeAction.Title))
{
actions.Add(action);
}
......
......@@ -52,7 +52,7 @@ internal static class CodeActionHelpers
foreach (var suggestedAction in set.Actions)
{
// Filter out code actions with options since they'll show dialogs and we can't remote the UI and the options.
if (suggestedAction.CodeAction is CodeActionWithOptions)
if (suggestedAction.OriginalCodeAction is CodeActionWithOptions)
{
continue;
}
......@@ -88,13 +88,9 @@ internal static class CodeActionHelpers
nestedActions.Add(GenerateVSCodeAction(request, action, codeActionKind, currentTitle));
}
// WPF uses the first underscore to create keyboard shortcuts, so we have to insert an extra underscore
// wherever there's an underscore for it to be displayed properly.
var title = codeAction.Title.Replace("_", "__");
return new VSCodeAction
{
Title = title,
Title = codeAction.Title,
Kind = codeActionKind,
Diagnostics = request.Context.Diagnostics,
Children = nestedActions.ToArray(),
......@@ -129,7 +125,7 @@ internal static class CodeActionHelpers
foreach (var suggestedAction in set.Actions)
{
// Filter out code actions with options since they'll show dialogs and we can't remote the UI and the options.
if (suggestedAction.CodeAction is CodeActionWithOptions)
if (suggestedAction.OriginalCodeAction is CodeActionWithOptions)
{
continue;
}
......@@ -146,7 +142,7 @@ internal static class CodeActionHelpers
/// </summary>
private static CodeAction GetNestedActionsFromActionSet(IUnifiedSuggestedAction suggestedAction)
{
var codeAction = suggestedAction.CodeAction;
var codeAction = suggestedAction.OriginalCodeAction;
if (!(suggestedAction is UnifiedSuggestedActionWithNestedActions suggestedActionWithNestedActions))
{
return codeAction;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册