fix(tpc): Mod.Var 链属性访问补第四条类回退(直读 var_/global_struct_class)

This commit is contained in:
TermiNexus committed 2026-09-12 12:42:59 +08:00
1 parent 015fbf17cf
commit ed3355202a
1 file changed
+28
+28
View File
@@ -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