mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-07 00:39:00 +08:00
- 实现 project.godot 文件解析功能,支持 AutoLoad 和 Input Action 元数据提取 - 生成 AutoLoads 强类型访问入口,提供 GetRequiredNode 和 TryGetNode 方法 - 生成 InputActions 常量类,避免手写字符串魔法值 - 添加 AutoLoadAttribute 特性支持显式类型映射声明 - 实现标识符冲突检测和自动后缀追加机制 - 添加完整的诊断系统支持,包括类型继承检查和重复条目警告 - 创建 MSBuild 集成目标文件确保生成器正确加载 - 提供详细的 README 文档说明使用方法和最佳实践
76 lines
3.1 KiB
C#
76 lines
3.1 KiB
C#
using GFramework.SourceGenerators.Common.Constants;
|
|
|
|
namespace GFramework.Godot.SourceGenerators.Diagnostics;
|
|
|
|
/// <summary>
|
|
/// 基于 <c>project.godot</c> 的项目元数据生成相关诊断。
|
|
/// </summary>
|
|
public static class GodotProjectDiagnostics
|
|
{
|
|
/// <summary>
|
|
/// 标记了 <c>[AutoLoad]</c> 的类型必须继承自 <c>Godot.Node</c>。
|
|
/// </summary>
|
|
public static readonly DiagnosticDescriptor AutoLoadTypeMustDeriveFromNode = new(
|
|
"GF_Godot_Project_001",
|
|
"AutoLoad types must derive from Godot.Node",
|
|
"Type '{0}' uses [AutoLoad] but does not derive from Godot.Node",
|
|
PathContests.GodotNamespace,
|
|
DiagnosticSeverity.Error,
|
|
true);
|
|
|
|
/// <summary>
|
|
/// 多个类型映射到同一 AutoLoad 名称时会退化为非强类型访问。
|
|
/// </summary>
|
|
public static readonly DiagnosticDescriptor DuplicateAutoLoadMapping = new(
|
|
"GF_Godot_Project_002",
|
|
"Duplicate AutoLoad mappings were found",
|
|
"AutoLoad '{0}' is mapped by multiple types ({1}); the generated accessor falls back to Godot.Node until the mapping is unique",
|
|
PathContests.GodotNamespace,
|
|
DiagnosticSeverity.Warning,
|
|
true);
|
|
|
|
/// <summary>
|
|
/// 多个 AutoLoad 名称映射到同一个标识符时会追加稳定后缀。
|
|
/// </summary>
|
|
public static readonly DiagnosticDescriptor AutoLoadIdentifierCollision = new(
|
|
"GF_Godot_Project_003",
|
|
"Generated AutoLoad identifier collision",
|
|
"AutoLoad '{0}' collides with another generated identifier '{1}'; a stable numeric suffix was appended",
|
|
PathContests.GodotNamespace,
|
|
DiagnosticSeverity.Warning,
|
|
true);
|
|
|
|
/// <summary>
|
|
/// 多个 Input Action 名称映射到同一个标识符时会追加稳定后缀。
|
|
/// </summary>
|
|
public static readonly DiagnosticDescriptor InputActionIdentifierCollision = new(
|
|
"GF_Godot_Project_004",
|
|
"Generated Input Action identifier collision",
|
|
"Input action '{0}' collides with another generated identifier '{1}'; a stable numeric suffix was appended",
|
|
PathContests.GodotNamespace,
|
|
DiagnosticSeverity.Warning,
|
|
true);
|
|
|
|
/// <summary>
|
|
/// 同一个 <c>project.godot</c> 中存在重复 AutoLoad 条目。
|
|
/// </summary>
|
|
public static readonly DiagnosticDescriptor DuplicateAutoLoadEntry = new(
|
|
"GF_Godot_Project_005",
|
|
"Duplicate AutoLoad entry in project.godot",
|
|
"AutoLoad '{0}' is declared multiple times in project.godot; only the first declaration is used",
|
|
PathContests.GodotNamespace,
|
|
DiagnosticSeverity.Warning,
|
|
true);
|
|
|
|
/// <summary>
|
|
/// 同一个 <c>project.godot</c> 中存在重复 Input Action 条目。
|
|
/// </summary>
|
|
public static readonly DiagnosticDescriptor DuplicateInputActionEntry = new(
|
|
"GF_Godot_Project_006",
|
|
"Duplicate Input Action entry in project.godot",
|
|
"Input action '{0}' is declared multiple times in project.godot; only the first declaration is used",
|
|
PathContests.GodotNamespace,
|
|
DiagnosticSeverity.Warning,
|
|
true);
|
|
}
|