TierFs 规范分析器(TCSG120-122)——spec 实参的编译期校验
对 TierFs.New / TierFs.Open 调用点的 spec 实参做编译期校验:scheme 拼写、参数名、
参数 × 介质适用性在编译即红——与运行时校验构成纵深防御(错误在 IDE 波浪线暴露,不等测试)。
三条规则
| 诊断 | 拦截形态 | 修法 |
|---|---|---|
| TCSG120 | spec scheme 非法(合法集:local:// / local: / memory: / virtual:// / network:///) |
改用合法 scheme |
| TCSG121 | spec 参数名未知(参数字典键不在该 scheme 的参数表内) | 对照参数表改名 |
| TCSG122 | 参数 × 介质违规(该参数不适用于所配介质) | 删参数或换介质 |
// TCSG120:scheme 拼错
var fs = TierFs.New("locall://data"); // ✗ 编译红:scheme 'locall:' 未知
// TCSG122:spec 参数不适用于该介质(cred 仅 network——回退表真值)
var fs = TierFs.New("memory://x?cred=xxx"); // ✗ 编译红:cred 不适用 memory
机制
- 注册
InvocationExpression语法节点回调——生成代码不分析,启用并发执行; - 参数 → 适用介质的回退表内置(编译内可见
[SpecParam]符号时从符号派生——单一事实源); - 真值表/规则同源性由 Core 契约测试钉死(漂移即红)。
注入与豁免
- 随
TC.Tier.CodeGen的 Analyzer 引用自动注入(Directory.Build.props全局挂载),无需手工 安装; - 豁免遵循标准
.editorconfig严重级配置(dotnet_diagnostic.TCSG120.severity = ...); - 规则段取 1xx(与生成器 RingKey 的 TCSG020 隔离)。
反模式
- 靠运行时 try-catch 兜 scheme 拼写——编译期已经拦了,运行时校验只服务动态拼出的 spec 字符串;
- 为绕过 TCSG122 把参数硬塞进别的 scheme——参数表按介质真实能力声明,绕过 = 运行期 行为未定义。
想深入
- 通用纪律族(分层依赖/禁用模式,TCSG130-139):Tier 分析器
- TierFs 入口契约:
src/TC.Tier.Core/docs/io.md