带有(增量)源生成器的“AttributeData”上的片状“ApplicationSyntaxReference”

Flaky `ApplicationSyntaxReference` on `AttributeData` with (Incremental) Source Generator

提问人:Dima 提问时间:5/29/2023 更新时间:5/29/2023 访问量:45

问:

不幸的是,我没有这个问题的最小样本,但我已经公开推送了 repo,它应该是可重现的:https://github.com/Yeah69/ContainerFeatureSampleComparison

我已经实现了一个源代码生成器,它循环访问引用的程序集,并尝试提取具有特定属性的文件的代码。代码提取如下所示:

var sampleText = attributeData.ApplicationSyntaxReference is {} a 
    ? a.GetSyntax().GetLocation().SourceTree is {} b 
        ? b.GetText().ToString()
        : "InnerNull"
    : "OuterNull";

在某些情况下,这工作正常,在其他情况下则不然。因此,我在这里假设一种奇怪的片状。

我使用 Rider 作为开发 IDE 和 .Net SDK 7.0.302(如果这很重要的话)。

IDE Source Generator 列表中显示的输出工作正常:Does work for the IDE Source Generator Output

然而,生成的文件有问题:Doesn't work for file generated by EmitCompilerGeneratedFiles执行 -project 的 Release 版本时出现同样的情况。 处于错误的情况下一定是错误。但它让我感到困惑,因为对于IDE输出,它似乎工作正常。我感谢对此问题的任何帮助。EmitCompilerGeneratedFilesCompositionattributeData.ApplicationSyntaxReferencenull

Roslyn 源生成器 csharp-source-generator

评论

0赞 Kevin Krumwiede 6/8/2023
它有什么问题?
0赞 Dima 6/8/2023
我希望在第二个代码段中生成的代码与第一个代码片段中的代码相同。这意味着,它应该包含相应代码(关联属性所在的文件的代码)的字符串,而不是“OuterNull”字符串。代码段显示两个位置不同的文件。一个是 Rider 的源生成器预览功能(我认为 VS 也有类似的功能)。另一个由 Roslyn 编译器发出。但它们的内容应该是相同的,因为它们在同一组程序集上使用相同的生成器。为什么它在一个地方有效,但在另一个地方却不行?
0赞 Dima 6/8/2023
但是,我昨天找到了解决方法。不太确定,是否值得成为这个问题的答案,所以我暂时不谈。我的解决方法是将以前的单个生成器拆分为两个生成器。新生成器直接用于引用的程序集,并提取包含属性实例的代码文件。这样一来,它始终有效,而不仅仅是预览功能。

答: 暂无答案