问题标签 [sourcegenerators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
77 浏览

c# - Net6 Json 源生成器忽略模型属性

我正在尝试将新的 NET6 JSON 源代码生成与最少的 API 相结合,以尝试最大化性能。我有一个我试图与 Source Generation 一起使用的模型,它必须包含来自该库的引用属性:Microsoft.EntityFrameworkCore.SqlServer.NetTopologySuite

我从库中收到此错误:

我想忽略整个属性,而不是将其包含在源代码生成中。那可能吗?

我的最小 API 代码如下所示: https ://github.com/aherrick/Net6JsonSourceGenerator

0 投票
1 回答
270 浏览

c# - 使用带有自定义 JsonConverter 的 System.Text.Json 源生成器

自定义类如何与源生成器JsonConverter<>一起使用?System.Text.Json

我想调用JsonSerializer.Deserialize<MyType[]>()它不会回退到基于反射的实现并使用自定义MyTypeJsonParser : JsonConverter<MyType>.

编辑澄清:自定义转换器是为 实现的MyType,但 json 包含一个对象数组MyType。因此,我想创建JsonSerializerContext反序列arrayMyType对象(MyType[])的源生成,使用生成的代码反序列化array部分和手动转换器反序列MyType化对象部分。

旧代码(不使用源代码生成器)通过将自定义转换器添加到JsonSerializerOptions.Converters.

但是,经过进一步研究,我发现Converters. 文档JsonSourceGenerationOptionsAttribute中的表格还指出,并且在序列化优化模式不受支持。因此,目前(.NET 6)似乎不可能将自定义转换器与 json 源生成器混合。JsonConverterAttributeJsonSerializerOptions.Converters

文档不清楚,至少元数据收集源生成模式是否可以使用JsonConverterAttribute.

0 投票
0 回答
338 浏览

c# - 如何使增量源生成器在 Visual Studio 中运行?

我按照文档创建了一个基本的增量源生成器,它输出标有属性的类的副本:

源代码生成本身工作得很好,但是在将它与 Visual Studio 2022 一起使用时遇到了两个问题:

  • 源代码生成器仅在构建期间执行。
  • 在我重新启动 Visual Studio 之前,Intellisense 不会获取生成的代码。
    • 我可以通过将生成的源文件写入项目目录来解决这个问题,但这并不理想,并且仍然受到上述问题的影响:在我尝试构建之前,更改不会反映出来。

例如,如果我Foo使用 [Copy] 属性创建一个新类,然后尝试Copy_Foo在我的代码中引用,Visual Studio 将显示一个Copy_Foo未定义的错误。

构建此代码将成功,但 Visual Studio 将继续认为Copy_Foo不存在。一旦我重新启动,它就会知道它的Copy_Foo存在,但是在我再次重新启动之前,它的任何更改都不会被拾取。

我创建了一个小示例,它仅输出 [Copy] 属性。

第一个项目包含源生成器:

第二个消耗生成器:

如果创建没有 的 TestSourceGenerator.Test 项目ProjectReference,在 Visual Studio 中打开它,然后编辑项目文件以引用分析器,你会看到 Visual Studio 在 上显示错误[Generated.CopyAttribute],但项目构建成功。

有什么方法可以让 Visual Studio 在 IDE 中运行我的源代码生成器并从生成的代码中获取符号?根据文档,这似乎应该是一个受支持的用例,甚至是增量源生成器存在的主要动机之一。

0 投票
2 回答
23 浏览

sourcegenerators - SourceGenerator/IncrementalGenerator 调试

我们曾经能够使用VS 2019 中https://github.com/amis92/csharp-source-generators#tips--tricks中的这个技巧来调试源代码生成器。

我们已升级到 VS 2022(更新 2),这不再有效。

此功能是否已删除或说明是否已更改?

我检查了 github 并没有发现任何有用的东西。

0 投票
0 回答
37 浏览

c# - IntelliSense 给出错误,因为它忽略(看不到)源生成器生成的源,尽管 build 没有给出错误

IntelliSense 会给出错误,因为它忽略(看不到)源生成器生成的源,尽管 build 没有给出错误。

我尝试过多次构建/重建。生成的源是存在的,好的,我可以使用 ctrl + click 导航到它们,并且构建也没有错误。

仍然存在红色下划线和 IntelliSense 错误...

问题

我错过了什么?

在此处输入图像描述

0 投票
1 回答
76 浏览

visual-studio - 如何在 VS 2022 中调试 Roslyn 源代码生成器?

语境

通过将项目属性/调试启动设置为 Roslyn 组件,我能够在 VS 2019 中调试我的源生成器,然后将目标项目组合设置为我的消费项目之一:

在此处输入图像描述 在此处输入图像描述

现在 VS 2022 中似乎缺少此功能,我无法使用具有类似设置的启动配置文件 UI 创建启动配置文件。

问题

如何在 Visual Studio 2022 中调试 Roslyn 源代码生成器?

0 投票
0 回答
37 浏览

c# - 如何在 C# 源代码生成器中获取对类的所有引用

如何使用 C# 源生成器获取对记录的所有引用?反之亦然,如何通过引用获取类的定义?(哪个更快?)

这是对它的引用:

我尝试了一种方法:从 GeneratorSyntaxContext 我分析语法节点是否是带有 GenerateAttribute 的记录。我记得这些类名,当我遇到 InvocationExpressionSyntax 时,我会检查名称标识符是否在记住的名称中。这种方法是有缺陷的,因为调用可能比定义更早被发现。

我想我必须以某种方式从每个参考中获取语义模型?还是更容易从类定义的语义模型中找到所有引用?提前致谢。

0 投票
1 回答
59 浏览

c# - 使用源代码生成器时如何避免 Visual Studio 中出现 CS0103 错误?

我写了一个非常简单的源代码生成器:

它的编译、运行和行为完全符合我的希望和期望,但是......

VS不开心

Visual Studio 不知道生成的函数并显示 CS0103 错误。我怎样才能让 VS 不为此显示错误?

0 投票
0 回答
42 浏览

c# - 在生产构建上下文中未调用增量源生成器

给定一个工作的源代码生成器和一个用于该生成器的工作测试项目。

发电机

测试项目

测试运行没有错误,类型和方法生成正确。但是我绝对讨厌用纯文本编写测试,加上执行这样的测试不会产生测试覆盖率或单元测试用例,所以我想为源生成器编写一个生产测试。按照惯例,我创建了一个.Run.Tests项目并将Rustic.DataEnumGen nuget项目添加为分析器。像这样

这与前一个测试中的代码完全相同,但包装在 aTestFixture而不是控制台应用程序中。所以我用分析器构建项目,这样DataEnumAttribute生成然后添加上面的代码。但是代码不能编译,因为类型DataEnum还是DataEnumAttribute不存在的。

首先我认为我需要 (I) ReferenceOutputAssembly,但这也没有改变任何东西,然后我尝试了删除OutputItemType="Analyzer"和希望这会导致调用分析器的组合;没有任何帮助。

我得出结论,在这个例子中,导入的源代码生成器,在第一个测试用例中使用纯文本编译时工作的相同,在构建项目之前没有执行,因为如果是这种情况,那么类型总是由生成器将在项目中可用,我会Rusic.*.g.csobj/目录中看到一些。事实并非如此。

那么也许生成器没有打包在 nuget 包中?如您所见,分析仪正在打包。也许我也需要IncludeBuildOutput?不,也不工作。

现在我的问题是为什么会这样?IIncrementalGenerator与 相比,导入项目时是否有一些特定的东西,一些特定的属性,我需要注意ISourceGenerator,因为在项目中使用 anISourceGenerator的工作方式完全相同?

还有什么我可以尝试让增量源生成器工作的,还是我应该恢复使用常规源生成器?

对好文章的引用也有帮助,因为实际上找不到文档。工作时我参考了大部分Andrew Lock的源码生成器相关文章,特别是这一篇

我在一周前测试了这个 mit net 6.0.101 和 6.0.2xx 的构建。

0 投票
0 回答
16 浏览

c# - 在 Visual Studio 中添加分析器时无法加载 netstandard2.1 程序集

最近我对编写源代码生成器很感兴趣,有时我需要编写一个DiagnosticSuppressor来容纳一些生成的逻辑。由于 Rider(我选择的 IDE)不支持抑制器,我需要 Visual Studio 来测试它是否正常工作。

但是在将它的 NuGet 包加载到 VS 的过程中,我遇到了一个问题,即 VS(19/22)由于无法加载 netstandard 程序集而无法实例化生成器对象。

生成器是使用 netstandard2.1 编写的,并且可以在 Rider 中正常工作(MacOS 和 Windows)。是否有任何解决方案可以在 VS 中启用它?

错误信息