diff --git a/App/lib/core/Gen/ClassGenBase.vp b/App/lib/core/Gen/ClassGenBase.vp index 8ab8507..dc88c95 100644 --- a/App/lib/core/Gen/ClassGenBase.vp +++ b/App/lib/core/Gen/ClassGenBase.vp @@ -872,13 +872,48 @@ class ClassGenBase: if base_node is None: continue bname: str = self._get_base_name(base_node, pool) - if bname is not None and self._is_marker_base(bname) == 0: - return bname + if bname is not None: + # 基类别名解析(from t import CStruct as cs → cs 实际是 CStruct)。 + # ClassGen 拆分(47ac2dd)时丢失,EdgeCaseTest Test12 class + # CsPoint(cs) 回归根因:'cs' 被当真实父类 → find_struct("cs") + # 失败 → 类 defer 永不注册 → 变量注解解析失败。 + bname = self._resolve_base_alias(bname, trans) + if self._is_marker_base(bname) == 0: + return bname return None + def _resolve_base_alias(self, base_name: str, + trans: HT.Translator | t.CPtr = None) -> str: + """解析基类别名:from t import CStruct as cs → 基类 cs 实际是 CStruct。 + + 别名不解析时 "cs" 会被当作真实父类名 → find_struct("cs") 失败 → + PhaseA 预注册把整类 defer(永不注册)→ 变量注解 X 解析失败 + (EdgeCaseTest Test12 class CsPoint(cs): 根因)。 + """ + if base_name is None or trans is None or trans._from_imports is None: + return base_name + orig: str = HandlesImports.lookup_from_import_original( + trans._from_imports, base_name) + if orig is not None: + # lookup_from_import_original 返回 from_imports 内部指针且未 NUL 结尾 + # (如 "CStruct myint:t:CInt CChar:t CPtr:t" 整串直到真正的 NUL)。 + # 复制到独立缓冲并按空格截断出干净原始名——否则 _is_marker_base 的 + # strcmp 对整串比较失败 → 别名基类(CStruct as cs)被当真实父类 → + # find_struct 失败 → 整类 defer 永不注册 → 变量注解解析失败。 + og_len: t.CSizeT = 0 + while orig[og_len] != ' ' and orig[og_len] != '\0': + og_len += 1 + if og_len > 0: + og_buf: str = CompilerFactory.get_perm_pool().alloc(og_len + 1) + if og_buf is not None: + string.strncpy(og_buf, orig, og_len) + og_buf[og_len] = '\0' + return og_buf + return base_name def _collect_parents(self, pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, parents_buf: t.CSizeT | t.CPtr, - max_parents: int) -> int: + max_parents: int, + trans: HT.Translator | t.CPtr = None) -> int: """收集所有非 marker 父类名到 parents_buf,返回数量""" if pool is None or cd is None or cd.bases is None or parents_buf is None: return 0 @@ -892,9 +927,12 @@ class ClassGenBase: if base_node is None: continue bname: str = self._get_base_name(base_node, pool) - if bname is not None and self._is_marker_base(bname) == 0: - parents_buf[count] = t.CSizeT(bname) - count += 1 + if bname is not None: + # 基类别名解析(同 _get_parent_class,见 _resolve_base_alias) + bname = self._resolve_base_alias(bname, trans) + if self._is_marker_base(bname) == 0: + parents_buf[count] = t.CSizeT(bname) + count += 1 return count def _field_name_exists(self, names_buf: t.CSizeT | t.CPtr, count: int, name: str) -> int: diff --git a/App/lib/core/Gen/ClassGenDef.vp b/App/lib/core/Gen/ClassGenDef.vp index 5267d1e..db5de5e 100644 --- a/App/lib/core/Gen/ClassGenDef.vp +++ b/App/lib/core/Gen/ClassGenDef.vp @@ -151,7 +151,7 @@ class ClassGenDef(ClassGenBase.ClassGenBase): parents_buf: t.CSizeT | t.CPtr = pool.alloc(8 * HandlesStruct.PARENT_MAX) parents_count: int = 0 if parents_buf is not None: - parents_count = HandlesClassDef._collect_parents(pool, cd, parents_buf, HandlesStruct.PARENT_MAX) + parents_count = HandlesClassDef._collect_parents(pool, cd, parents_buf, HandlesStruct.PARENT_MAX, trans) is_novtable_deco: int = 0 if cd.decorator_list is not None: if HandlesClassDef._has_decorator(cd.decorator_list, "NoVTable") == 1: diff --git a/App/lib/core/Gen/TypeGenResolve.vp b/App/lib/core/Gen/TypeGenResolve.vp index 5e3c90a..1c846bd 100644 --- a/App/lib/core/Gen/TypeGenResolve.vp +++ b/App/lib/core/Gen/TypeGenResolve.vp @@ -1016,6 +1016,12 @@ class TypeGenResolve(TypeGenBase.TypeGenBase): # 本模块未定义时回退按裸名全局查找(import 来的类走此路径)。 if trans is not None and trans.ModuleSha1 is not None: own_entry: HandlesStruct.StructEntry | t.CPtr = HandlesStruct.find_struct_by_module(nm.id, trans.ModuleSha1) + #region debug-point ANNOT + stdio.printf("[DBG-ANNOT] resolve Name=%s modsha=%s own=%d vis=%d\n", + nm.id, trans.ModuleSha1, + (1 if own_entry is not None else 0), + (1 if HandlesStruct.is_struct_visible(nm.id) != 0 else 0)) + #endregion if own_entry is not None and own_entry.Ty is not None: # 有 __new__ 的类(堆对象)注解 → Ptr(struct)(引用语义,对齐 TPC)。 # 否则无 __new__ 的类(栈对象,如 Point)保持 struct 值语义: diff --git a/App/lib/core/Handles/HandlesClassDef.vp b/App/lib/core/Handles/HandlesClassDef.vp index cf2a4a7..07798de 100644 --- a/App/lib/core/Handles/HandlesClassDef.vp +++ b/App/lib/core/Handles/HandlesClassDef.vp @@ -390,12 +390,13 @@ def _get_parent_class(cd: ast.ClassDef | t.CPtr, def _collect_parents(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, parents_buf: t.CSizeT | t.CPtr, - max_parents: int) -> int: + max_parents: int, + trans: HT.Translator | t.CPtr = None) -> int: """收集所有非 marker 父类名到 parents_buf,返回数量(委托到 gen._collect_parents)""" import lib.core.Gen.Generator as Generator g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(_g_gen, t.CPtr)) if g is not None: - return g._collect_parents(pool, cd, parents_buf, max_parents) + return g._collect_parents(pool, cd, parents_buf, max_parents, trans) return 0