提交 2ac8d62a 编写于 作者: C CyrusNajmabadi 提交者: GitHub

Merge pull request #15276 from CyrusNajmabadi/moreFixAll

Move 'Add Braces' to the new FixAll' system.
......@@ -6,6 +6,61 @@ namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.AddBraces
{
public partial class AddBracesTests
{
[Fact]
[Trait(Traits.Feature, Traits.Features.CodeActionsAddBraces)]
[Trait(Traits.Feature, Traits.Features.CodeActionsFixAllOccurrences)]
public async Task TestFixAllInDocument1()
{
var input = @"
class Program1
{
static void Main()
{
{|FixAllInDocument:if|} (true) if (true) return;
}
}
";
var expected = @"
class Program1
{
static void Main()
{
if (true) { if (true) { return; } }
}
}
";
await TestAsync(input, expected);
}
[Fact]
[Trait(Traits.Feature, Traits.Features.CodeActionsAddBraces)]
[Trait(Traits.Feature, Traits.Features.CodeActionsFixAllOccurrences)]
public async Task TestFixAllInDocument2()
{
var input = @"
class Program1
{
static void Main()
{
if (true) {|FixAllInDocument:if|} (true) return;
}
}
";
var expected = @"
class Program1
{
static void Main()
{
if (true) { if (true) { return; } }
}
}
";
await TestAsync(input, expected);
}
[Fact]
[Trait(Traits.Feature, Traits.Features.CodeActionsAddBraces)]
[Trait(Traits.Feature, Traits.Features.CodeActionsFixAllOccurrences)]
......
......@@ -13,7 +13,8 @@ public partial class AddBracesTests : AbstractCSharpDiagnosticProviderBasedUserD
{
internal override Tuple<DiagnosticAnalyzer, CodeFixProvider> CreateDiagnosticProviderAndFixer(Workspace workspace)
{
return new Tuple<DiagnosticAnalyzer, CodeFixProvider>(new CSharpAddBracesDiagnosticAnalyzer(),
return new Tuple<DiagnosticAnalyzer, CodeFixProvider>(
new CSharpAddBracesDiagnosticAnalyzer(),
new CSharpAddBracesCodeFixProvider());
}
......
......@@ -8,38 +8,44 @@
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editing;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Diagnostics.AddBraces
{
[ExportCodeFixProvider(LanguageNames.CSharp, Name = PredefinedCodeFixProviderNames.AddBraces), Shared]
[ExtensionOrder(After = PredefinedCodeFixProviderNames.AddAwait)]
internal class CSharpAddBracesCodeFixProvider : CodeFixProvider
internal class CSharpAddBracesCodeFixProvider : SyntaxEditorBasedCodeFixProvider
{
public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(IDEDiagnosticIds.AddBracesDiagnosticId);
public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
public override ImmutableArray<string> FixableDiagnosticIds
=> ImmutableArray.Create(IDEDiagnosticIds.AddBracesDiagnosticId);
public sealed override Task RegisterCodeFixesAsync(CodeFixContext context)
{
context.RegisterCodeFix(
new MyCodeAction(
FeaturesResources.Add_braces,
c => AddBracesAsync(context, c)),
new MyCodeAction(c => FixAsync(context.Document, context.Diagnostics.First(), c)),
context.Diagnostics);
return SpecializedTasks.EmptyTask;
}
protected async Task<Document> AddBracesAsync(CodeFixContext context, CancellationToken cancellationToken)
protected override Task FixAllAsync(
Document document, ImmutableArray<Diagnostic> diagnostics,
SyntaxEditor editor, CancellationToken cancellationToken)
{
var root = await context.Document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
var diagnostic = context.Diagnostics.First();
var diagnosticSpan = diagnostic.Location.SourceSpan;
var statement = root.FindNode(diagnosticSpan);
var root = editor.OriginalRoot;
foreach (var diagnostic in diagnostics)
{
var statement = root.FindNode(diagnostic.Location.SourceSpan);
var newRoot = root.ReplaceNode(statement, GetReplacementNode(statement));
return context.Document.WithSyntaxRoot(newRoot);
// Use the callback version of ReplaceNode so that we see the effects
// of other replace calls. i.e. we may have statements nested in statements,
// we need to make sure that any inner edits are seen when we make the outer
// replacement.
editor.ReplaceNode(statement, (s, g) => GetReplacementNode(s));
}
return SpecializedTasks.EmptyTask;
}
private SyntaxNode GetReplacementNode(SyntaxNode statement)
......@@ -83,13 +89,13 @@ private SyntaxNode GetReplacementNode(SyntaxNode statement)
return default(SyntaxNode);
}
private SyntaxNode GetNewBlock(SyntaxNode statement, StatementSyntax statementBody) =>
statement.ReplaceNode(statementBody, SyntaxFactory.Block(statementBody));
private SyntaxNode GetNewBlock(SyntaxNode statement, StatementSyntax statementBody)
=> statement.ReplaceNode(statementBody, SyntaxFactory.Block(statementBody));
private class MyCodeAction : CodeAction.DocumentChangeAction
{
public MyCodeAction(string title, Func<CancellationToken, Task<Document>> createChangedDocument) :
base(title, createChangedDocument)
public MyCodeAction(Func<CancellationToken, Task<Document>> createChangedDocument) :
base(FeaturesResources.Add_braces, createChangedDocument, FeaturesResources.Add_braces)
{
}
}
......
......@@ -27,7 +27,8 @@ namespace Microsoft.CodeAnalysis.PopulateSwitch
[ExtensionOrder(After = PredefinedCodeFixProviderNames.ImplementInterface)]
internal class PopulateSwitchCodeFixProvider : CodeFixProvider
{
public override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(IDEDiagnosticIds.PopulateSwitchDiagnosticId);
public override ImmutableArray<string> FixableDiagnosticIds
=> ImmutableArray.Create(IDEDiagnosticIds.PopulateSwitchDiagnosticId);
public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册