-
Notifications
You must be signed in to change notification settings - Fork 446
/
Copy pathHttpApiDiagnosticAnalyzer.cs
76 lines (72 loc) · 2.78 KB
/
HttpApiDiagnosticAnalyzer.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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Diagnostics;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using WebApiClientCore.Analyzers.Providers;
namespace WebApiClientCore.Analyzers
{
/// <summary>
/// 表示WebApiClient诊断分析器
/// </summary>
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class HttpApiDiagnosticAnalyzer : DiagnosticAnalyzer
{
/// <summary>
/// 获取所支持的诊断
/// </summary>
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics
{
get
{
return ImmutableArray.Create(
Descriptors.AttributeDescriptor,
Descriptors.ReturnTypeDescriptor,
Descriptors.RefParameterDescriptor,
Descriptors.NotMethodDefindedDescriptor,
Descriptors.GenericMethodDescriptor,
Descriptors.UriAttributeDescriptor,
Descriptors.ModifierDescriptor);
}
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="context">上下文</param>
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(syntaxNodeContext =>
{
if (HttpApiContext.TryParse(syntaxNodeContext, out var httpApiContext))
{
if (httpApiContext != null)
{
var diagnostics = this
.GetDiagnosticProviders(httpApiContext)
.SelectMany(d => d.CreateDiagnostics());
foreach (var item in diagnostics)
{
syntaxNodeContext.ReportDiagnostic(item);
}
}
}
}, SyntaxKind.InterfaceDeclaration);
}
/// <summary>
/// 返回所有HttpApi诊断器
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
private IEnumerable<HttpApiDiagnosticProvider> GetDiagnosticProviders(HttpApiContext context)
{
yield return new CtorAttributeDiagnosticProvider(context);
yield return new ReturnTypeDiagnosticProvider(context);
yield return new RefParameterDiagnosticProvider(context);
yield return new NotMethodDefindedDiagnosticProvider(context);
yield return new GenericMethodDiagnosticProvider(context);
yield return new UriAttributeDiagnosticProvider(context);
yield return new ModifierDiagnosticProvider(context);
}
}
}