diff --git a/lib/core/Handles/HandlesClassDef.py b/lib/core/Handles/HandlesClassDef.py index c4ac825..5bb66a7 100644 --- a/lib/core/Handles/HandlesClassDef.py +++ b/lib/core/Handles/HandlesClassDef.py @@ -129,13 +129,19 @@ class ClassHandle(BaseHandle): for i, tp_name in enumerate(type_param_names): if type_names and i < len(type_names): tn: str = type_names[i] - # 类类型参数(非内建)用 mangled type_arg 替换 T(带 sha1 前缀 + - # ptr 后缀,如 'f467978339422f32.ASTptr'),避免模板内部嵌套注解 - # (如 list[T].__iter__ 返回 list[T])被替换成裸短名('AST')后 - # 重新特化出只有 declare、无方法体的错误特化(list[AST].__len__ - # undefined symbol 根因)。_make_replacement_node 会把它还原为 - # 'sha1.AST | t.CPtr',重新解析时拼回一致的 mangled 名。 - if tn not in _BUILTIN_TYPE_NAMES and i < len(type_args): + # 判断是否为 t 模块内建类型(裸名或 't.' 前缀,如 'CInt'/'t.CInt'): + # 内建类型必须用源码名(type_name)替换 T(t.CInt → i32),否则 + # 用 mangled type_arg(如 'i32')替换会产生 'i32.__sizeof__' 这类 + # 源码中不存在的名称([FATAL][__sizeof__] 类型 'i32' 无法解析)。 + # 真正的类类型参数(如 'AST'/'ast.AST')才用 mangled type_arg + # (带 sha1 前缀 + ptr 后缀),避免模板内部嵌套注解被替换成裸短名 + # 后重新特化出只有 declare、无方法体的错误特化(list[AST].__len__ + # undefined symbol 根因)。_make_replacement_node 会把 mangled 名 + # 还原为 'sha1.AST | t.CPtr',重新解析时拼回一致的 mangled 名。 + tn_bare: str = tn.split('.')[-1] if '.' in tn else tn + if tn_bare in _BUILTIN_TYPE_NAMES: + type_map[tp_name] = tn + elif i < len(type_args): type_map[tp_name] = type_args[i] else: type_map[tp_name] = tn