diff --git a/lib/core/Handles/HandlesExprUtils.py b/lib/core/Handles/HandlesExprUtils.py index 5bcd5d3..2be7a99 100644 --- a/lib/core/Handles/HandlesExprUtils.py +++ b/lib/core/Handles/HandlesExprUtils.py @@ -178,11 +178,26 @@ class ExprUtils: if not Gen._has_function(FullMethodName): FullMethodName = f'{ClassName}.{op_name}__' if not Gen._has_function(FullMethodName) and '[' in ClassName: - # 泛型特化方法尚未生成时,回退到裸模板类的方法(如 list.__len__) - _BareClass: str = ClassName.split('[', 1)[0] - FullMethodName = f'{_BareClass}.{op_name}' + # 泛型特化方法尚未生成时,先补发特化,再回退裸模板类(如 list.__len__) + try: + self.Trans.ExprCallHandle._try_complete_generic_specialization(ClassName, op_name, Gen) + except Exception: + pass + FullMethodName = f'{ClassName}.{op_name}' if not Gen._has_function(FullMethodName): - FullMethodName = f'{_BareClass}.{op_name}__' + FullMethodName = f'{ClassName}.{op_name}__' + if not Gen._has_function(FullMethodName): + _SpecTy: Any = Gen.structs.get(ClassName) + _SpecName: str = getattr(_SpecTy, 'name', '') if _SpecTy is not None else '' + if _SpecName: + FullMethodName = f'{_SpecName}.{op_name}' + if not Gen._has_function(FullMethodName): + FullMethodName = f'{_SpecName}.{op_name}__' + if not Gen._has_function(FullMethodName): + _BareClass: str = ClassName.split('[', 1)[0] + FullMethodName = f'{_BareClass}.{op_name}' + if not Gen._has_function(FullMethodName): + FullMethodName = f'{_BareClass}.{op_name}__' if not Gen._has_function(FullMethodName): # 多继承:沿 MRO 祖先链查找 dunder 方法(先声明父类优先,与 VPC 一致) for anc in Gen._get_mro_chain(ClassName)[1:]: