Table of Contents

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 隔离)。

反模式

  1. 靠运行时 try-catch 兜 scheme 拼写——编译期已经拦了,运行时校验只服务动态拼出的 spec 字符串;
  2. 为绕过 TCSG122 把参数硬塞进别的 scheme——参数表按介质真实能力声明,绕过 = 运行期 行为未定义。

想深入

  • 通用纪律族(分层依赖/禁用模式,TCSG130-139):Tier 分析器
  • TierFs 入口契约:src/TC.Tier.Core/docs/io.md