【发布时间】:2023-01-19 01:12:32
【问题描述】:
以下源代码生成器在初始化时创建一个新的记录类型。 然后在另一步中选择该类型的符号,并生成一个带有时间戳的虚拟文件。
由于基础记录类型仅在初始化时生成一次,并且此后不再更改,因此我希望下一个转换步骤仅被调用一次。但是,每次我在我的 IDE (Rider 2022.3.1) 中输入任何内容时,它似乎都会更新,即每次都会使用更新的时间戳重新生成 test2.g.cs。
为什么会发生这种情况 - 我如何才能防止这些不必要的更新?
public class TestGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
// Create test1.g.cs on initialization
context.RegisterPostInitializationOutput(context => context.AddSource("test1.g.cs", "public record TestRecord();"));
// Find the type symbol for the previously generated record, and generate test2.g.cs based on this
context.RegisterSourceOutput(
context.SyntaxProvider.CreateSyntaxProvider(
static (context, _) => context is RecordDeclarationSyntax s && s.Identifier.Text.Equals("TestRecord"),
static (context, _) => context.SemanticModel.GetDeclaredSymbol(context.Node) as INamedTypeSymbol
).Where(x => x is not null),
(context, symbol) => context.AddSource("test2.g.gs", $"// Found: {symbol is not null} at {DateTime.UtcNow}")
);
}
}
【问题讨论】:
标签: c# roslyn sourcegenerators