如何使用Roslyn分析器验证项目属性默认命名空间

5
我想验证仅在项目中可见的属性,这是编译操作上的默认命名空间值。我能找到验证项目引用的功能,但它不提供读取默认项目命名空间的选项。
Roslyn分析器是否可以实现?
编辑:我发现在编译开始时有一些可用的属性,但这并没有提供所需的信息。
context.Compilation.GlobalNamespace.IsNamespace > returns true
context.Compilation.GlobalNamespace.IsGlobalNamespace > returns true
context.Compilation.GlobalNamespace.Name > returns ""
context.Compilation.GlobalNamespace.ToDisplayString() > returns "<global namespace>"

我知道我可以进入每个类并检查命名空间,但这并不适用于我想知道默认项目的命名空间的情况。例如:项目名称为“Project.UnitTests”,程序集为“Project.UnitTests”,默认命名空间为“Project.UnitTest”。默认命名空间与项目名称不匹配,因为项目名称是复数形式,而命名空间是单数形式。

你可以使用MSBuild完成它。 - Paulo Morgado
怎么做?有例子吗? - btomas
我想只检查默认全局命名空间,并在违反规则时显示编译器错误。与 Visual Studio 中显示的任何其他诊断错误相同。就像我为项目的引用检查所做的方式一样。 - btomas
MSBuild Error Task 会导致构建错误。 - Paulo Morgado
不太清楚是否可以按照示例实现。创建一个不符合规则的新项目怎么样?需要取消验证的项目怎么办? - btomas
显示剩余3条评论
1个回答

4
在我的情况下,这是为了C#源代码生成器,而不是分析器,但无论如何我已成功地在我的源代码生成器中获取了目标项目的根命名空间。
详细文档在此处:

https://github.com/dotnet/roslyn/blob/main/docs/features/source-generators.cookbook.md#consume-msbuild-properties-and-metadata

首先,在目标项目文件的项组中声明 <CompilerVisibleProperty> 项(它不是源代码生成器项目文件),以允许您的源代码生成器检索指定的 MSBuild 属性值。在本例中,您应该指定 RootNamespace 属性。
...
<!-- This is the target application's .csproj file -->
<ItemGroup>
  <CompilerVisibleProperty Include="RootNamespace" />
</ItemGroup>
...

之后,您可以通过以下代码获取根命名空间,而不是引用 context.Compilation.GlobalNamespace
...
// This is C# Source Generator's .cs file.
[Generator]
public class MySourceGenerator : ISourceGenerator
{
    public void Execute(GeneratorExecutionContext context)
    {
        context.AnalyzerConfigOptions.GlobalOptions.TryGetValue("build_property.RootNamespace", out var rootNamespace);
        ...

我不确定这段代码是否也适用于C#分析器,但我希望这些信息对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接