# 通用源代码生成器 **本文引用的文件** - [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs) - [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs) - [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs) - [LogAttribute.cs](file://GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs) - [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs) - [GenerateEnumExtensionsAttribute.cs](file://GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs) - [LoggerDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/LoggerDiagnostic.cs) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs) - [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs) - [LoggerGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs) - [ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs) - [EnumExtensionsGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本技术文档围绕通用源代码生成器展开,重点解析以下三个生成器的工作机制与使用方式: - LoggerGenerator:基于 LogAttribute 属性为类自动生成日志记录器字段,并通过日志工厂解析器创建 ILogger 实例。 - ContextAwareGenerator:基于 ContextAwareAttribute 属性为类自动生成 IContextAware 接口实现,提供上下文访问与显式接口实现。 - EnumExtensionsGenerator:基于 GenerateEnumExtensionsAttribute 属性为枚举生成扩展方法,包括 IsX 与 IsIn 扩展。 同时,文档阐述诊断系统(ContextAwareDiagnostic、LoggerDiagnostic)的错误检测与报告机制,给出各生成器的使用示例、配置选项与最佳实践,并解释生成器的性能特点与零运行时开销的设计理念。 ## 项目结构 本仓库采用分层与按功能域划分的组织方式: - GFramework.SourceGenerators:具体生成器实现(LoggerGenerator、ContextAwareGenerator、EnumExtensionsGenerator) - GFramework.SourceGenerators.Abstractions:生成器所用的属性定义(LogAttribute、ContextAwareAttribute、GenerateEnumExtensionsAttribute) - GFramework.SourceGenerators.Common:通用生成器基类、常量与诊断工具 - GFramework.SourceGenerators.Tests:各生成器的快照测试,用于验证生成代码的正确性 ```mermaid graph TB subgraph "生成器实现" LG["LoggerGenerator.cs"] CAG["ContextAwareGenerator.cs"] EEG["EnumExtensionsGenerator.cs"] end subgraph "抽象属性" LA["LogAttribute.cs"] CAA["ContextAwareAttribute.cs"] GEA["GenerateEnumExtensionsAttribute.cs"] end subgraph "通用基础设施" ACGB["AttributeClassGeneratorBase.cs"] AEEGB["AttributeEnumGeneratorBase.cs"] PC["PathContests.cs"] CD["CommonDiagnostics.cs"] end subgraph "诊断" CAD["ContextAwareDiagnostic.cs"] LDI["LoggerDiagnostic.cs"] end LG --> LA CAG --> CAA EEG --> GEA LG -.继承.-> ACGB CAG -.继承.-> ACGB EEG -.继承.-> AEEGB LG --> PC CAG --> PC EEG --> PC CAG --> CAD LG --> LDI LG --> CD CAG --> CD EEG --> CD ``` 图表来源 - [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L15-L103) - [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L234) - [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L14-L114) - [LogAttribute.cs](file://GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs#L9-L40) - [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11) - [GenerateEnumExtensionsAttribute.cs](file://GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs#L8-L20) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L12-L175) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L10-L104) - [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L8-L60) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L8-L21) - [LoggerDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/LoggerDiagnostic.cs#L8-L21) 章节来源 - [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L10-L103) - [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L11-L234) - [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L9-L114) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L12-L175) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L10-L104) - [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L8-L60) ## 核心组件 本节概述三个生成器的核心职责与关键行为: - LoggerGenerator:扫描带 LogAttribute 的类,生成 readonly ILogger 字段并通过 LoggerFactoryResolver 创建实例;支持自定义日志名、字段名、访问修饰符与静态/实例字段。 - ContextAwareGenerator:扫描带 ContextAwareAttribute 的类,生成对 IContextAware 的显式接口实现,自动生成 Context 属性与 SetContext/GetContext 的实现;强制类为 partial 并限制为 class。 - EnumExtensionsGenerator:扫描带 GenerateEnumExtensionsAttribute 的枚举,生成扩展类与扩展方法,包括每个枚举项的 IsX 判断与 IsIn 多值判断。 章节来源 - [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L15-L103) - [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L234) - [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L14-L114) ## 架构总览 生成器遵循 Roslyn 增量生成器模式,通过语法提供程序筛选候选节点,结合语义模型解析属性与符号,再生成源代码并注册到编译产物中。通用基类负责流程控制与诊断输出,具体生成器聚焦于模板生成与命名空间/类型解析。 ```mermaid sequenceDiagram participant RS as "Roslyn 编译器" participant SP as "语法提供程序" participant BM as "语义模型" participant GEN as "生成器" participant OUT as "源输出" RS->>SP : 触发语法遍历 SP->>BM : 获取类/枚举声明符号 BM-->>SP : 返回命名类型符号 SP-->>GEN : 传递候选节点与符号 GEN->>GEN : ResolveAttribute/ValidateSymbol GEN->>OUT : AddSource(生成的源代码) OUT-->>RS : 参与后续编译 ``` 图表来源 - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L23-L113) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L21-L56) ## 详细组件分析 ### LoggerGenerator 日志记录器生成机制 - 属性与入口 - 使用 LogAttribute 标注类,生成器继承 AttributeClassGeneratorBase,通过 AttributeShortNameWithoutSuffix 快速筛选含“Log”的类声明。 - 生成逻辑 - 解析类的命名空间、完整类型名、泛型参数与约束,读取 LogAttribute 的构造参数与命名参数(日志名、字段名、访问修饰符、是否静态)。 - 生成 using 引用核心抽象与具体实现命名空间,输出 partial 类并在其中声明 readonly ILogger 字段,初始化调用 LoggerFactoryResolver.Provider.CreateLogger(...)。 - 文件命名 - 生成文件名为 {ClassName}.Logger.g.cs,便于识别与覆盖。 ```mermaid flowchart TD Start(["进入 Generate"]) --> NS["解析命名空间/类型名/泛型"] NS --> Attr["读取 LogAttribute 参数
日志名/字段名/访问修饰符/静态"] Attr --> Build["构建 using 与 partial 类声明"] Build --> Field["生成 readonly ILogger 字段
通过 LoggerFactoryResolver 创建"] Field --> Hint["设置提示文件名 *.Logger.g.cs"] Hint --> End(["返回生成源码"]) ``` 图表来源 - [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L51-L103) - [LogAttribute.cs](file://GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs#L9-L40) - [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42) 章节来源 - [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L15-L103) - [LogAttribute.cs](file://GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs#L9-L40) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L23-L113) - [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42) 使用示例与最佳实践 - 示例参考快照测试:默认配置、自定义日志名、自定义字段名、实例字段、公开字段、泛型类等场景均在测试中覆盖。 - 最佳实践 - 保持类为 partial,避免生成失败。 - 合理设置日志名,便于日志聚合与过滤。 - 默认静态字段可减少实例化成本,如需实例化日志请设置 IsStatic=false。 - 访问修饰符按需调整,但建议保持私有封装。 章节来源 - [LoggerGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs#L10-L591) ### ContextAwareGenerator 上下文感知接口生成 - 属性与入口 - 使用 ContextAwareAttribute 标注类,生成器继承 MetadataAttributeClassGeneratorBase,通过属性元数据名精确匹配。 - 生成逻辑 - 校验类必须为 partial class;若不满足则报告诊断。 - 生成 partial class 并显式实现 IContextAware 接口,生成 Context 属性(懒加载,首次使用时从 GameContext.GetFirstArchitectureContext 获取),以及 SetContext/GetContext 的显式实现。 - 文件命名 - 生成文件名为 {ClassName}.ContextAware.g.cs。 ```mermaid sequenceDiagram participant SRC as "源代码" participant GEN as "ContextAwareGenerator" participant DIAG as "诊断" participant OUT as "生成代码" SRC->>GEN : 标注 [ContextAware] 的 partial class GEN->>GEN : ValidateSymbol 检查 partial/class alt 不满足 GEN->>DIAG : 报告 ContextAwareOnlyForClass DIAG-->>SRC : 错误提示 else 满足 GEN->>OUT : 生成显式接口实现与 Context 属性 end ``` 图表来源 - [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L39-L122) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L13-L20) 章节来源 - [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L16-L234) - [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L8-L11) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L8-L21) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L20-L28) 使用示例与最佳实践 - 示例参考快照测试:partial class 且实现 IContextAware 的场景已覆盖。 - 最佳实践 - 严格使用 partial class,避免显式接口实现冲突。 - 将上下文访问封装在受保护属性中,避免直接暴露内部状态。 - 如需自定义上下文来源,可在派生类中重写 Context 属性或 SetContext 行为。 章节来源 - [ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs#L19-L84) ### EnumExtensionsGenerator 枚举扩展方法生成 - 属性与入口 - 使用 GenerateEnumExtensionsAttribute 标注枚举,生成器继承 AttributeEnumGeneratorBase,通过属性元数据名匹配。 - 生成逻辑 - 校验目标为 enum;若非枚举则报告诊断。 - 生成扩展类 {EnumName}Extensions,包含: - 每个枚举项的 IsX 判断方法(可禁用) - IsIn(params T[]) 多值判断方法(可禁用) - 文件命名 - 生成文件名为 {EnumName}.EnumExtensions.g.cs。 ```mermaid flowchart TD Start(["进入 Generate"]) --> Check["ValidateSymbol 确认为 enum"] Check --> Members["提取枚举成员列表"] Members --> ExtClass["生成扩展类 {Enum}Extensions"] ExtClass --> IsX["为每个成员生成 IsX 方法可选"] ExtClass --> IsIn["生成 IsIn(params T[]) 方法可选"] IsX --> Hint["设置提示文件名 *.EnumExtensions.g.cs"] IsIn --> Hint Hint --> End(["返回生成源码"]) ``` 图表来源 - [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L37-L114) - [GenerateEnumExtensionsAttribute.cs](file://GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs#L8-L20) 章节来源 - [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L14-L114) - [GenerateEnumExtensionsAttribute.cs](file://GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs#L8-L20) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L21-L56) 使用示例与最佳实践 - 示例参考快照测试:基础枚举、Flags 枚举、禁用 IsMethods/IsInMethod 等场景均已覆盖。 - 最佳实践 - Flags 枚举可保留 IsIn 以简化多标志判断。 - 当枚举项较多时,可关闭 IsX 以减少扩展类体积。 章节来源 - [EnumExtensionsGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs#L10-L208) ### 诊断系统工作原理 - 通用诊断 - ClassMustBePartial:当类未声明为 partial 时报告错误,确保生成器能与现有代码合并。 - GeneratorTrace:用于生成器内部调试追踪,输出进入/退出、属性解析、验证与生成阶段的信息。 - 特定诊断 - ContextAwareOnlyForClass:ContextAwareAttribute 仅允许用于 class。 - LogAttributeInvalid:当 LogAttribute 无效时发出警告,提示生成器无法生成日志记录器。 ```mermaid classDiagram class CommonDiagnostics { +ClassMustBePartial +GeneratorTrace +Trace(context, message) } class ContextAwareDiagnostic { +ContextAwareOnlyForClass } class LoggerDiagnostics { +LogAttributeInvalid } CommonDiagnostics <.. ContextAwareDiagnostic : "共享诊断机制" CommonDiagnostics <.. LoggerDiagnostics : "共享诊断机制" ``` 图表来源 - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L8-L60) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L8-L21) - [LoggerDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/LoggerDiagnostic.cs#L8-L21) 章节来源 - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L8-L60) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators.diagnostics/ContextAwareDiagnostic.cs#L8-L21) - [LoggerDiagnostic.cs](file://GFramework.SourceGenerators.diagnostics/LoggerDiagnostic.cs#L8-L21) ## 依赖关系分析 - 命名空间与路径 - 生成器通过 PathContests 统一管理核心抽象与实现的命名空间,保证生成代码的引用一致性。 - 基类耦合 - 三类生成器均依赖通用基类,复用语法筛选、语义解析、验证与输出流程,降低重复代码。 - 诊断耦合 - 生成器通过 CommonDiagnostics 输出统一的诊断信息,特定诊断由对应诊断类定义。 ```mermaid graph LR PC["PathContests.cs"] --> LG["LoggerGenerator.cs"] PC --> CAG["ContextAwareGenerator.cs"] PC --> EEG["EnumExtensionsGenerator.cs"] ACGB["AttributeClassGeneratorBase.cs"] --> LG AEEGB["AttributeEnumGeneratorBase.cs"] --> EEG CD["CommonDiagnostics.cs"] --> LG CD --> CAG CD --> EEG CAD["ContextAwareDiagnostic.cs"] --> CAG LDI["LoggerDiagnostic.cs"] --> LG ``` 图表来源 - [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L12-L175) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L10-L104) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L8-L60) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/ContextAwareDiagnostic.cs#L8-L21) - [LoggerDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/LoggerDiagnostic.cs#L8-L21) 章节来源 - [PathContests.cs](file://GFramework.SourceGenerators.Common/constants/PathContests.cs#L6-L42) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L12-L175) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L10-L104) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L8-L60) ## 性能考量 - 零运行时开销 - 生成器在编译期生成源代码,运行时仅使用已生成的字段/方法,不引入反射或动态绑定,具备零运行时开销。 - 生成效率 - 通过语法提供程序与语义模型的组合,先进行语法粗筛再进行语义解析,减少不必要的处理。 - 内存与字符串拼接 - 生成器使用 StringBuilder 拼接源码,避免频繁分配;仅在必要处进行命名空间与类型名解析。 - 诊断与可观测性 - 通过 GeneratorTrace 输出生成阶段信息,便于定位问题与优化生成流程。 [本节为通用性能讨论,无需列出具体文件来源] ## 故障排查指南 - 常见问题与解决 - 类未声明为 partial:生成器会报告 ClassMustBePartial 错误。请将目标类声明为 partial。 - ContextAwareAttribute 应用于非 class:生成器会报告 ContextAwareOnlyForClass 错误。请确保标注在 class 上。 - LogAttribute 无效:生成器会报告 LogAttributeInvalid 警告。检查属性参数与类声明是否满足生成条件。 - 调试建议 - 查看编译输出中的诊断信息,确认生成器是否进入 Execute、属性是否解析成功、验证是否通过。 - 使用快照测试对比生成结果,定位差异。 章节来源 - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L20-L28) - [ContextAwareDiagnostic.cs](file://GFramework.SourceGenerators.diagnostics/ContextAwareDiagnostic.cs#L13-L20) - [LoggerDiagnostic.cs](file://GFramework.SourceGenerators.diagnostics/LoggerDiagnostic.cs#L13-L20) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L74-L113) ## 结论 本通用源代码生成器体系通过简洁的属性与强大的基类设计,实现了日志记录器、上下文感知接口与枚举扩展方法的自动化生成。其零运行时开销、清晰的诊断机制与完善的快照测试保障了生成质量与可维护性。遵循 partial 类约定与合理的属性配置,可显著提升开发效率与代码一致性。 [本节为总结性内容,无需列出具体文件来源] ## 附录 - 使用清单 - LoggerGenerator:在类上添加 LogAttribute,配置日志名、字段名、访问修饰符与静态/实例字段。 - ContextAwareGenerator:在类上添加 ContextAwareAttribute,确保类为 partial class 并实现 IContextAware。 - EnumExtensionsGenerator:在枚举上添加 GenerateEnumExtensionsAttribute,按需启用 IsX 与 IsIn 方法。 - 快照测试参考 - LoggerGenerator:涵盖默认配置、自定义日志名、字段名、实例字段、公开字段、泛型类等场景。 - ContextAwareGenerator:涵盖 partial class 与 IContextAware 实现场景。 - EnumExtensionsGenerator:涵盖基础枚举、Flags 枚举与禁用方法场景。 章节来源 - [LoggerGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/logging/LoggerGeneratorSnapshotTests.cs#L10-L591) - [ContextAwareGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/rule/ContextAwareGeneratorSnapshotTests.cs#L19-L84) - [EnumExtensionsGeneratorSnapshotTests.cs](file://GFramework.SourceGenerators.Tests/enums/EnumExtensionsGeneratorSnapshotTests.cs#L10-L208)