我有一个源生成器,它看起来像这样:
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 文件。这是怎么回事?
最佳答案
根据设计,不可能在定义源生成器的程序集中使用源生成器。根据the design spec :
Generator implementations are defined in external assemblies passed to the compiler using the same
-analyzer:
option used for diagnostic analyzers....
Since generators are loaded from external assemblies, a generator cannot be used to build the assembly in which it is defined.
关于c# - 源生成器在同一项目中看不到类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68081550/