TermiNexus
e5f044dd03
chore(诊断): AnnAssign RHS 为 接收者链.方法(...) 时补接收者基址诊断 + 最近一次属性读取失败原因
【b 机制漏豁免 —— 只加取证,不改任何判定/IR】现场:翻译
TransPyV/App/lib/core/Gen/Class/ClassGenEnum.vp:59
`ty: llvmlite.LLVMType* = self.Gen.TypeGenResolve.resolve_typedef_or_map(pool, at.attr,
imported_modules, from_imports)` 报"(Call 形态)编译期求值为空"。
已按代码**排除**出来的事实(写进注释,供后续不再重复排查):
· 方法声明缺失会在 HandlesExprCall._HandleMethodCallLlvm 内 raise
"Undefined method …",不会走到该 fail-fast;
· 该函数在"方法已找到"之后不会返回 None,唯一的 None 出口是
`ObjVal = HandleExprLlvm(Node.func.value)` 为假(L3335-3337)——
即**接收者链 `self.Gen.TypeGenResolve` 自身求值为空**才是根因;
· 但原报文的"基址诊断"只在 RHS 是 **Attribute** 时才打印(HandlesBase:784),
Call 形态下接收者失败原因被丢弃 ⇒ 报错点与真因相隔数层。
修法(纯取证):HandlesBase 的通用 fail-fast 增 `elif Call(func=Attribute)` 分支,补三行:
① `被调者接收者诊断:` —— 复用 `_DescribeAttrBase(Gen, Node.func.value)`:接收者
(如 `self.Gen`)的基座形态 / var_struct_class / alloca 类型 / 是否在 Gen.structs /
class_members 项数与字段名单 / struct body 元素数 / 该字段计算偏移;
② `最近一次属性读取失败:` —— 回显 `Gen._LastAttrNone` 的 (类, 字段, 原因):Call 形态下
无法用 (类, 字段) 与被报节点比对,故此处**无条件**回显(Attribute 形态仍保持
"必须与被报节点一致"的原判据,避免旧记录误导);
③ `被调方法=… 已声明同名方法键(示前 4 / 共 N):` —— 区分"方法根本没声明"与
"接收者读不出来"(后者才会命中本 fail-fast,但这一行让两者一眼可分)。
未验证:本提交只改诊断文本,行为不变;需再跑一次构建才能看到新增三行。
2026-09-30 14:45:55 +08:00
..
2026-09-30 14:45:55 +08:00
2026-09-30 14:35:50 +08:00
2026-09-28 13:57:04 +08:00
2026-07-18 19:25:40 +08:00
2026-08-17 09:36:38 +08:00
2026-07-18 19:25:40 +08:00
2026-07-18 19:25:40 +08:00
2026-07-18 19:25:40 +08:00
2026-07-18 19:25:40 +08:00
2026-09-29 13:17:36 +08:00
2026-07-30 16:33:56 +08:00
2026-09-26 19:27:22 +08:00
2026-09-26 19:27:22 +08:00
2026-09-28 18:14:45 +08:00
2026-07-18 19:25:40 +08:00
2026-09-26 19:27:22 +08:00
2026-09-28 18:14:45 +08:00
2026-09-28 18:25:57 +08:00
2026-09-29 13:17:36 +08:00
2026-07-18 19:25:40 +08:00
2026-09-29 13:17:36 +08:00
2026-07-18 19:25:40 +08:00
2026-09-29 16:16:01 +08:00