Skip to content

Commit 928c0d7

Browse files
committed
feat: Add provider WpfAnalyzersProvider
1 parent 631676c commit 928c0d7

File tree

2 files changed

+75
-1
lines changed

2 files changed

+75
-1
lines changed

src/Atc.CodingRules.AnalyzerProviders/AnalyzerProviderCollector.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,13 @@ public static string[] GetAllBaseRuleProviderNames()
2323
SecurityCodeScanVs2019Provider.Name,
2424
StyleCopAnalyzersProvider.Name,
2525
SonarAnalyzerCSharpProvider.Name,
26+
WpfAnalyzersProvider.Name,
2627
};
2728

2829
return list.ToArray();
2930
}
3031

32+
[SuppressMessage("Design", "MA0051:Method is too long", Justification = "OK.")]
3133
public async Task<Collection<AnalyzerProviderBaseRuleData>> CollectAllBaseRules(
3234
ProviderCollectingMode providerCollectingMode,
3335
bool logWithAnsiConsoleMarkup)
@@ -64,6 +66,9 @@ public async Task<Collection<AnalyzerProviderBaseRuleData>> CollectAllBaseRules(
6466
var sonarAnalyzerCSharpProvider = new SonarAnalyzerCSharpProvider(logger, logWithAnsiConsoleMarkup);
6567
var sonarAnalyzerCSharpTask = sonarAnalyzerCSharpProvider.CollectBaseRules(providerCollectingMode);
6668

69+
var wpfAnalyzersProvider = new WpfAnalyzersProvider(logger, logWithAnsiConsoleMarkup);
70+
var wpfAnalyzersProviderTask = wpfAnalyzersProvider.CollectBaseRules(providerCollectingMode);
71+
6772
await Task.WhenAll(
6873
asyncFixerTask,
6974
asyncifyTask,
@@ -74,7 +79,8 @@ await Task.WhenAll(
7479
microsoftVisualStudioThreadingAnalyzersProviderTask,
7580
securityCodeScanVs2019Task,
7681
styleCopAnalyzersTask,
77-
sonarAnalyzerCSharpTask);
82+
sonarAnalyzerCSharpTask,
83+
wpfAnalyzersProviderTask);
7884

7985
data.Add(await asyncFixerTask);
8086
data.Add(await asyncifyTask);
@@ -86,6 +92,7 @@ await Task.WhenAll(
8692
data.Add(await securityCodeScanVs2019Task);
8793
data.Add(await styleCopAnalyzersTask);
8894
data.Add(await sonarAnalyzerCSharpTask);
95+
data.Add(await wpfAnalyzersProviderTask);
8996

9097
return data;
9198
}
@@ -121,5 +128,8 @@ public void CacheCleanup()
121128

122129
var sonarAnalyzerCSharpProvider = new SonarAnalyzerCSharpProvider(logger);
123130
sonarAnalyzerCSharpProvider.Cleanup();
131+
132+
var wpfAnalyzersProvider = new WpfAnalyzersProvider(logger);
133+
wpfAnalyzersProvider.Cleanup();
124134
}
125135
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
namespace Atc.CodingRules.AnalyzerProviders.Providers;
2+
3+
public class WpfAnalyzersProvider : AnalyzerProviderBase
4+
{
5+
private const int TableColumnId = 0;
6+
private const int TableColumnTitle = 1;
7+
8+
public WpfAnalyzersProvider(
9+
ILogger logger,
10+
bool logWithAnsiConsoleMarkup = false)
11+
: base(
12+
logger,
13+
logWithAnsiConsoleMarkup)
14+
{
15+
}
16+
17+
public static string Name => "WpfAnalyzersProvider";
18+
19+
public override Uri? DocumentationLink { get; set; } = new ("https://github.com/DotNetAnalyzers/WpfAnalyzers", UriKind.Absolute);
20+
21+
protected override AnalyzerProviderBaseRuleData CreateData()
22+
=> new (Name);
23+
24+
protected override async Task ReCollect(
25+
AnalyzerProviderBaseRuleData data)
26+
{
27+
ArgumentNullException.ThrowIfNull(data);
28+
29+
var web = new HtmlWeb();
30+
var htmlDoc = await web.LoadFromWebAsync(DocumentationLink!.AbsoluteUri).ConfigureAwait(false);
31+
var articleNode = htmlDoc.DocumentNode.SelectNodes("//article[@class='markdown-body entry-content container-lg']").First();
32+
var articleTableRows = articleNode.SelectNodes("//*//table[1]//tr").ToList();
33+
34+
foreach (var row in articleTableRows)
35+
{
36+
if (row.SelectNodes("td") is null)
37+
{
38+
continue;
39+
}
40+
41+
var cells = row.SelectNodes("td").ToList();
42+
if (cells.Count <= 0)
43+
{
44+
continue;
45+
}
46+
47+
var aHrefNode = cells[TableColumnId].SelectSingleNode("a");
48+
if (aHrefNode is null)
49+
{
50+
continue;
51+
}
52+
53+
var code = aHrefNode.InnerText;
54+
var title = HtmlEntity.DeEntitize(cells[TableColumnTitle].InnerText);
55+
var link = aHrefNode.Attributes["href"].Value;
56+
57+
data.Rules.Add(
58+
new Rule(
59+
code,
60+
title,
61+
link));
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)