繁体   English   中英

C# 增量源生成器缓存错误?

[英]C# Incremental Source Generator caching bug?

我试图通过制作一个简单的生成器来了解新的 Roslyn 增量源生成器,该生成器在一个名为 InvokedMethods.g.cs 的文件中列出所有调用的方法。

几乎可以工作,但在 Visual Studio 中键入时出现问题。 或者更具体地说,在删除最后一个方法调用时,因为源生成器不会像我期望的那样生成空文件。

要么我不完全理解 CreateSyntaxProvider 应该如何工作(这很可能),否则 Visual Studio 2022 实现中存在错误?

[Generator]
public class ListMethodInvocationsGenerator : IIncrementalGenerator
{
    public void Initialize(IncrementalGeneratorInitializationContext context)
    {
        IncrementalValueProvider<ImmutableArray<string>> invokedMethodsProvider = context.SyntaxProvider.CreateSyntaxProvider(
                predicate: (node, _) => node is InvocationExpressionSyntax,
                transform: (ctx, _) => (ctx.SemanticModel.GetSymbolInfo(ctx.Node).Symbol)?.Name ?? "<< method not found >>")
            .Collect();

        context.RegisterSourceOutput(invokedMethodsProvider, (SourceProductionContext spc, ImmutableArray<string> invokedMethods) =>
        {
            var src = new StringBuilder();
            foreach (var method in invokedMethods)
            {
                src.AppendLine("// " + method);
            }
            spc.AddSource("InvokedMethods.g.cs", src.ToString());
        });
    }
}

如果没有 InvocationExpressions,则不会调用 RegisterSourceOutput 的委托。 如果你想要一个空白的 output 文件,你可以为 CompilationUnitSyntax 添加一个谓词和转换。 这将允许您在没有找到方法时生成空白文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM