【问题标题】:Source Generator not seeing classes in same project源生成器在同一个项目中看不到类
【发布时间】:2021-06-22 10:05:05
【问题描述】:

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

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 文件。怎么回事?

【问题讨论】:

    标签: c# sourcegenerators


    【解决方案1】:

    根据设计,不能在定义源的程序集中使用源生成器。根据the design spec

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

    ...

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

    【讨论】:

    • 是的!我也意识到了这一点,但忘了回答我自己的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多