From ed3355202a150824eafb45e3908638d6e5485ad2 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 12 Sep 2026 12:42:59 +0800 Subject: [PATCH] =?UTF-8?q?fix(tpc):=20Mod.Var=20=E9=93=BE=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E8=AE=BF=E9=97=AE=E8=A1=A5=E7=AC=AC=E5=9B=9B=E6=9D=A1?= =?UTF-8?q?=E7=B1=BB=E5=9B=9E=E9=80=80=EF=BC=88=E7=9B=B4=E8=AF=BB=20var=5F?= =?UTF-8?q?/global=5Fstruct=5Fclass=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/Handles/HandlesExprAttr.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/core/Handles/HandlesExprAttr.py b/lib/core/Handles/HandlesExprAttr.py index 0e1f566..c823726 100644 --- a/lib/core/Handles/HandlesExprAttr.py +++ b/lib/core/Handles/HandlesExprAttr.py @@ -805,6 +805,34 @@ class ExprAttrHandle(BaseHandle): AttrClassName = self._get_attr_class(Node.value, Gen) if not AttrClassName: AttrClassName = self._resolve_attr_parent_hint(Node.value, Gen) + if not AttrClassName: + # 【模块别名 + 模块级变量】`Mod.Var` 形态(如 CompilerFactory.factory): + # 上面三个解析器都按「字段所属类」思路找,对「模块别名.变量」返回 None + # ([CHAIN-DBG] char* key-miss: attr_class=None,StructGenMixin.vp:139 与 + # ClassGenVTable.vp:99 根因)。而该变量的类已由 HandlesImports 的 + # _EmitExternalGlobalDeclLlvm / HandlesAnnAssign 登记在 + # var_struct_class / global_struct_class(键为**裸变量名**)⇒ 直读。 + _mva: ast.AST | None = Node.value + if isinstance(_mva, ast.Attribute) and isinstance(_mva.value, ast.Name): + _mname: str = _mva.value.id + _sha1_map2 = getattr(Gen, 'ModuleSha1Map', {}) or {} + _imported2 = getattr(self.Trans, '_ImportedModules', None) or [] + _aliases2 = getattr(self.Trans.SymbolTable, 'import_aliases', {}) or {} + try: + _rmod: str = self.Trans.SymbolTable.resolve_alias(_mname) + except Exception: + _rmod = _mname + _is_mod2: bool = (_mname in _sha1_map2 or _rmod in _sha1_map2 + or _mname in _imported2 or _rmod in _imported2 + or _mname in _aliases2 or _rmod in _aliases2) + if not _is_mod2: + for _k2 in _sha1_map2: + if _k2 == _mname or _k2.endswith(f'.{_mname}'): + _is_mod2 = True + break + if _is_mod2: + AttrClassName = (getattr(Gen, 'var_struct_class', {}).get(_mva.attr) + or getattr(Gen, 'global_struct_class', {}).get(_mva.attr)) ResolvedKey: str | None = self._find_struct_key_for_class_hint(Gen, AttrClassName) if ResolvedKey is None or ResolvedKey not in Gen.structs: import sys as _sys2