fix(tpc): Mod.Var 链属性访问补第四条类回退(直读 var_/global_struct_class)
This commit is contained in:
1 parent
015fbf17cf
commit
ed3355202a
1 file changed
+28
@@ -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
|
||||
|
||||
Reference in new issue
Block a user