diff --git a/lib/core/Handles/HandlesAnnAssign.py b/lib/core/Handles/HandlesAnnAssign.py index d4d822e..8014caf 100644 --- a/lib/core/Handles/HandlesAnnAssign.py +++ b/lib/core/Handles/HandlesAnnAssign.py @@ -29,6 +29,33 @@ def _IsGenericTpName(name: str) -> bool: return len(name) == 1 and name.isalpha() and name.isupper() +# 指针/未知**占位**类名(非真实类):联合注解 rawptr[T] / X | t.CPtr 折叠后, +# var_struct_class 里可能落进这些占位名(它们可能恰好也在 Gen.structs 里,如 +# 'rawptr')。占位名不表态具体类 ⇒ 不得登记为「注解声明类」的权威值,否则会挡住 +# "无注解赋值从右值推断类名"的正常路径(如 `p: t.CPtr = Point()` 之后 `p.x` 需要 +# Point)。形态三种(见本文件 L753 的同类判据):裸 'rawptr'、带模块前缀 +# 'sha1.rawptr'、下标式 'rawptr[X]';CPtr 一族的裸名/限定名同样计入。 +_PTR_MARKER_CLASS_NAMES: frozenset[str] = frozenset({ + 'rawptr', 't.rawptr', 'c.rawptr', + 'CPtr', 't.CPtr', 'c.CPtr', + 'CNeedPtr', 't.CNeedPtr', 'CAutoPtr', 't.CAutoPtr', +}) + + +def _IsPtrMarkerClassName(Name: str | None) -> bool: + """类名是否为指针/未知占位名(判据见 _PTR_MARKER_CLASS_NAMES)""" + if not Name: + return False + if Name in _PTR_MARKER_CLASS_NAMES: + return True + # 带模块前缀('sha1.rawptr')与下标式('rawptr[X]')两种形态 + if '.rawptr' in Name or Name.startswith('rawptr['): + return True + if '.CPtr' in Name or Name.startswith('CPtr['): + return True + return False + + class AnnAssignHandle(BaseHandle): def _StoreOrStrCopy(self, VarName: str, VarPtr: ir.Value, Value: ir.Value) -> None: Gen: LlvmCodeGenerator = self.Trans.LlvmGen @@ -465,7 +492,7 @@ class AnnAssignHandle(BaseHandle): # 注解 `rawptr[T]`/`X | t.CPtr` 折叠后的占位名,可能恰好在 Gen.structs 里) # 不表态具体类,若一并记为权威会挡住"无注解赋值从右值推断类名"的正常路径 # (如 `p: t.CPtr = Point()` 之后 `p.x` 需要 Point)。 - if _DeclCls and _DeclCls not in _PTR_MARKER_CLASS_NAMES: + if _DeclCls and not _IsPtrMarkerClassName(_DeclCls): _M: dict = getattr(Gen, 'var_annotated_class', None) if _M is None: _M = {}