advanced userinterface design
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
# PanelStateIncrementalGenerator 结构草案
|
||||
|
||||
本文档说明当前 `PanelStateIncrementalGenerator` 的设计目标:
|
||||
|
||||
1. 只有一个增量生成器入口点
|
||||
2. 入口识别的是“类型声明”,不是单个字段
|
||||
3. 类型进入统一上下文后,内部拆成三个独立分析部分
|
||||
4. 三部分不互相依赖实例成员,只共享同一份中间模型
|
||||
|
||||
---
|
||||
|
||||
## 1. 为什么入口要识别类型声明
|
||||
|
||||
VSS 后续的生成需求不再只是“某个字段生成 enum”,而是围绕某个状态类型展开:
|
||||
|
||||
1. 该类型有哪些公开状态符号
|
||||
2. 该类型有哪些状态变化绑定
|
||||
3. 基于前两者可以推导出哪些 command handler 路由入口
|
||||
|
||||
因此,最合适的根单位不是单个字段,而是一个类型声明。
|
||||
|
||||
也就是说,入口阶段做的事情应该是:
|
||||
|
||||
1. 找出值得参与 VSS 生成的类型
|
||||
2. 收集该类型上所有已知标记成员
|
||||
3. 把这份类型级目标交给前两部分分析,再进入第三部分派生调度
|
||||
|
||||
---
|
||||
|
||||
## 2. 三部分内部分析
|
||||
|
||||
当前骨架把内部分析拆成三块:
|
||||
|
||||
1. `StateSymbols`
|
||||
2. `StateChangeBindings`
|
||||
3. `StateChangeCommandHandlers`
|
||||
|
||||
### 2.1 StateSymbols
|
||||
|
||||
这一部分负责状态符号层。
|
||||
|
||||
目标是为后续生成这些东西打基础:
|
||||
|
||||
1. 状态节点枚举
|
||||
2. 状态项元数据
|
||||
3. state 向量上的属性节点
|
||||
4. 节点到属性的静态映射
|
||||
|
||||
### 2.2 StateChangeBindings
|
||||
|
||||
这一部分负责绑定层。
|
||||
|
||||
目标是分析:
|
||||
|
||||
1. 哪些状态变化需要绑定到 handler
|
||||
2. 哪些声明使用了 `StateChangeBinding` 之类的标记
|
||||
3. 后续需要生成怎样的静态接线代码
|
||||
|
||||
### 2.3 StateChangeCommandHandlers
|
||||
|
||||
这一部分负责调度层。
|
||||
|
||||
它不是一个额外的 attribute 输入层,而是前两部分完成后自动运行的派生阶段。
|
||||
|
||||
目标是分析:
|
||||
|
||||
1. 哪些状态符号和 binding 结果可以组成 command handler 路由入口
|
||||
2. 后续如何生成状态变化命令到 handler 的静态路由
|
||||
3. 如何在不依赖运行时字符串解释器的前提下构建调度表
|
||||
|
||||
---
|
||||
|
||||
## 3. 为什么三部分不能互相暴露实例成员
|
||||
|
||||
原因很简单:
|
||||
|
||||
1. Roslyn 生成器不是运行时 IOC 容器
|
||||
2. 不应该设计成多个生成器实例互相通信
|
||||
3. 也不应该让一个分析模块依赖另一个模块的内部字段状态
|
||||
|
||||
正确方式是:
|
||||
|
||||
1. 统一入口构建共享中间模型
|
||||
2. 三部分都基于这份中间模型分析
|
||||
3. 最终统一做诊断和发射
|
||||
|
||||
也就是说,共享的应该是:
|
||||
|
||||
1. 类型级目标
|
||||
2. 已知标记成员
|
||||
3. 编译上下文
|
||||
4. 归一化后的分析结果
|
||||
|
||||
而不是:
|
||||
|
||||
1. 某个模块里的字典字段
|
||||
2. 某个模块先运行出来的实例状态
|
||||
3. 依赖执行顺序的临时对象
|
||||
|
||||
---
|
||||
|
||||
## 4. 当前骨架中的文件分工
|
||||
|
||||
当前相关文件如下:
|
||||
|
||||
1. `PanelStateIncrementalGenerator.cs`
|
||||
2. `PanelStateIncrementalGenerator.Pipeline.cs`
|
||||
3. `PanelStateIncrementalGenerator.Models.cs`
|
||||
4. `PanelStateIncrementalGenerator.Analysis.cs`
|
||||
5. `PanelStateIncrementalGenerator.StateSymbols.cs`
|
||||
6. `PanelStateIncrementalGenerator.StateChangeBindings.cs`
|
||||
7. `PanelStateIncrementalGenerator.StateCommandHandlers.cs`
|
||||
8. `PanelStateIncrementalGenerator.Emitter.cs`
|
||||
9. `PanelStateIncrementalGenerator.Diagnostics.cs`
|
||||
|
||||
它们各自的职责是:
|
||||
|
||||
1. `PanelStateIncrementalGenerator.cs`
|
||||
负责总入口接线
|
||||
|
||||
2. `PanelStateIncrementalGenerator.Pipeline.cs`
|
||||
负责从语法树中找出类型级候选,并收集已知标记成员
|
||||
|
||||
3. `PanelStateIncrementalGenerator.Models.cs`
|
||||
负责共享中间模型和三部分分析结果模型
|
||||
|
||||
4. `PanelStateIncrementalGenerator.Analysis.cs`
|
||||
负责协调三部分分析模块,并汇总出统一输出上下文
|
||||
|
||||
5. `PanelStateIncrementalGenerator.StateSymbols.cs`
|
||||
负责状态符号层分析
|
||||
|
||||
6. `PanelStateIncrementalGenerator.StateChangeBindings.cs`
|
||||
负责状态变化绑定层分析
|
||||
|
||||
7. `PanelStateIncrementalGenerator.StateCommandHandlers.cs`
|
||||
负责基于前两部分结果派生状态变化命令处理层
|
||||
|
||||
8. `PanelStateIncrementalGenerator.Emitter.cs`
|
||||
负责真正输出当前轮次的生成代码
|
||||
|
||||
9. `PanelStateIncrementalGenerator.Diagnostics.cs`
|
||||
负责后续统一挂诊断定义
|
||||
|
||||
---
|
||||
|
||||
## 5. 当前状态
|
||||
|
||||
现在这套代码还只是骨架,业务逻辑没有真正接进去。
|
||||
|
||||
当前它已经具备的结构能力是:
|
||||
|
||||
1. 入口已经从字段级切到类型级
|
||||
2. 已知标记成员会在 Pipeline 阶段被收集
|
||||
3. 内部已经形成“前两部分显式分析 + 第三部分派生调度”的结构
|
||||
4. 发射器已经能看到每个类型在三部分里各自命中了多少成员
|
||||
|
||||
也就是说,现在已经完成的是“结构立住”,还没有进入“具体生成 VSS 代码”的阶段。
|
||||
|
||||
---
|
||||
|
||||
## 6. 后续最自然的实现顺序
|
||||
|
||||
如果继续往下做,建议顺序是:
|
||||
|
||||
1. 先完善 `StateSymbols`
|
||||
2. 再完善 `StateChangeBindings`
|
||||
3. 最后完善 `StateChangeCommandHandlers`
|
||||
|
||||
原因是:
|
||||
|
||||
1. 状态符号层是基础设施
|
||||
2. 绑定层建立在状态符号层之上
|
||||
3. command handler 调度层由前两层自动派生
|
||||
|
||||
所以三部分虽然是并列模块,但实现优先级并不是并列的。
|
||||
|
||||
---
|
||||
|
||||
## 7. 一句话总结
|
||||
|
||||
当前设计不是“三个生成器共享上下文”,而是:
|
||||
|
||||
一个 `PanelStateIncrementalGenerator` 统一入口,识别类型声明,先完成前两部分分析,再自动进入第三部分派生调度。
|
||||
Reference in New Issue
Block a user