【问题标题】:Why is this incremental source generator invoked when nothing changes为什么在没有任何变化时调用这个增量源生成器
【发布时间】: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


    【解决方案1】:

    原来这是直接引用分析器项目引起的。

    将其打包到 NuGet 包中并引用它时,缓存会按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多