如何为 razor 文件编写 DiagnosticAnalyzer?

Luc*_*key 7 c# razor roslyn-code-analysis

我的目标

我的团队决定,他们希望采用自动化来强制执行 .razor 文件中的编码指南。由于我们已经在使用 StyleCopAnalyzers,我可能会实现我们自己的分析器来实现此目标。

例子

为了更好地让您理解我的想法,请考虑以下示例。

令以下为有效代码:

<MyGrid>
    <MyItem></MyItem>
    <MyItem></MyItem>
    <MyItem></MyItem>
</MyGrid>
Run Code Online (Sandbox Code Playgroud)

现在,如果有人不封装<MyItem><MyGrid>,分析器会报告类似MyItemshould be direct child of a MyGrid的诊断信息。


我尝试过的

首先,我遵循了微软的教程:编写你的第一个分析器和代码修复。这非常有效。

但是,我的下一步是使用默认模板创建示例 Blazor WASM 应用程序。当我在示例 Blazor 应用程序上执行时MakeConstAnalyzer,我会得到以下行为。

修改Program.cs如下:

public class Program
{
    public static async Task Main(string[] args)
    {
        var builder = WebAssemblyHostBuilder.CreateDefault(args);
        builder.RootComponents.Add<App>("#app");

        // I get squiggly lines here with the expected analyzer message from the MakeConstAnalyzer
        int bla = 0; 

        builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

        await builder.Build().RunAsync();
    }
}
Run Code Online (Sandbox Code Playgroud)

但修改Counter.razor如下:

private void IncrementCount()
{
    int bla = 0; // add this line
    currentCount++;
}
Run Code Online (Sandbox Code Playgroud)

现在,这不会显示分析器消息。当然,这会触发编译器警告,但这主要告诉我,由于某种原因,分析器没有在文件上执行Counter.razor

套餐Microsoft.CodeAnalysis.Razor

我想,我应该在这里提一下。我在 Nuget 上找到了它并尝试将其集成到示例中。

警告

我不知道,如果包的目的甚至是远程连接到我想要实现的目标,因为我真的没有找到任何文档。

由于微软教程明确指出,任何分析器都必须以某种方式继承DiagnosticAnalyzer,我还检查了包的实现。但在两者中,Microsoft.CodeAnalysis.RazorMicrosoft.AspNetCore.Razor.LanguagePackage 都没有继承自 的类DiagnosticAnalyzer

我还尝试装饰我的分析器,以指定它还应该解析 *.razor 文件,如下所示:

[DiagnosticAnalyzer(LanguageNames.CSharp, Microsoft.CodeAnalysis.Razor.RazorLanguage.Name)] 
Run Code Online (Sandbox Code Playgroud)

概括

此时,我不知道还能尝试什么。我也没有在网上找到任何类似的东西。

这些是我的问题:

  • 如何指示我的分析器也解析 .razor 文件?
  • 另外,我如何以这种方法访问剃刀代码?
    我可以想象使用分析器语法来遍历组件树,但我认为我可以通过仅使用简单的未解析代码来实现大部分用例。