1

我有一个源生成器,它看起来像这样:

public class Generator : ISourceGenerator
{

    public Generator()
    {
        // Uncomment if you want to debug this
        Debugger.Launch();
    }
    public void Initialize(GeneratorInitializationContext context)
    {
        context.RegisterForSyntaxNotifications(() => new MySyntaxReceiver());
    }

    public void Execute(GeneratorExecutionContext context)
    {
        var syntaxReceiver = (MySyntaxReceiver)context.SyntaxReceiver;

        var responseMessageClasses = syntaxReceiver.ResponseMessageClasses;
        // do stuff to responseMessageClasses
    }
}

internal class MySyntaxReceiver : ISyntaxReceiver
{
    public List<ClassDeclarationSyntax> ResponseMessageClasses { get; private set; } = new List<ClassDeclarationSyntax>();

    public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
    {
        if (syntaxNode is ClassDeclarationSyntax cds &&
            cds.Identifier.ValueText.EndsWith("ResponseMessage", StringComparison.OrdinalIgnoreCase))
        {
            ResponseMessageClasses.Add(cds);
        }
    }
}

在同一个项目中,我有一个简单类的文件夹,其名称都以“ResponseMessage”结尾。这些类只有简单的类型,如 string、int 和 bool 作为属性。它们与 SourceGenerator 位于不同的命名空间中。

还有第二个控制台应用程序项目将我的源代码生成器引用为分析器。当我构建项目时,我可以成功地闯入 SourceGenerator 代码。

问题:我拥有的 SyntaxReceiver 类永远不会看到简单的 ResponseMessage 类。该OnVisitSyntaxNode方法仅命中 Program.cs 文件。到底是怎么回事?

4

1 回答 1

1

按照设计,不可能在定义源代码的程序集中使用源代码生成器。根据设计规范

生成器实现在传递给编译器的外部程序集中定义,使用与-analyzer:诊断分析器相同的选项。

...

由于生成器是从外部程序集加载的,因此生成器不能用于构建定义它的程序集。

于 2021-11-27T03:57:46.097 回答