Source Generator 能否判断它是 运行 用于编辑器支持 (IntelliSense) 还是作为实际构建的一部分?

Can a Source Generator tell if its being run for editor support (IntelliSense) or as part of an actual build?

除了为正在进行的编译生成代码文件外,我的源代码生成器还需要将一些文件写入磁盘。当生成器被 运行 用于其 IntelliSense(或等效)功能时,这些磁盘写入是完全不必要的,并且只有在实际构建项目时才有意义(它甚至会导致一些失败,IDE 喜欢同时 运行 源生成器的多个实例)。

此外,我认为没有理由生成源代码生成器生成的任何类型的实际内部结构。直觉上,只为生成的类型生成 public 表面会带来更快、更灵敏的编辑器体验。

源生成器区分其 运行 用途的最可靠方法是什么?

我们不会让您询问“我在 IDE 中吗?”因为这并不总是正确的问题。例如:

Additionally, I see no reason to generate actual internals of any of the types generated by the source generator. Intuitively, only generating the public surface for the generated types would be lead to a faster and more responsive editor experience.

这是正确的,直到您执行 Hot Reload/Edit 和 Continue 之前,我们需要 IDE 进程中的那些完整实现,就像更新调试进程一样。现在,这在您的特定场景中可能不可行,但您明白了。

我们一直在尝试做的是提供一种更好的方式来提供意图提示。增量生成器可以调用 RegisterImplementationSourceOutput 这是我们仅 运行 的提示,如果我们需要实现。在撰写本文时以及在 VS 17.2 中,我们仍在 IDE 中 运行ning,但我们希望尽快修复它。

管道中还有一些工作:https://github.com/dotnet/roslyn/issues/57589 is tracking adding an API to do the reverse, and https://github.com/dotnet/roslyn/issues/49935 直接写入其他文件的方法。