问题标签 [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 投票
2 回答
615 浏览

c# - 源生成器:有关引用项目的信息?

我开始使用 C# 源代码生成器。

我想要的是启动一个进程并使用当前标签和哈希码作为属性git describe --tags --long填充一个静态类。GitVersion

问题是,我没有关于引用项目目录的信息,所以我不知道在哪里运行 git 进程。GeneratorExecutionContext我在函数的参数中找不到任何有用的信息Execute

AppDomain.CurrentDomain指向 csc.exe 进程所以我想没有办法知道它在那里?

0 投票
2 回答
58 浏览

c# - How to get TypeConverter when using Source Generators

I can get all type converters set explicitly in my code using attribute, but how do I get implicit type converters when using TypeDescriptor.GetConverter.

0 投票
1 回答
1430 浏览

c# - 使 C# 源代码生成器报告的诊断错误出现在 Visual Studio 编辑器中

我正在尝试编写一个 C# 源代码生成器,它在某些条件下使用GeneratorExecutionContext.ReportDiagnostic. 在 Visual Studio 中构建示例项目后,我的源代码生成器能够成功运行并输出错误。但是,我的错误不会在 Visual Studio 编辑器中显示为绿色/红色曲线。根据Microsoft 的文档,这应该可以通过 Roslyn 分析器实现,但没有具体说明源生成器。但是,由于源生成器被视为 Roslyn 分析器,我想这应该是可能的。我已经设法通过一个小示例复制了我的问题,该示例由一个源生成器项目和一个运行生成器的测试项目组成。作为一项测试,生成器在看到一个没有“void. 我打算在有问题的方法名称下出现红色曲线:

源生成器:

示例代码:

当我使用生成器编译示例代码时,Visual Studio 告诉我构建有错误,并在错误列表中正确报告自定义诊断。我可以点击自定义错误,我的光标移动到编辑器中的违规方法。但是,没有出现红色曲线。我知道我的源代码生成器正在由 Intellisense 运行,因为我能够看到test我的生成器定义的自定义命名空间和类。

Visual Studio 是否支持 C# 源生成器报告的诊断代码下划线?如果是这样,上面的代码有什么问题?提前致谢。

0 投票
1 回答
541 浏览

c# - 禁用特定的 C# 9 源代码生成器

有没有办法禁用特定的 C# 9 源代码生成器?或者将它们全部禁用?

有问题的包是https://github.com/Husqvik/GraphQlClientGenerator#c-9-source-generator这意味着能够同时用作库和源生成器。但这些是互斥的,即大多数用例通过执行代码和代码生成来生成代码是没有意义的

0 投票
0 回答
72 浏览

c# - 使用源生成获取枚举字段属性

在我的代码中,我有几个带有属性的枚举,这些属性用于将额外的值与它们相关联(根据https://stackoverflow.com/a/4778347/6326374)。正如所写,访问属性需要反射。

C#9 引入了 Source Generation,其中一个用例是替换一些反射

如何使用源生成来替换对 Attribute.GetCustomAttribute 的运行时调用?

0 投票
0 回答
123 浏览

c# - 我可以使用 Source Generators 获取引用的项目代码吗?

我开始使用 C# 源代码生成器,并尝试阅读不在实际项目中而是在引用项目中的代码。

可能吗?

0 投票
1 回答
509 浏览

c# - How can I make a Roslyn Analyzer project a transitive dependency?

I have a library that relies on a source generator to work correctly. In the MyLibrary.csproj, I reference the generator like so.

I need this analyzer reference to be transitive, i.e. projects that reference MyLibrary should get the MyLibrary.Generators analyzer transitively.

A simple reference like so does not seem to reference the analyzer, only MyLibrary

I want to stress that I am not looking for MyLibrary.Generators to be consumed as a regular assembly reference, but as a Roslyn Analyzer so my source generator can run as intended during compile time.

0 投票
0 回答
361 浏览

c# - 如何在单元测试中使用 C# 9 源代码生成器的引用?

我有一个 C# 9.0 源代码生成器,它引用了一个类库,该类库包含一个用于标识要处理的类的属性。我现在正在编写单元测试,如此所述:

CreateCompilation看起来像这样

但是,生成器将无法识别标记属性(符号不相等)。我想,问题是,在编译中,它们被视为来自另一个程序集:一个来自 UnitTest 中的编译,另一个是源代码生成器中的引用。

源代码生成器获取要与之比较的符号,compilation.GetTypeByMetadataName(typeof(MarkerAttribute).FullName)但也引用包含程序集本身。我GetDependencyTargetPaths在官方示例csproj中包含参考。

知道我必须如何创建编译,以便源生成器中的符号相等吗?

编辑 1

我刚刚发现,AttributeClass似乎与类型匹配(即名称相等),但它的 Kind 属性返回SymbolKind.ErrorType,而源 gen 获得的属性compilation.GetTypeByMetadataName(typeof(MarkerAttribute).FullName)返回SymbolKind.NamedType。所以这可能就是他们不匹配的原因。但是,我仍然不知道为什么符号的解析方式不同。

0 投票
0 回答
62 浏览

c# - 属性中的 nameof 产生空字符串

现在我正在开发 INotifyPropertyChanged 源生成器(用于研究生成器)并偶然发现了奇怪的错误(?)。当属性用于nameof引用生成的属性时,对应的属性AttributeData.ConstructorArguments包含空字符串而不是属性名称。

SomeProp是生成的属性,目前没有添加到源中。如果成员是用户定义的,则一切正常。此代码编译。

在此处输入图像描述

  1. 它是编译器中的错误还是设计使然
  2. 解决此问题的最佳方法是什么?从语义模型到语法还是做其他事情?
0 投票
1 回答
991 浏览

c# - C# NET 5.0 源代码生成器基本示例不生成输出

我正在尽可能地从Microsoft 网站示例中复制所有内容,但没有生成任何内容。我创建了一个 MCVE 来尝试找出发生以下错误的原因:

我已经检查了提供的路径,并且SourceGenerators.dll存在。这个错误对我来说毫无意义。

注意:在我提供的 MCVE 中,显然没有构建警告。不知道为什么,但是源生成器仍然没有输出。

我的目标是有一个像这样的工作流程:

因此,我想要一个分析器在类库中生成定义,该类库将在许多项目之间共享。上述工作流程将其简化为一个依赖于一个库的项目,该库依赖于源生成器,以保持 MCVE-as-possible。

因为复制所有这些东西很烦人,如果你很懒,这里有一个上传链接:下载链接 MCVE(据说发布后一周到期,但来源如下)。

相关资料:


这些是源文件及其包含的内容。

/SourceGenTest.sln

/SourceGenerators/SourceGenerators.csproj

/SourceGenerators/Class1.cs

/SourceGenLibrary/SourceGenLibrary.csproj

/SourceGenLibrary/Class1.cs

/SourceGenConsole/SourceGenConsole.csproj

/SourceGenConsole/Program.cs