提交 8f33c29f 编写于 作者: C CyrusNajmabadi

fixProvider.

上级 3f51cef5
......@@ -38,6 +38,7 @@ internal static class PredefinedCodeFixProviderNames
public const string RemoveUnnecessaryImports = "Remove Unnecessary Usings or Imports";
public const string RenameTracking = "Rename Tracking";
public const string SimplifyNames = "Simplify Names";
public const string SimplifyNullCheck = nameof(SimplifyNullCheck);
public const string SpellCheck = "Spell Check";
public const string Suppression = nameof(Suppression);
public const string AddOverloads = "Add Overloads to member";
......
......@@ -19,6 +19,7 @@ internal static class IDEDiagnosticIds
public const string PreferIntrinsicPredefinedTypeInMemberAccessDiagnosticId = "IDE0013";
public const string PreferFrameworkTypeInDeclarationsDiagnosticId = "IDE0014";
public const string PreferFrameworkTypeInMemberAccessDiagnosticId = "IDE0015";
public const string SimplifyNullCheckDiagnosticId = "IDE0016";
// Analyzer error Ids
public const string AnalyzerChangedId = "IDE1001";
......
......@@ -93,6 +93,7 @@
<Compile Include="AddMissingReference\AbstractAddMissingReferenceCodeFixProvider.cs" />
<Compile Include="AddMissingReference\CodeAction.cs" />
<Compile Include="SimplifyNullCheck\SimplifyNullCheckAnalyzer.cs" />
<Compile Include="SimplifyNullCheck\SimplifyNullCheckCodeFixProvider.cs" />
<Compile Include="Structure\BlockTypes.cs" />
<Compile Include="CodeLens\CodeLensReferencesServiceFactory.cs" />
<Compile Include="Structure\Syntax\BlockStructureExtensions.cs" />
......
......@@ -38,7 +38,8 @@ internal class SimplifyNullCheckAnalyzer : DiagnosticAnalyzer, IBuiltInAnalyzer
private static readonly LocalizableString s_localizableTitle = new LocalizableResourceString(nameof(FeaturesResources.Simplify_null_check), FeaturesResources.ResourceManager, typeof(FeaturesResources));
private static readonly LocalizableString s_localizableMessage = new LocalizableResourceString(nameof(FeaturesResources.Simplify_null_check), WorkspacesResources.ResourceManager, typeof(WorkspacesResources));
private static readonly DiagnosticDescriptor s_descriptor = new DiagnosticDescriptor(IDEDiagnosticIds.PopulateSwitchDiagnosticId,
private static readonly DiagnosticDescriptor s_descriptor = new DiagnosticDescriptor(
IDEDiagnosticIds.SimplifyNullCheckDiagnosticId,
s_localizableTitle,
s_localizableMessage,
DiagnosticCategory.Style,
......@@ -122,8 +123,8 @@ private void AnalyzeOperation(OperationAnalysisContext operationContext)
// Ok, there were no intervening writes. This check+assignment can be simplified.
var allLocations = ImmutableArray.Create(
throwOperation.Syntax.GetLocation(),
expressionStatement.Syntax.GetLocation(),
ifOperation.Syntax.GetLocation(),
throwOperation.ThrownObject.Syntax.GetLocation(),
assignmentExpression.Value.Syntax.GetLocation());
operationContext.ReportDiagnostic(
......
// 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;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Composition;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editing;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.SimplifyNullCheck
{
[ExportCodeFixProvider(LanguageNames.CSharp,
Name = PredefinedCodeFixProviderNames.SimplifyNullCheck), Shared]
internal class SimplifyNullCheckCodeFixProvider : CodeFixProvider
{
public override ImmutableArray<string> FixableDiagnosticIds
=> ImmutableArray.Create(IDEDiagnosticIds.SimplifyNullCheckDiagnosticId);
public override Task RegisterCodeFixesAsync(CodeFixContext context)
{
var diagnostic = context.Diagnostics.First();
context.RegisterCodeFix(
new MyCodeAction(c => FixAsync(context.Document, diagnostic, c)),
diagnostic);
return SpecializedTasks.EmptyTask;
}
private async Task<Document> FixAsync(
Document document,
Diagnostic diagnostic,
CancellationToken cancellationToken)
{
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
var ifStatement = root.FindNode(diagnostic.AdditionalLocations[0].SourceSpan);
var throwStatementExpression = root.FindNode(diagnostic.AdditionalLocations[1].SourceSpan);
var assignmentValue = root.FindNode(diagnostic.AdditionalLocations[2].SourceSpan);
var editor = new SyntaxEditor(root, document.Project.Solution.Workspace);
var generator = editor.Generator;
// First, remote the if-statement entirely.
editor.RemoveNode(ifStatement);
// Now, update the assignemnt value to go from 'a' to 'a ?? throw ...'.
editor.ReplaceNode(assignmentValue,
generator.CoalesceExpression(assignmentValue,
generator.ThrowExpression(throwStatementExpression)));
var newRoot = editor.GetChangedRoot();
return document.WithSyntaxRoot(newRoot);
}
private class MyCodeAction : CodeAction.DocumentChangeAction
{
public MyCodeAction(
Func<CancellationToken, Task<Document>> createChangedDocument)
: base(FeaturesResources.Simplify_null_check, createChangedDocument, FeaturesResources.Simplify_null_check)
{
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册