我有一个源生成器,它看起来像这样:
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 文件。到底是怎么回事?