news 2026/5/8 4:32:30

CSharpier代码生成器揭秘:自动生成语法节点打印器的实现原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CSharpier代码生成器揭秘:自动生成语法节点打印器的实现原理

CSharpier代码生成器揭秘:自动生成语法节点打印器的实现原理

【免费下载链接】csharpierCSharpier is an opinionated code formatter for c#.项目地址: https://gitcode.com/gh_mirrors/cs/csharpier

CSharpier是一款针对C#的代码格式化工具,它通过自动生成语法节点打印器来实现对各种C#语法结构的格式化处理。本文将深入探讨其代码生成器的实现原理,帮助开发者理解这一强大功能背后的技术细节。

核心组件:NodePrinterGenerator类

在CSharpier项目中,语法节点打印器的自动生成主要由NodePrinterGenerator类负责。这个类实现了IIncrementalGenerator接口,能够在编译时增量生成代码。其核心代码位于Src/CSharpier.Generators/NodePrinterGenerator.cs文件中。

特殊语法节点处理

CSharpier需要处理各种C#语法节点,其中一些节点有特殊的语法种类。NodePrinterGenerator类通过一个字典来定义这些特殊情况:

private static readonly Dictionary<string, string[]> SpecialCase = new() { { nameof(AssignmentExpressionSyntax), new[] { nameof(SyntaxKind.SimpleAssignmentExpression), nameof(SyntaxKind.AddAssignmentExpression), // 其他赋值表达式类型... } }, // 其他特殊节点类型... };

这个字典映射了语法节点类型到其对应的语法种类,例如AssignmentExpressionSyntax对应多种赋值操作符类型。

代码生成流程

1. 初始化增量生成器

Initialize方法设置了增量生成的触发条件,当包含"SyntaxNodePrinters"的语法树发生变化时,将触发代码生成:

public void Initialize(IncrementalGeneratorInitializationContext context) { var syntaxTrees = context.CompilationProvider.Select( (compilation, _) => compilation .SyntaxTrees.Where(o => o.FilePath.Contains("SyntaxNodePrinters")) .ToImmutableArray() ); context.RegisterSourceOutput(syntaxTrees, GenerateSource); }

2. 生成源代码

GenerateSource方法是代码生成的核心,它使用Scriban模板引擎来渲染生成代码:

private static void GenerateSource( SourceProductionContext context, ImmutableArray<SyntaxTree> syntaxTrees ) { if (syntaxTrees.Length == 0) { return; } var generator = new NodePrinterGenerator(); var template = Template.Parse(generator.GetContent(generator.GetType().Name + ".sbntxt")); var renderedSource = template.Render( generator.GetModel(syntaxTrees), member => member.Name ); var sourceText = SourceText.From(renderedSource, Encoding.UTF8); context.AddSource("Node", sourceText); }

3. 准备模板数据模型

GetModel方法准备了模板所需的数据,包括节点类型、语法节点名称和对应的语法种类:

private object GetModel(ImmutableArray<SyntaxTree> syntaxTrees) { var nodeTypes = syntaxTrees .Select(o => Path.GetFileNameWithoutExtension(o.FilePath)) .Select(fileName => new { PrinterName = fileName, SyntaxNodeName = $"{fileName}Syntax", SyntaxKinds = SpecialCase.TryGetValue($"{fileName}Syntax", out var kinds) ? string.Join(" or ", kinds.Select(x => $"SyntaxKind.{x}")) : $"SyntaxKind.{fileName}", }) .OrderBy(o => o.SyntaxNodeName) .ToArray(); var syntaxNodeTypes = string.Join(" or ", nodeTypes.Select(x => x.SyntaxNodeName)); return new { NodeTypes = nodeTypes, SyntaxNodeTypes = syntaxNodeTypes }; }

模板驱动的代码生成

CSharpier的代码生成采用模板驱动的方式,使用Scriban模板引擎。虽然我们无法直接查看模板文件NodePrinterGenerator.sbntxt的内容,但从代码中可以看出,它会根据GetModel方法提供的数据模型来生成语法节点打印器的代码。

这种设计使得添加新的语法节点支持变得非常简单,只需添加相应的模板和配置,而无需手动编写大量重复的代码。

其他生成器

除了NodePrinterGenerator,CSharpier项目中还有其他代码生成器,如SyntaxNodeComparerGeneratorSyntaxNodeJsonWriterGenerator,它们分别负责生成语法节点比较器和JSON序列化器的代码。这些生成器遵循类似的实现模式,共同构成了CSharpier强大的代码生成能力。

总结

CSharpier通过代码生成技术,大大减少了手动编写和维护语法节点处理代码的工作量。NodePrinterGenerator作为核心生成器,通过增量生成和模板引擎,实现了对各种C#语法节点打印器的自动生成。这种设计不仅提高了开发效率,也保证了代码的一致性和可维护性。

对于希望深入了解CSharpier实现的开发者,可以从Src/CSharpier.Generators/目录下的代码入手,探索代码生成的更多细节。

【免费下载链接】csharpierCSharpier is an opinionated code formatter for c#.项目地址: https://gitcode.com/gh_mirrors/cs/csharpier

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 4:31:31

AI Agent智能评估框架:14维度量化与三信号融合实践

1. 项目概述&#xff1a;从“感觉”到“度量”的AI Agent智能评估革命在AI Agent开发领域&#xff0c;我们常常陷入一种主观的困境&#xff1a;今天调了一个参数&#xff0c;明天加了一个技能&#xff0c;感觉Agent“好像”变聪明了&#xff0c;但这种“感觉”究竟有多少是真实…

作者头像 李华
网站建设 2026/5/8 4:30:35

如何用纯CSS实现文字形状动态变化:终极指南

如何用纯CSS实现文字形状动态变化&#xff1a;终极指南 【免费下载链接】You-Dont-Need-JavaScript CSS is powerful, you can do a lot of things without JS. 项目地址: https://gitcode.com/gh_mirrors/yo/You-Dont-Need-JavaScript 在现代网页设计中&#xff0c;文字…

作者头像 李华
网站建设 2026/5/8 4:26:10

Qwen3-4B-Instruct基础教程:prompt模板注入+system message定制方法

Qwen3-4B-Instruct基础教程&#xff1a;prompt模板注入system message定制方法 1. 模型简介 Qwen3-4B-Instruct-2507是Qwen3系列的端侧/轻量旗舰模型&#xff0c;专为指令跟随任务优化设计。这个4B参数的模型在保持轻量化的同时&#xff0c;提供了出色的推理能力和任务完成度…

作者头像 李华
网站建设 2026/5/8 4:24:37

开源词汇管理工具OpenWord:开发者如何构建个人术语库与知识图谱

1. 项目概述&#xff1a;一个面向开发者的开源词汇管理工具最近在整理个人技术笔记和项目文档时&#xff0c;我常常被一个看似简单却无比繁琐的问题困扰&#xff1a;如何高效地管理那些散落在代码注释、API文档、技术博客甚至聊天记录里的专业术语、缩写和特定名词&#xff1f;…

作者头像 李华
网站建设 2026/5/8 4:23:30

安卓误删文件先别慌!5个实用小技巧指南教你补救

很多人都有过这样的经历&#xff1a;手滑误删了重要的工作文档、珍贵的照片、聊天记录&#xff0c;或是清理内存时不小心删掉了关键文件&#xff0c;下意识就觉得这些数据彻底消失、再也找不回来了。其实安卓手机删除的文件&#xff0c;并非完全无法恢复&#xff0c;只要没有被…

作者头像 李华