mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-31 18:39:00 +08:00
- 在 ContextGetGenerator 中添加对 const 字段的显式检查和跳过逻辑 - 更新文档说明 const、static 和 readonly 字段的处理方式 - 重构测试代码使用 MarkupTestSource 解析器进行更精确的诊断测试 - 添加新的 MarkupTestSource 类用于源码标记解析和诊断定位
53 lines
1.6 KiB
Markdown
53 lines
1.6 KiB
Markdown
# GFramework.SourceGenerators
|
||
|
||
Core 侧通用源码生成器模块。
|
||
|
||
## Context Get 注入
|
||
|
||
当类本身是上下文感知类型时,可以通过字段特性生成一个手动调用的注入方法:
|
||
|
||
- `[GetService]`
|
||
- `[GetServices]`
|
||
- `[GetSystem]`
|
||
- `[GetSystems]`
|
||
- `[GetModel]`
|
||
- `[GetModels]`
|
||
- `[GetUtility]`
|
||
- `[GetUtilities]`
|
||
- `[GetAll]`
|
||
|
||
上下文感知类满足以下任一条件即可:
|
||
|
||
- 类上带有 `[ContextAware]`
|
||
- 继承 `ContextAwareBase`
|
||
- 实现 `IContextAware`
|
||
|
||
生成器会生成 `__InjectContextBindings_Generated()`,需要在合适的生命周期中手动调用。在 Godot 中通常放在 `_Ready()`:
|
||
|
||
```csharp
|
||
using GFramework.SourceGenerators.Abstractions.Rule;
|
||
|
||
[ContextAware]
|
||
public partial class InventoryPanel
|
||
{
|
||
[GetModel]
|
||
private IInventoryModel _inventory = null!;
|
||
|
||
[GetServices]
|
||
private IReadOnlyList<IInventoryStrategy> _strategies = null!;
|
||
|
||
public override void _Ready()
|
||
{
|
||
__InjectContextBindings_Generated();
|
||
}
|
||
}
|
||
```
|
||
|
||
`[GetAll]` 作用于类本身,会自动扫描字段并推断 `Model`、`System`、`Utility` 相关的 `GetX` 调用;已显式标记字段的优先级更高。
|
||
|
||
`Service` 和 `Services` 绑定不会在 `[GetAll]` 下自动推断。对于普通引用类型字段,请显式使用 `[GetService]` 或
|
||
`[GetServices]`,避免将非上下文服务字段误判为服务依赖。
|
||
|
||
`[GetAll]` 会跳过 `const`、`static` 和 `readonly` 字段。若某个字段本来会被 `[GetAll]` 推断为
|
||
`Model`、`System` 或 `Utility` 绑定,但因为是不可赋值的 `static` 或 `readonly` 字段而被跳过,生成器会发出警告提示该字段不会参与生成。
|