# Godot源代码生成器 **本文档引用的文件** - [GodotModuleMarker.cs](file://GFramework.Godot.SourceGenerators.Abstractions/GodotModuleMarker.cs) - [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj) - [GeWuYou.GFramework.Godot.SourceGenerators.targets](file://GFramework.Godot.SourceGenerators/GeWuYou.GFramework.Godot.SourceGenerators.targets) - [GFramework.Godot.SourceGenerators.Abstractions.csproj](file://GFramework.Godot.SourceGenerators.Abstractions/GFramework.Godot.SourceGenerators.Abstractions.csproj) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs) - [IGodotModule.cs](file://GFramework.Godot/architecture/IGodotModule.cs) - [AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs) - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs) - [README.md](file://GFramework.SourceGenerators/README.md) - [GeneratorTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorTest.cs) - [GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构概览](#架构概览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排除指南](#故障排除指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 Godot源代码生成器是GFramework框架中用于自动化生成Godot模块相关代码的工具集。该生成器基于Roslyn源代码生成技术,在编译时自动识别和处理带有特定特性的类,生成相应的Godot模块配置代码。 该生成器的主要目标是: - **自动化模块标记**:通过特性标记自动识别Godot模块 - **编译时代码生成**:在编译阶段生成所需的模块配置代码 - **反射优化**:减少运行时反射调用,提升性能 - **类型安全**:确保生成代码的类型安全性 - **开发效率**:简化Godot模块的开发和配置过程 ## 项目结构 GFramework源代码生成器采用分层架构设计,主要包含以下核心模块: ```mermaid graph TB subgraph "生成器核心层" SG[GFramework.Godot.SourceGenerators] SGA[GFramework.Godot.SourceGenerators.Abstractions] end subgraph "通用生成器基础" SGC[GFramework.SourceGenerators.Common] SGCA[GFramework.SourceGenerators.Abstractions] end subgraph "Godot集成层" GG[GFramework.Godot] GGA[GFramework.Godot.Abstractions] end subgraph "测试层" GST[GFramework.SourceGenerators.Tests] end SG --> SGC SG --> SGA SGA --> SGCA SGC --> SGCA GG --> SG GST --> SG ``` **图表来源** - [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.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) ## 核心组件 ### GodotModuleMarker标记器 GodotModuleMarker是Godot模块命名空间的占位类型,用于标识和标记Godot模块相关的代码区域。 ```mermaid classDiagram class GodotModuleMarker { <> +internal GodotModuleMarker() } note for GodotModuleMarker "用于标记Godot模块命名空间的占位类型" ``` **图表来源** - [GodotModuleMarker.cs](file://GFramework.Godot.SourceGenerators.Abstractions/GodotModuleMarker.cs#L1-L6) ### 基础生成器架构 所有生成器都基于AttributeClassGeneratorBase抽象基类构建,该基类提供了统一的生成器模式: ```mermaid classDiagram class AttributeClassGeneratorBase { <> #string AttributeShortNameWithoutSuffix +Initialize(context) void #ResolveAttribute(compilation, symbol) AttributeData #Execute(context, compilation, classDecl, symbol) void #ValidateSymbol(context, compilation, syntax, symbol, attr) bool #Generate(context, compilation, symbol, attr) string #GetHintName(symbol) string #ReportClassMustBePartial(context, syntax, symbol) void } class AttributeEnumGeneratorBase { <> #string AttributeShortNameWithoutSuffix +Initialize(context) void #ResolveAttribute(compilation, symbol) AttributeData #ValidateSymbol(context, compilation, syntax, symbol, attr) bool #Generate(symbol, attr) string #GetHintName(symbol) string } AttributeClassGeneratorBase <|-- AttributeEnumGeneratorBase ``` **图表来源** - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L1-L175) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L1-L104) **章节来源** - [GodotModuleMarker.cs](file://GFramework.Godot.SourceGenerators.Abstractions/GodotModuleMarker.cs#L1-L6) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L1-L175) - [AttributeEnumGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeEnumGeneratorBase.cs#L1-L104) ## 架构概览 ### 编译时代码生成流程 ```mermaid sequenceDiagram participant Dev as 开发者代码 participant Analyzer as Roslyn分析器 participant Generator as 源代码生成器 participant Compiler as C#编译器 participant Output as 生成的代码 Dev->>Analyzer : 编译项目 Analyzer->>Generator : 发现特性标记 Generator->>Generator : 解析语义模型 Generator->>Output : 生成源代码文件 Output->>Compiler : 参与编译过程 Compiler->>Dev : 生成可执行程序 Note over Generator,Output : 在编译时执行 Note over Dev,Compiler : 类型安全和反射优化 ``` **图表来源** - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L23-L47) - [GFramework.Godot.SourceGenerators.targets](file://GFramework.Godot.SourceGenerators/GeWuYou.GFramework.Godot.SourceGenerators.targets#L6-L10) ### Godot模块集成架构 ```mermaid graph LR subgraph "Godot模块层" AM[AbstractGodotModule] IM[IGodotModule] end subgraph "生成器层" GM[GodotModuleMarker] AG[AttributeClassGeneratorBase] end subgraph "架构层" AA[AbstractArchitecture] AC[Architecture] end AM --> IM GM --> AG AA --> AM AC --> AA ``` **图表来源** - [AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs#L1-L55) - [IGodotModule.cs](file://GFramework.Godot/architecture/IGodotModule.cs#L1-L27) - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L94-L105) **章节来源** - [AbstractGodotModule.cs](file://GFramework.Godot/architecture/AbstractGodotModule.cs#L1-L55) - [IGodotModule.cs](file://GFramework.Godot/architecture/IGodotModule.cs#L1-L27) - [AbstractArchitecture.cs](file://GFramework.Godot/architecture/AbstractArchitecture.cs#L94-L105) ## 详细组件分析 ### 生成器初始化流程 ```mermaid flowchart TD Start([开始初始化]) --> CreateSyntaxProvider["创建语法提供程序"] CreateSyntaxProvider --> FilterClasses["过滤带有特性的类"] FilterClasses --> CombineCompilation["合并编译信息"] CombineCompilation --> RegisterOutput["注册源码输出"] RegisterOutput --> End([完成初始化]) FilterClasses --> CheckPartial{"类是否为partial?"} CheckPartial --> |否| ReportError["报告错误"] CheckPartial --> |是| ValidateSymbol["验证符号"] ValidateSymbol --> GenerateCode["生成代码"] GenerateCode --> AddSource["添加到源码输出"] ReportError --> End AddSource --> End ``` **图表来源** - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L23-L47) - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L67-L113) ### 诊断和错误处理机制 ```mermaid classDiagram class CommonDiagnostics { +Diagnostic GeneratorTrace +Trace(context, message) void +ClassMustBePartial Location } class SourceProductionContext { +ReportDiagnostic(diagnostic) void } CommonDiagnostics --> SourceProductionContext : "使用" note for CommonDiagnostics "提供生成器诊断信息" note for SourceProductionContext "报告诊断信息给编译器" ``` **图表来源** - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L41-L60) **章节来源** - [AttributeClassGeneratorBase.cs](file://GFramework.SourceGenerators.Common/generator/AttributeClassGeneratorBase.cs#L67-L113) - [CommonDiagnostics.cs](file://GFramework.SourceGenerators.Common/diagnostics/CommonDiagnostics.cs#L41-L60) ### 项目配置和构建流程 ```mermaid flowchart LR subgraph "项目配置" CSProj[GFramework.Godot.SourceGenerators.csproj] Targets[GeWuYou.GFramework.Godot.SourceGenerators.targets] end subgraph "构建过程" Analyzer[Analyzer注册] Dependencies[依赖管理] Packaging[包打包] end subgraph "输出结果" Generated[生成的代码] Runtime[运行时DLL] end CSProj --> Analyzer CSProj --> Dependencies CSProj --> Packaging Targets --> Analyzer Analyzer --> Generated Dependencies --> Runtime ``` **图表来源** - [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L35-L53) - [GeWuYou.GFramework.Godot.SourceGenerators.targets](file://GFramework.Godot.SourceGenerators/GeWuYou.GFramework.Godot.SourceGenerators.targets#L6-L10) **章节来源** - [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L1-L71) - [GeWuYou.GFramework.Godot.SourceGenerators.targets](file://GFramework.Godot.SourceGenerators/GeWuYou.GFramework.Godot.SourceGenerators.targets#L1-L16) ## 依赖关系分析 ### 组件耦合度分析 ```mermaid graph TD subgraph "外部依赖" Roslyn[Microsoft.CodeAnalysis] NetStandard[.NET Standard 2.0] end subgraph "内部组件" Generator[源代码生成器] Abstractions[抽象层] Diagnostics[诊断系统] Tests[测试框架] end subgraph "Godot集成" GodotAPI[Godot API] Modules[Godot模块] end Roslyn --> Generator NetStandard --> Generator Generator --> Abstractions Generator --> Diagnostics Generator --> Tests GodotAPI --> Modules Abstractions --> Modules ``` **图表来源** - [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L21-L33) - [GFramework.SourceGenerators.Common.csproj](file://GFramework.SourceGenerators.Common/GFramework.SourceGenerators.Common.csproj) ### 循环依赖检测 经过分析,项目结构避免了循环依赖: - 生成器项目仅依赖抽象层,不反向依赖具体实现 - 诊断系统独立于业务逻辑 - 测试框架独立于核心功能 **章节来源** - [GFramework.Godot.SourceGenerators.csproj](file://GFramework.Godot.SourceGenerators/GFramework.Godot.SourceGenerators.csproj#L29-L33) - [GFramework.Godot.SourceGenerators.Abstractions.csproj](file://GFramework.Godot.SourceGenerators.Abstractions/GFramework.Godot.SourceGenerators.Abstractions.csproj#L1-L32) ## 性能考虑 ### 编译时vs运行时性能对比 | 维度 | 源代码生成器 | 手写代码 | |------|-------------|----------| | **编译时** | 增加编译时间(几秒) | 无需编译 | | **运行时** | 与手写代码性能相同 | 标准性能 | | **内存使用** | 与手写代码相同 | 标准内存使用 | | **反射调用** | 减少或消除 | 可能较多 | ### 反射优化策略 ```mermaid flowchart TD Before[传统反射方式] --> After[生成器优化方式] Before --> ReflectionCalls["大量反射调用"] ReflectionCalls --> PerformanceLoss["性能损失"] PerformanceLoss --> MemoryOverhead["内存开销"] After --> DirectCalls["直接方法调用"] DirectCalls --> ZeroReflection["零反射"] ZeroReflection --> OptimalPerformance["最佳性能"] ``` ## 故障排除指南 ### 常见问题和解决方案 #### 1. 生成器未生效 **症状**:编译时没有生成预期的代码文件 **排查步骤**: 1. 检查项目文件中的NuGet包引用 2. 验证特性标记是否正确应用 3. 查看生成的诊断信息 **解决方案**: - 确保在项目文件中正确配置生成器引用 - 验证类必须标记为partial - 检查特性名称是否匹配 #### 2. 生成代码位置问题 **默认输出位置**:`obj/Debug/net6.0/generated/` **自定义配置**: ```xml Generated ``` #### 3. 调试生成器问题 **调试方法**: 1. 启用详细日志输出 2. 检查IDE错误列表 3. 查看生成的中间代码文件 **章节来源** - [README.md](file://GFramework.SourceGenerators/README.md#L914-L971) ### 测试和验证 #### 快照测试机制 ```mermaid sequenceDiagram participant Test as 测试代码 participant Generator as 生成器 participant Snapshot as 快照文件 participant Validator as 验证器 Test->>Generator : 执行生成器 Generator->>Snapshot : 生成代码文件 Test->>Validator : 比较快照 Validator->>Test : 返回验证结果 Note over Test,Validator : 确保生成结果一致性 ``` **图表来源** - [GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L1-L43) **章节来源** - [GeneratorTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorTest.cs#L1-L39) - [GeneratorSnapshotTest.cs](file://GFramework.SourceGenerators.Tests/core/GeneratorSnapshotTest.cs#L1-L43) ## 结论 Godot源代码生成器为GFramework框架提供了强大的自动化代码生成功能。通过特性标记驱动的方式,该生成器实现了: 1. **类型安全的模块识别**:通过GodotModuleMarker占位类型确保模块的类型安全性 2. **编译时优化**:在编译阶段生成代码,消除运行时反射开销 3. **灵活的扩展性**:基于抽象基类的设计允许轻松扩展新的生成器 4. **完善的诊断系统**:提供详细的错误报告和调试信息 该生成器显著提升了Godot项目的开发效率,同时保持了代码质量和性能表现。 ## 附录 ### 最佳实践建议 1. **特性标记规范**:确保所有需要生成代码的类都正确应用特性标记 2. **partial类要求**:生成器要求目标类必须标记为partial 3. **命名约定**:遵循一致的命名约定,便于代码维护 4. **测试覆盖**:为生成器功能编写充分的单元测试和快照测试 ### 扩展开发指南 当需要创建自定义生成器时: 1. 继承相应的基类(AttributeClassGeneratorBase或AttributeEnumGeneratorBase) 2. 实现必需的抽象方法 3. 在Initialize方法中配置语法提供程序 4. 实现Generate方法生成具体的源代码 5. 添加适当的诊断信息和错误处理