fix(cdef): 裸类型别名构造的 CDefine(如 DWORD(-11))也能提取进 _all_define_constants

根因:ConstEvaluator 只认 t.X(...) / from t import X 的类型构造,裸 typedef 别名(DWORD(-11))既不在 _t_module 也不在 mock ctx 的 _t_type_symbols → eval_full 返回 None → _ExtractCDefineConstantsFromPyi 整条丢弃该常量。win32file.vp 的 STD_INPUT/OUTPUT/ERROR_HANDLE 是全仓唯一用别名构造写的 define,正对应链接期三个 undefined symbol(模块属性访问 wf.STD_*_HANDLE 解析落空后退化成未定义全局)。补:eval_full 失败且值为单参 Call 时,回退求值其实参(CDefine 只要常量值,位型一致)。
This commit is contained in:
TermiNexus committed 2026-10-10 20:57:26 +08:00
1 parent 936a43f543
commit e1a0fbf9c0
1 file changed
+10
+10
View File
@@ -620,6 +620,16 @@ def _ExtractCDefineConstantsFromPyi(pyi_path: str, all_dc: dict[str, object]) ->
if isinstance(node, ast.AnnAssign) and isinstance(node.target, ast.Name):
if AnnotationContainsName(node.annotation, 'CDefine') and node.value:
val: object = ConstEvaluator.eval_full(node.value, ctx)
if val is None and isinstance(node.value, ast.Call) and len(node.value.args) == 1:
# 类型构造的**裸别名**形态(如 `DWORD(-11)`,非 `t.CUnsignedLong(-11)`):
# eval_full 只认 `t.X(...)` / `from t import X`(见 ConstEvaluator
# _eval_compile_time_call),裸 typedef 别名既不在 _t_module 也不在
# mock ctx 的 _t_type_symbols 里 → 返回 None → 该常量被整条丢弃。
# 现场:win32file.vp 的 STD_INPUT/OUTPUT/ERROR_HANDLE 是全仓**唯一**用
# 别名构造写的 define → 唯独这三个进不了 _all_define_constants,导致
# 模块属性访问 `wf.STD_ERROR_HANDLE` 解析落空、退化成未定义的全局符号
# (链接失败)。CDefine 关心的是常量值,故回退求值其唯一实参(位型一致)。
val = ConstEvaluator.eval_full(node.value.args[0], ctx)
if val is not None and isinstance(val, (int, float, str)):
all_dc[node.target.id] = val
except Exception as e: