From a7d8589af62f125d5ac440a771c9cb4dbf014b01 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 30 Sep 2026 19:10:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(HandlesAnnAssign):=20=E8=A1=A5=E4=B8=8A?= =?UTF-8?q?=E6=8C=87=E9=92=88=E5=8D=A0=E4=BD=8D=E7=B1=BB=E5=90=8D=E5=88=A4?= =?UTF-8?q?=E6=8D=AE=E7=9A=84=E5=AE=9A=E4=B9=89=EF=BC=8C=E4=BF=AE=20=5FPTR?= =?UTF-8?q?=5FMARKER=5FCLASS=5FNAMES=20=E6=9C=AA=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 「注解声明类台账」只引用未定义 _PTR_MARKER_CLASS_NAMES,_DeclCls 为真时即 NameError(翻译 lib/Projectrans/Utils.vp 触发)。定义为 frozenset 常量并改用 _IsPtrMarkerClassName,覆盖裸名 / sha1.rawptr 前缀 / rawptr[X] 下标三种占位形态。 --- lib/core/Handles/HandlesAnnAssign.py | 29 +++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) 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 = {}