在.net6增量源生成器的上下文中,IncrementalValuesProvider.WithTrackingName(字符串名称(方法做什么?
此外,如何/何时使用?
[Generator]
public class MyGenerator : IIncrementalGenerator
{
var incremntalValueProvider = context.SyntaxProvider
.CreateSyntaxProvider(predicate: (n, c) => { ... }, transform: (s, c) => { ... });
incremntalValueProvider = incremntalValueProvider.WithTrackingName("Some tracking name");
}
对于大多数关于源代码生成器的事情,我已经能够在谷歌上搜索并使用一些尝试和错误来了解事情是如何工作的。然而,对于这种特殊的方法,这些止痛并没有帮助。此外,Micrsofts的文档似乎已经过时了,因为https://github.com/dotnet/roslyn/blob/main/docs/features/incremental-generators.md甚至没有提及该方法。
WithTrackingName
方法用于增量源生成器的单元测试。使用它,您可以为管道的每个步骤指定一个名称,在运行生成器后,您可以使用该名称来检查特定步骤的输出(即状态(。
有关更完整的解释,请参阅本期:https://github.com/dotnet/roslyn/issues/54832
以下是链接问题的示例代码:
class MyGenerator : IIncrementalGenerator
{
...
}
...
GeneratorDriver driver = CSharpGeneratorDriver.Create(new [] { new MyGenerator().AsSourceGenerator() }, null, null, null, new GeneratorDriverOptions(IncrementalGeneratorOutputKind.None, true));
Compilation comp1 = ...;
// Run the generators once to set up the baseline cached results.
driver = driver.RunGenerators(comp1);
Compilation comp2 = comp1.AddSyntaxTrees(...);
driver.RunGenerators(comp2);
GeneratorRunResult steps = driver.GetRunResult().Results[0];
Assert.Equal(IncrementalStepRunReason.Modified, steps.TrackedSteps["Calculate State"][0].Outputs[0].Reason);
Assert.Equal(IncrementalStepRunReason.Cached, steps.TrackedSteps["Generate Code"][0].Outputs[0].Reason);