我正在尝试编写一个实现IIncrementalGenerator
的源生成器。生成器需要读取一个struct
,其中所有属性都是常量,如下所示:
public struct MyStruct
{
public const string Prop1 = "PROP1";
// More properties
}
使用下面的代码,我已经成功地将代码生成到与上面的struct
相同的项目中:
[Generator]
public class MyGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
var structs = context.SyntaxProvider
.CreateSyntaxProvider(
(s, _) => s is StructDeclarationSyntax sds,
(c, _) =>
{
return (c.Node is StructDeclarationSyntax sds && sds.Identifier.Text == "MyStruct")
? sds
: null;
}
)
.Where(x => x != null)
.Collect();
context.RegisterSourceOutput(structs, GenerateSource);
}
private void GenerateSource(SourceProductionContext context, ImmutableArray<StructDeclarationSyntax?> structs)
{
string myCode = // my generated code
context.AddSource($"MyCode.g.cs", myCode);
}
}
现在我想在一个不同的项目中生成额外的代码。对于IncrementalGeneratorInitializationContext
和SourceProductionContext
是否可能?
一些想法:
- 是
AdditionalTextsProvider
的方式去这里吗? - 我应该在其他项目中编写一个新的生成器,并尝试访问原始项目中的
MyStruct
吗?如果有,我该怎么做?
你可能想往相反的方向走。编写源生成器,使其驻留在一个项目中,并扫描项目程序集以及任何引用的程序集。
以这个家伙的项目为例:
https://github.com/martinothamar/Mediator