Some simple information syncing

This commit is contained in:
2026-07-28 21:08:58 +08:00
parent 1837339f69
commit 3633be1995
65 changed files with 1132 additions and 368581 deletions

View File

@@ -477,16 +477,34 @@ class PythonToStubConverter:
lines.append(f'{IndentStr}@{DecoratorStr}')
# 构建参数列表
# 治本修复:原实现只遍历 node.args.args完全忽略 node.args.defaults
# 导致带默认值的参数(如 category: str = "")在 .pyi 中丢失默认值。
# 下游 DeclarationGenerator 据此生成 stub.ll 时,会因缺少默认参数而
# 生成参数数量不足的 declare进而造成调用方 ABI 不匹配崩溃。
# 修复:按 Python AST 语义defaults 从右向左对应 args 末尾的参数,
# 对有默认值的参数附加 '= <default_value>'。
params: list[str] = []
NumDefaults: int = len(node.args.defaults) if node.args.defaults else 0
DefaultsStart: int = len(node.args.args) - NumDefaults
for arg_idx, arg in enumerate(node.args.args):
ArgName: str = arg.arg
if arg.annotation:
TypeStr: str = PythonToStubConverter._GetTypeString(arg.annotation)
params.append(f'{ArgName}: {TypeStr}')
ParamPart: str = f'{ArgName}: {TypeStr}'
elif class_name and arg_idx == 0 and ArgName == 'self':
params.append(f'self: {class_name}')
ParamPart = f'self: {class_name}'
else:
params.append(ArgName)
ParamPart = ArgName
# 附加默认值defaults[i] 对应 args[DefaultsStart + i]
if NumDefaults > 0 and arg_idx >= DefaultsStart:
DefaultIdx: int = arg_idx - DefaultsStart
try:
DefaultStr: str = ast.unparse(node.args.defaults[DefaultIdx])
ParamPart = f'{ParamPart} = {DefaultStr}'
except Exception:
# unparse 失败时保留无默认值形式,避免阻塞生成
pass
params.append(ParamPart)
# 处理 *args
if node.args.vararg: