我正在创建自定义 roslyn 分析器,以便在我的项目中强制执行自定义代码样式规则。到目前为止,在 .cs 文件的 AI 生成器的帮助下进展顺利。但是我无法让分析器处理 .razor 文件。这是我现在拥有的:
public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
context.RegisterCompilationStartAction(compilationContext
=> compilationContext.RegisterSyntaxTreeAction(AnalyzeRazorFile));
}
private void AnalyzeRazorFile(SyntaxTreeAnalysisContext context)
{
if (!context.Tree.FilePath.EndsWith(".razor") && !context.Tree.FilePath.EndsWith(".cshtml"))
return;
var sourceText = context.Tree.GetText();
var lines = sourceText.Lines;
var zz = CreateDiagnostic(
Location.Create(context.Tree, context.Tree.GetText().Lines[0].Span));
context.ReportDiagnostic(zz);
}
CreateDiagnostic
只是库存上的变形器 Diagnostic.Create
。
目的是验证是否已提出诊断,但这从未发生。我的分析器 csproj 看起来像这样:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<LangVersion>preview</LangVersion>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<PropertyGroup>
<IsPackable>true</IsPackable>
<IncludeBuildOutput>false</IncludeBuildOutput>
<EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>
<NoWarn>RS2008</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.35" />
<PackageReference Include="Microsoft.CodeAnalysis" Version="4.11.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.11.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
</ItemGroup>
<!-- This ensures the library will be packaged as an analyzer -->
<ItemGroup>
<None Include="$(OutputPath)\$(AssemblyName).dll" Pack="true" PackagePath="analyzers/dotnet/cs" Visible="false" />
</ItemGroup>
</Project>
我研究了 dotnet 源,发现了一个应该适用于 razor 的分析器这里。它看起来很相似,但是我找不到其他示例(而且我知道有很多 razor 分析器,因为我在 Blazor 中看到过它们),这让我认为可能是由于 razor 预编译 roslyn 分析器可能导致不被完全支持。如果是这种情况,如何提供诊断?
从 Roslyn 分析器的角度来看,Razor 文件不是语法树,而是通过 RegisterAdditionalFileAction (或类似方法)公开的“附加文件”。