GeWuYou a79f02c987 docs(api): 添加 Core API 参考文档与事件系统接口文档
- 新增 Core API 参考文档,涵盖架构与模块、数据模型与系统、命令与查询等核心组件
- 添加事件系统接口详细文档,包括 IEvent、IEventBus、IUnRegister 等接口说明
- 提供完整的 API 使用示例路径、最佳实践与性能建议
- 包含架构图、依赖关系图与故障排查指南
- 添加测试用例参考与扩展方法说明
- [skip ci]
2026-01-21 23:45:10 +08:00

385 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 源代码生成器
<cite>
**本文档引用的文件**
- [GFramework.SourceGenerators.csproj](file://GFramework.SourceGenerators/GFramework.SourceGenerators.csproj)
- [GFramework.SourceGenerators.Abstractions.csproj](file://GFramework.SourceGenerators.Abstractions/GFramework.SourceGenerators.Abstractions.csproj)
- [GFramework.SourceGenerators.Common.csproj](file://GFramework.SourceGenerators.Common/GFramework.SourceGenerators.Common.csproj)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj)
- [GFramework.Godot.SourceGenerators.Abstractions.csproj](file://GFramework.Godot.SourceGenerators.Abstractions/GFramework.Godot.SourceGenerators.Abstractions.csproj)
- [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)
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs)
- [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs)
- [LoggerDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/LoggerDiagnostic.cs)
- [GodotModuleMarker.cs](file://GFramework.Godot.SourceGenerators.Abstractions/GodotModuleMarker.cs)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向 GFramework 源代码生成器模块,系统化阐述通用与 Godot 特殊场景下的代码生成能力与实现原理。重点覆盖以下主题:
- 通用源代码生成器LoggerGenerator 的日志字段自动生成、ContextAwareGenerator 的上下文感知接口实现、EnumExtensionsGenerator 的枚举扩展方法生成
- Godot 源代码生成器的特殊功能GodotModuleMarker 的标记生成与 Godot 特定代码的自动生成
- 抽象层设计:生成器接口定义、通用工具类与诊断系统
- 工作流程:从属性标记到代码生成的完整过程
- 配置选项、使用方法与最佳实践
- 测试策略与验证方法
- 零运行时开销的设计目标
- 故障排除与常见问题
## 项目结构
GFramework 源代码生成器由多个子项目组成分为“通用生成器”、“抽象层”、“公共工具”以及“Godot 专用生成器”。各项目职责清晰,遵循“只打包运行期依赖,不打包生成器本体”的原则,确保生成器在编译期工作、零运行时开销。
```mermaid
graph TB
subgraph "通用生成器"
SG["GFramework.SourceGenerators<br/>核心生成器项目"]
Abst["GFramework.SourceGenerators.Abstractions<br/>属性与接口定义"]
Common["GFramework.SourceGenerators.Common<br/>通用生成器基类与工具"]
end
subgraph "Godot 生成器"
GSG["GFramework.Godot.SourceGenerators<br/>Godot 专用生成器项目"]
GSAbst["GFramework.Godot.SourceGenerators.Abstractions<br/>Godot 标记与接口"]
end
subgraph "核心抽象"
CoreAbst["GFramework.Core.Abstractions<br/>核心接口与常量"]
end
SG --> Abst
SG --> Common
SG --> CoreAbst
GSG --> GSAbst
GSG --> Common
GSG -. 使用 .-> CoreAbst
```
图表来源
- [GFramework.SourceGenerators.csproj](file://GFramework.SourceGenerators/GFramework.SourceGenerators.csproj#L1-L64)
- [GFramework.SourceGenerators.Abstractions.csproj](file://GFramework.SourceGenerators.Abstractions/GFramework.SourceGenerators.Abstractions.csproj#L1-L31)
- [GFramework.SourceGenerators.Common.csproj](file://GFramework.SourceGenerators.Common/GFramework.SourceGenerators.Common.csproj#L1-L39)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L1-L71)
- [GFramework.Godot.SourceGenerators.Abstractions.csproj](file://GFramework.Godot.SourceGenerators.Abstractions/GFramework.Godot.SourceGenerators.Abstractions.csproj#L1-L32)
章节来源
- [GFramework.SourceGenerators.csproj](file://GFramework.SourceGenerators/GFramework.SourceGenerators.csproj#L1-L64)
- [GFramework.SourceGenerators.Abstractions.csproj](file://GFramework.SourceGenerators.Abstractions/GFramework.SourceGenerators.Abstractions.csproj#L1-L31)
- [GFramework.SourceGenerators.Common.csproj](file://GFramework.SourceGenerators.Common/GFramework.SourceGenerators.Common.csproj#L1-L39)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L1-L71)
- [GFramework.Godot.SourceGenerators.Abstractions.csproj](file://GFramework.Godot.SourceGenerators.Abstractions/GFramework.Godot.SourceGenerators.Abstractions.csproj#L1-L32)
## 核心组件
本节概述三大通用生成器及其职责与交互方式:
- LoggerGenerator为带 LogAttribute 的类自动生成日志字段
- ContextAwareGenerator为带 ContextAwareAttribute 的类自动生成 IContextAware 接口实现
- EnumExtensionsGenerator为带 GenerateEnumExtensionsAttribute 的枚举生成扩展方法
```mermaid
classDiagram
class AttributeClassGeneratorBase {
+Initialize(context)
+ResolveAttribute(compilation, symbol)
+Execute(context, compilation, classDecl, symbol)
+ValidateSymbol(...)
+Generate(...)
+GetHintName(symbol)
+ReportClassMustBePartial(...)
}
class AttributeEnumGeneratorBase {
+Initialize(context)
+ResolveAttribute(compilation, symbol)
+Execute(context, compilation, enumSyntax, symbol)
+ValidateSymbol(...)
+Generate(...)
+GetHintName(symbol)
}
class LoggerGenerator {
+AttributeType
+AttributeShortNameWithoutSuffix
+ValidateSymbol(...)
+Generate(...)
+GetHintName(symbol)
}
class ContextAwareGenerator {
+AttributeMetadataName
+AttributeShortNameWithoutSuffix
+ValidateSymbol(...)
+Generate(...)
+GetHintName(symbol)
-GenerateContextProperty(sb)
-GenerateInterfaceImplementations(sb, interfaceSymbol)
-GenerateMethod(...)
-GenerateMethodBody(...)
}
class EnumExtensionsGenerator {
+AttributeMetadataName
+AttributeShortNameWithoutSuffix
+ResolveAttribute(...)
+ValidateSymbol(...)
+Generate(symbol, attr)
+GetHintName(symbol)
}
AttributeClassGeneratorBase <|-- LoggerGenerator
AttributeClassGeneratorBase <|-- ContextAwareGenerator
AttributeEnumGeneratorBase <|-- EnumExtensionsGenerator
```
图表来源
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L1-L175)
- [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L1-L104)
- [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L1-L103)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L1-L234)
- [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L1-L114)
章节来源
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L1-L175)
- [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L1-L104)
- [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L1-L103)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L1-L234)
- [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L1-L114)
## 架构总览
生成器采用增量生成器模式,结合语法提供程序与语义模型,对候选节点进行筛选、验证与代码生成。整体流程如下:
```mermaid
sequenceDiagram
participant IDE as "IDE/MSBuild"
participant SP as "语法提供程序"
participant CP as "编译提供程序"
participant GEN as "具体生成器"
participant DIA as "诊断系统"
participant OUT as "源输出"
IDE->>SP : 触发语法提供程序
SP-->>CP : 返回候选节点与语义符号
CP-->>GEN : 传入 Compilation
GEN->>GEN : ResolveAttribute/ValidateSymbol
GEN->>DIA : ReportDiagnostic(可选)
GEN->>OUT : AddSource(生成的源代码)
OUT-->>IDE : 编译期注入生成代码
```
图表来源
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L23-L48)
- [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L21-L57)
章节来源
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L23-L48)
- [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L21-L57)
## 详细组件分析
### LoggerGenerator日志字段生成
- 功能:为标记了 LogAttribute 的类自动生成日志字段,支持命名空间、泛型、静态/实例、访问修饰符等参数化控制
- 关键点:
- 基于 AttributeClassGeneratorBase通过 ResolveAttribute 解析属性元数据
- 生成代码包含命名空间声明、partial 类、只读日志字段与工厂解析
- 文件提示名形如 “ClassName.Logger.g.cs”
- 生成内容要点(不展示代码,仅说明结构):
- 使用核心抽象命名空间与核心日志接口
- 生成只读日志字段,初始化时通过 LoggerFactoryResolver.Provider.CreateLogger(name)
- 支持 static 与非 static 字段,支持 private/public 等访问修饰符
```mermaid
flowchart TD
Start(["进入 Generate"]) --> NS["解析命名空间与类名"]
NS --> Kind["解析类型种类与泛型约束"]
Kind --> Attr["解析 LogAttribute 参数<br/>名称/字段名/访问修饰符/是否静态"]
Attr --> Build["拼接 using 与 namespace 块"]
Build --> Partial{"类是否为 partial?"}
Partial --> |否| Diag["报告类必须为 partial 的诊断"]
Diag --> End
Partial --> |是| Append["追加 partial 类与字段声明"]
Append --> Hint["设置提示文件名 *.Logger.g.cs"]
Hint --> End(["完成"])
```
图表来源
- [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L51-L103)
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L67-L113)
章节来源
- [LoggerGenerator.cs](file://GFramework.SourceGenerators/logging/LoggerGenerator.cs#L1-L103)
- [LogAttribute.cs](file://GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs#L1-L40)
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L67-L113)
### ContextAwareGenerator上下文感知接口实现
- 功能:为标记了 ContextAwareAttribute 的类自动生成 IContextAware 接口实现,包含 Context 属性与显式接口实现
- 关键点:
- 基于 MetadataAttributeClassGeneratorBase使用元数据名匹配特性
- 强制要求类为 partial class否则报告诊断
- 生成 Context 属性(懒加载,首次使用时解析第一个架构上下文)
- 遍历 IContextAware 接口方法,生成显式接口实现方法体
- 生成内容要点(不展示代码,仅说明结构):
- 生成 partial class 并显式实现 IContextAware
- 生成 Context 属性与 SetContext/GetContext 的实现
- 其他未支持方法抛出 NotImplementedExceptionvoid
```mermaid
sequenceDiagram
participant GEN as "ContextAwareGenerator"
participant SEM as "语义模型"
participant INT as "IContextAware 接口符号"
participant SB as "StringBuilder"
GEN->>SEM : 查找并解析 ContextAwareAttribute
GEN->>SEM : 获取 IContextAware 符号
GEN->>GEN : ValidateSymbol(必须为 partial class)
GEN->>SB : 生成 partial class 与命名空间
GEN->>SB : 生成 Context 属性(懒加载)
GEN->>SB : 遍历 IContextAware 方法并生成显式实现
GEN-->>OUT : AddSource(生成的源代码)
```
图表来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L78-L112)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L131-L152)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L163-L178)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L186-L205)
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L212-L233)
章节来源
- [ContextAwareGenerator.cs](file://GFramework.SourceGenerators/rule/ContextAwareGenerator.cs#L1-L234)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L1-L11)
### EnumExtensionsGenerator枚举扩展方法生成
- 功能:为标记了 GenerateEnumExtensionsAttribute 的枚举生成扩展方法,包括 IsX 与 IsIn
- 关键点:
- 基于 AttributeEnumGeneratorBase针对枚举声明进行筛选与生成
- 仅对枚举类型有效;非枚举类型报告诊断
- 生成 IsX 方法(每个枚举项一个),以及 IsIn(params T[]) 方法
- 文件提示名形如 “EnumName.EnumExtensions.g.cs”
- 生成内容要点(不展示代码,仅说明结构):
- 生成静态 partial 扩展类
- 为每个枚举成员生成 IsX 判断方法
- 生成 IsIn 多值判断方法(空值安全)
```mermaid
flowchart TD
Start(["进入 Generate"]) --> NS["解析命名空间与枚举全名"]
NS --> Members["提取枚举成员(常量值)"]
Members --> Build["拼接 using 与命名空间"]
Build --> Ext["生成静态 partial 扩展类"]
Ext --> IsX["为每个成员生成 IsX 方法"]
IsX --> IsIn["生成 IsIn(params T[]) 方法"]
IsIn --> Hint["设置提示文件名 *.EnumExtensions.g.cs"]
Hint --> End(["完成"])
```
图表来源
- [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L57-L103)
章节来源
- [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L1-L114)
- [GenerateEnumExtensionsAttribute.cs](file://GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs#L1-L20)
### Godot 源代码生成器(特殊功能)
- GodotModuleMarker作为 Godot 模块命名空间的占位类型,用于标记与识别 Godot 相关生成逻辑
- Godot 专用生成器:在 Godot 项目中,结合 Godot 特定接口与约定,自动生成模块标记与相关代码
```mermaid
classDiagram
class GodotModuleMarker {
<<sealed>>
+internal
}
```
图表来源
- [GodotModuleMarker.cs](file://GFramework.Godot.SourceGenerators.Abstractions/GodotModuleMarker.cs#L1-L6)
章节来源
- [GodotModuleMarker.cs](file://GFramework.Godot.SourceGenerators.Abstractions/GodotModuleMarker.cs#L1-L6)
## 依赖关系分析
- 通用生成器依赖:
- Abstractions属性与接口定义LogAttribute、ContextAwareAttribute、GenerateEnumExtensionsAttribute
- Common生成器基类与通用工具AttributeClassGeneratorBase、AttributeEnumGeneratorBase
- Core.Abstractions核心接口与常量用于生成代码中的类型引用
- Godot 生成器依赖:
- Godot.AbstractionsGodot 特定标记(如 GodotModuleMarker
- Common复用通用生成器基类与工具
- 打包策略:
- 生成器本体仅打包到 analyzers 下,不打包到 lib
- 运行期依赖Abstractions/Common打包到 lib供编译期引用
```mermaid
graph LR
SG["GFramework.SourceGenerators"] --> Abst["Abstractions"]
SG --> Common["Common"]
SG --> CoreAbst["Core.Abstractions"]
GSG["GFramework.Godot.SourceGenerators"] --> GSAbst["Godot.Abstractions"]
GSG --> Common
GSG -. 引用 .-> CoreAbst
Abst -. 定义 .-> SG
Common -. 基类 .-> SG
CoreAbst -. 接口 .-> SG
```
图表来源
- [GFramework.SourceGenerators.csproj](file://GFramework.SourceGenerators/GFramework.SourceGenerators.csproj#L29-L55)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L29-L53)
章节来源
- [GFramework.SourceGenerators.csproj](file://GFramework.SourceGenerators/GFramework.SourceGenerators.csproj#L29-L55)
- [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L29-L53)
## 性能考量
- 零运行时开销:生成器仅在编译期工作,生成的代码在运行时直接执行,不引入额外运行时依赖
- 增量生成:使用 IIncrementalGenerator 与语法提供程序,仅对受影响的节点进行再生成
- 诊断与早失败:在 ValidateSymbol 阶段尽早报告无效标记或不兼容类型,避免无效生成
- 生成代码最小化:按需生成必要接口实现与字段,不生成冗余代码
## 故障排除指南
- 类必须为 partial当类未声明为 partial 时ContextAwareGenerator 会报告诊断;请将类声明为 partial
- 非枚举类型EnumExtensionsGenerator 要求标记在枚举上;请确保目标类型为 enum
- LogAttribute 无效:若日志生成未生效,检查类是否为 partial、命名空间是否正确、属性参数是否合法
- 诊断信息:生成器在关键路径输出 Trace 诊断,便于定位问题
章节来源
- [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L90-L105)
- [EnumExtensionsGenerator.cs](file://GFramework.SourceGenerators/enums/EnumExtensionsGenerator.cs#L37-L49)
- [LoggerDiagnostic.cs](file://GFramework.SourceGenerators/diagnostics/LoggerDiagnostic.cs#L1-L21)
## 结论
GFramework 源代码生成器通过清晰的抽象层与通用基类实现了三类高价值的编译期代码生成日志字段、上下文感知接口与枚举扩展方法。Godot 专用生成器在此基础上提供了模块标记与特定约定支持。整体设计遵循零运行时开销原则,结合增量生成与严格诊断,确保生成质量与开发体验。
## 附录
### 使用方法与配置选项
- LoggerGenerator
- 在类上添加 LogAttribute可配置 Name、FieldName、AccessModifier、IsStatic 等参数
- 生成结果partial 类内包含只读日志字段,初始化自 LoggerFactoryResolver
- ContextAwareGenerator
- 在类上添加 ContextAwareAttribute类必须为 partial class
- 生成结果:显式实现 IContextAware包含 Context 属性与 SetContext/GetContext
- EnumExtensionsGenerator
- 在枚举上添加 GenerateEnumExtensionsAttribute可配置是否生成 IsX 与 IsIn 方法
- 生成结果:静态 partial 扩展类,包含 IsX 与 IsIn 扩展方法
章节来源
- [LogAttribute.cs](file://GFramework.SourceGenerators.Abstractions/logging/LogAttribute.cs#L1-L40)
- [ContextAwareAttribute.cs](file://GFramework.SourceGenerators.Abstractions/rule/ContextAwareAttribute.cs#L1-L11)
- [GenerateEnumExtensionsAttribute.cs](file://GFramework.SourceGenerators.Abstractions/enums/GenerateEnumExtensionsAttribute.cs#L1-L20)
### 最佳实践
- 将生成器生成的 partial 类与手写部分分离,避免冲突
- 在 Godot 项目中,优先使用 Godot 专用生成器与标记类型
- 合理使用 IsStatic 与访问修饰符,确保日志字段可见性与性能需求平衡
- 对枚举扩展方法进行统一命名规范,保持 IsX 与 IsIn 的一致性
### 测试策略与验证方法
- 快照测试:对生成的源代码进行快照比对,确保生成结果稳定
- 单元测试:验证生成器在不同输入组合下的行为与诊断输出
- 集成测试:在真实项目中验证生成代码的编译与运行效果