Files
ViperC/App/lib
TermiNexus 6a287b955e fix(TypeGenCType): 跨模块可见字段改为在类体声明(修 Repl.vp:802 属性链求值为空)
类别:c 源码违规(跨模块读得到的字段必须在类体声明)

现象:TPC 编译 TransPyV/App/lib/core/Repl.vp:802
  ct_names: list[str]* = GenApi._g_gen.TypeGenCType.CTypedefNames
报「带注解赋值表达式 …(Attribute 形态)编译期求值为空(表达式未解析出目标、无值可存),
赋值将被跳过、变量保持未初始化」。

判据(.vpi 与定义侧不同源,实证):
· TypeGenCType 类体**一个字段都没声明**:CTypedefNames / CTypedefTypeStrs / CTypedefNameIdx
  / CTypedefNameIdxCap / CTypedefNameIdxBuilt 全部只以方法体里的裸 `self.x = ...` 出现
  (:184 `self.CTypedefNames = tn`、:185、:66-73、:118-121)。
· 声明存根(.vpi)只携带**类体 AnnAssign 字段**与 `__init__` 里**带注解**的 self.x;方法体
  里的裸赋值只被**定义模块自己**的成员收集(HandlesClassDef 的 self.x 扫描)收录
  ⇒ 同一字段"定义模块成员表里有、引用模块没有"(实证:temp/05d515186a7c3668.vpi 内不含
  CTypedefNames 条目)⇒ 引用模块的属性链在第三级断掉,整条带注解赋值被判"无值可存"而终止。

修法:把这 5 个字段在**类体**显式声明(类型取自各自赋值处的真实类型):
  CTypedefNames / CTypedefTypeStrs : list[str] | t.CPtr   (:177-178 的 tn / ts 即 list[str]*)
  CTypedefNameIdx : sizet*                                (:64 / :71 的 idx)
  CTypedefNameIdxCap / CTypedefNameIdxBuilt : int
声明后定义侧与 .vpi 两侧字段集一致(类体 AnnAssign 先收集,方法体 self.x 扫描按名去重不再
重复登记)⇒ 布局同源。注意:该类的字段顺序/类型与旧构建不同(字段从"仅扫描收集"变为
"类体声明"),需要清缓存重编译。

附带(另一仓 commit):TPC 侧 `_handle_attr_nested` 的 7 处静默 return 已补 `_NoteAttrNone`
记账(含内层失败原因链),下次同类报错会直接给出"读取侧原因=…"。
2026-09-30 09:59:54 +08:00
..