-
Notifications
You must be signed in to change notification settings - Fork 26
/
Copy pathNullCheckToNullConditionalAnalyzer.cs
59 lines (55 loc) · 2.97 KB
/
NullCheckToNullConditionalAnalyzer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Formatting;
using System.Collections.Immutable;
using Microsoft.CodeAnalysis.Simplification;
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Text;
namespace CSharpEssentials.NullCheckToNullConditional
{
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class NullCheckToNullConditionalAnalyzer : DiagnosticAnalyzer
{
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(DiagnosticDescriptors.UseNullConditionalMemberAccessFadedToken, DiagnosticDescriptors.UseNullConditionalMemberAccess);
private static async void AnalyzeThat(SyntaxNodeAnalysisContext context)
{
var ifStatement = context.Node.FindNode(context.Node.Span, getInnermostNodeForTie: true)?.FirstAncestorOrSelf<IfStatementSyntax>();
try
{
if (await NullCheckToNullConditionalCodeFix.GetCodeFixAsync(() => Task.FromResult(context.SemanticModel), ifStatement) != null)
{
if (ifStatement.SyntaxTree.IsGeneratedCode(context.CancellationToken))
return;
var fadeoutLocations = ImmutableArray.CreateBuilder<Location>();
fadeoutLocations.Add(Location.Create(context.Node.SyntaxTree, TextSpan.FromBounds(ifStatement.IfKeyword.SpanStart, ifStatement.Statement.SpanStart)));
var statementBlock = ifStatement.Statement as BlockSyntax;
if (statementBlock != null)
{
fadeoutLocations.Add(Location.Create(context.Node.SyntaxTree, (statementBlock.OpenBraceToken.Span)));
fadeoutLocations.Add(Location.Create(context.Node.SyntaxTree, (statementBlock.CloseBraceToken.Span)));
}
foreach (var location in fadeoutLocations)
{
context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.UseNullConditionalMemberAccessFadedToken, location));
}
context.ReportDiagnostic(Diagnostic.Create(DiagnosticDescriptors.UseNullConditionalMemberAccess,
Location.Create(context.Node.SyntaxTree, ifStatement.Span)));
}
}
catch (OperationCanceledException ex) when (ex.CancellationToken == context.CancellationToken)
{
// we should ignore cancellation exceptions, instead of blowing up the universe!
}
}
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzeThat, ImmutableArray.Create(SyntaxKind.IfStatement));
}
}
}