提交 b0ee9f2f 编写于 作者: C CyrusNajmabadi

Merge pull request #9378 from CyrusNajmabadi/flattenGenerateVariableSmartTag

Improve the Generate-Variable code-actions menu experience.

Fixes #5139
......@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.CodeFixes.GenerateVariable;
using Microsoft.CodeAnalysis.CSharp.CodeStyle;
......@@ -21,6 +22,11 @@ public class GenerateVariableTests : AbstractCSharpDiagnosticProviderBasedUserDi
null, new GenerateVariableCodeFixProvider());
}
protected override IList<CodeAction> MassageActions(IList<CodeAction> actions)
{
return FlattenActions(actions);
}
[Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateVariable)]
public async Task TestSimpleLowercaseIdentifier1()
{
......
......@@ -3,6 +3,7 @@
Option Strict Off
Imports System.Threading.Tasks
Imports Microsoft.CodeAnalysis.CodeActions
Imports Microsoft.CodeAnalysis.CodeFixes
Imports Microsoft.CodeAnalysis.Diagnostics
Imports Microsoft.CodeAnalysis.VisualBasic.CodeFixes.GenerateVariable
......@@ -15,6 +16,10 @@ Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Diagnostics.Genera
Return New Tuple(Of DiagnosticAnalyzer, CodeFixProvider)(Nothing, New GenerateVariableCodeFixProvider())
End Function
Protected Overrides Function MassageActions(actions As IList(Of CodeAction)) As IList(Of CodeAction)
Return FlattenActions(actions)
End Function
<Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateVariable)>
Public Async Function TestGenerateSimpleProperty() As Threading.Tasks.Task
Await TestAsync(
......
......@@ -880,6 +880,15 @@ internal class FeaturesResources {
}
}
/// <summary>
/// Looks up a localized string similar to Generate variable.
/// </summary>
internal static string Generate_variable {
get {
return ResourceManager.GetString("Generate_variable", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Generate abstract method &apos;{0}&apos; in &apos;{1}&apos;.
/// </summary>
......
......@@ -885,4 +885,7 @@ Do you want to continue?</value>
<data name="Make_method_synchronous" xml:space="preserve">
<value>Make method synchronous.</value>
</data>
<data name="Generate_variable" xml:space="preserve">
<value>Generate variable</value>
</data>
</root>
\ 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.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
......@@ -45,7 +46,7 @@ protected AbstractGenerateVariableService()
return SpecializedCollections.EmptyEnumerable<CodeAction>();
}
var result = new List<CodeAction>();
var actions = new List<CodeAction>();
var canGenerateMember = CodeGenerator.CanAdd(document.Project.Solution, state.TypeToGenerateIn, cancellationToken);
......@@ -56,24 +57,32 @@ protected AbstractGenerateVariableService()
{
if (canGenerateMember)
{
AddPropertyCodeActions(result, document, state);
AddFieldCodeActions(result, document, state);
AddPropertyCodeActions(actions, document, state);
AddFieldCodeActions(actions, document, state);
}
AddLocalCodeActions(result, document, state);
AddLocalCodeActions(actions, document, state);
}
else
{
if (canGenerateMember)
{
AddFieldCodeActions(result, document, state);
AddPropertyCodeActions(result, document, state);
AddFieldCodeActions(actions, document, state);
AddPropertyCodeActions(actions, document, state);
}
AddLocalCodeActions(result, document, state);
AddLocalCodeActions(actions, document, state);
}
return result;
if (actions.Count > 1)
{
// Wrap the generate variable actions into a single top level suggestion
// so as to not clutter the list.
return SpecializedCollections.SingletonEnumerable(
new MyCodeAction(FeaturesResources.Generate_variable, actions.AsImmutable()));
}
return actions;
}
}
......@@ -136,5 +145,13 @@ private void AddLocalCodeActions(List<CodeAction> result, Document document, Sta
result.Add(new GenerateLocalCodeAction((TService)this, document, state));
}
}
private class MyCodeAction : CodeAction.SimpleCodeAction
{
public MyCodeAction(string title, ImmutableArray<CodeAction> nestedActions)
: base(title, nestedActions)
{
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册