实现了切片存储
This commit is contained in:
@@ -127,6 +127,23 @@ def _PyiTypeStr(buf: bytes, buf_size: t.CSizeT, pos: t.CSizeT,
|
||||
ti += 1
|
||||
return pos
|
||||
|
||||
# Call: 函数调用表达式 (用于装饰器如 @t.NoVTable())
|
||||
if k == ast.ASTKind.Call:
|
||||
cl: ast.Call | t.CPtr = (ast.Call | t.CPtr)(annot)
|
||||
pos = _PyiTypeStr(buf, buf_size, pos, cl.func)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "(")
|
||||
if cl.args is not None:
|
||||
can: t.CSizeT = cl.args.__len__()
|
||||
cai: t.CSizeT = 0
|
||||
while cai < can:
|
||||
if cai > 0:
|
||||
pos = _PyiEmit(buf, buf_size, pos, ", ")
|
||||
ca: ast.AST | t.CPtr = cl.args.get(cai)
|
||||
pos = _PyiTypeStr(buf, buf_size, pos, ca)
|
||||
cai += 1
|
||||
pos = _PyiEmit(buf, buf_size, pos, ")")
|
||||
return pos
|
||||
|
||||
# 未知类型,回退到 t.CInt
|
||||
return _PyiEmit(buf, buf_size, pos, "t.CInt")
|
||||
|
||||
@@ -140,6 +157,19 @@ def _PyiFunction(buf: bytes, buf_size: t.CSizeT, pos: t.CSizeT,
|
||||
fn: ast.FunctionDef | t.CPtr,
|
||||
indent_level: int, class_name: str) -> t.CSizeT:
|
||||
"""生成函数签名到 buf,返回新的 pos"""
|
||||
# 装饰器
|
||||
if fn.decorator_list is not None:
|
||||
dn: t.CSizeT = fn.decorator_list.__len__()
|
||||
di: t.CSizeT = 0
|
||||
while di < dn:
|
||||
dec: ast.AST | t.CPtr = fn.decorator_list.get(di)
|
||||
if dec is not None:
|
||||
pos = _PyiIndent(buf, buf_size, pos, indent_level)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "@")
|
||||
pos = _PyiTypeStr(buf, buf_size, pos, dec)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "\n")
|
||||
di += 1
|
||||
|
||||
pos = _PyiIndent(buf, buf_size, pos, indent_level)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "def ")
|
||||
if fn.name is not None:
|
||||
@@ -210,11 +240,39 @@ def _PyiFunction(buf: bytes, buf_size: t.CSizeT, pos: t.CSizeT,
|
||||
def _PyiClass(buf: bytes, buf_size: t.CSizeT, pos: t.CSizeT,
|
||||
cls: ast.ClassDef | t.CPtr, indent_level: int) -> t.CSizeT:
|
||||
"""生成类定义到 buf,返回新的 pos"""
|
||||
# 装饰器
|
||||
if cls.decorator_list is not None:
|
||||
dcn: t.CSizeT = cls.decorator_list.__len__()
|
||||
dci: t.CSizeT = 0
|
||||
while dci < dcn:
|
||||
ddec: ast.AST | t.CPtr = cls.decorator_list.get(dci)
|
||||
if ddec is not None:
|
||||
pos = _PyiIndent(buf, buf_size, pos, indent_level)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "@")
|
||||
pos = _PyiTypeStr(buf, buf_size, pos, ddec)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "\n")
|
||||
dci += 1
|
||||
|
||||
pos = _PyiIndent(buf, buf_size, pos, indent_level)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "class ")
|
||||
if cls.name is not None:
|
||||
pos = _PyiEmit(buf, buf_size, pos, cls.name)
|
||||
|
||||
# PEP 695 类型参数 (class Foo[T]:)
|
||||
if cls.type_params is not None:
|
||||
tpn: t.CSizeT = cls.type_params.__len__()
|
||||
if tpn > 0:
|
||||
pos = _PyiEmit(buf, buf_size, pos, "[")
|
||||
tpi: t.CSizeT = 0
|
||||
while tpi < tpn:
|
||||
if tpi > 0:
|
||||
pos = _PyiEmit(buf, buf_size, pos, ", ")
|
||||
tpname: str = cls.type_params.get(tpi)
|
||||
if tpname is not None:
|
||||
pos = _PyiEmit(buf, buf_size, pos, tpname)
|
||||
tpi += 1
|
||||
pos = _PyiEmit(buf, buf_size, pos, "]")
|
||||
|
||||
# 基类
|
||||
if cls.bases is not None:
|
||||
bn: t.CSizeT = cls.bases.__len__()
|
||||
@@ -245,6 +303,29 @@ def _PyiClass(buf: bytes, buf_size: t.CSizeT, pos: t.CSizeT,
|
||||
# 方法
|
||||
if sk == ast.ASTKind.FunctionDef:
|
||||
mfn: ast.FunctionDef | t.CPtr = (ast.FunctionDef | t.CPtr)(stmt)
|
||||
# __init__ 方法:先提取 self.x: Type 属性
|
||||
if mfn.name is not None and string.strcmp(mfn.name, "__init__") == 0:
|
||||
if mfn.children is not None:
|
||||
icn: t.CSizeT = mfn.children.__len__()
|
||||
ici: t.CSizeT = 0
|
||||
while ici < icn:
|
||||
ibody: ast.AST | t.CPtr = mfn.children.get(ici)
|
||||
if ibody is not None and ibody.kind() == ast.ASTKind.AnnAssign:
|
||||
iaa: ast.AnnAssign | t.CPtr = (ast.AnnAssign | t.CPtr)(ibody)
|
||||
if iaa.target is not None and iaa.target.kind() == ast.ASTKind.Attribute:
|
||||
iat: ast.Attribute | t.CPtr = (ast.Attribute | t.CPtr)(iaa.target)
|
||||
# 检查 target.value 是否为 Name("self")
|
||||
if iat.value is not None and iat.value.kind() == ast.ASTKind.Name:
|
||||
iavn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(iat.value)
|
||||
if iavn.id is not None and string.strcmp(iavn.id, "self") == 0:
|
||||
pos = _PyiIndent(buf, buf_size, pos, indent_level + 1)
|
||||
if iat.attr is not None:
|
||||
pos = _PyiEmit(buf, buf_size, pos, iat.attr)
|
||||
pos = _PyiEmit(buf, buf_size, pos, ": ")
|
||||
pos = _PyiTypeStr(buf, buf_size, pos, iaa.annotation)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "\n")
|
||||
has_member = 1
|
||||
ici += 1
|
||||
pos = _PyiFunction(buf, buf_size, pos, mfn, indent_level + 1, cls.name)
|
||||
has_member = 1
|
||||
|
||||
@@ -260,6 +341,12 @@ def _PyiClass(buf: bytes, buf_size: t.CSizeT, pos: t.CSizeT,
|
||||
pos = _PyiTypeStr(buf, buf_size, pos, aa.annotation)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "\n")
|
||||
has_member = 1
|
||||
|
||||
# 嵌套类
|
||||
elif sk == ast.ASTKind.ClassDef:
|
||||
ncls: ast.ClassDef | t.CPtr = (ast.ClassDef | t.CPtr)(stmt)
|
||||
pos = _PyiClass(buf, buf_size, pos, ncls, indent_level + 1)
|
||||
has_member = 1
|
||||
ci += 1
|
||||
|
||||
# 空类补 pass
|
||||
@@ -411,6 +498,45 @@ def _GeneratePyiFromAst(mb: memhub.MemBuddy | t.CPtr, tree: ast.AST | t.CPtr,
|
||||
pos = _PyiTypeStr(buf, buf_size, pos, aa.annotation)
|
||||
pos = _PyiEmit(buf, buf_size, pos, "\n")
|
||||
|
||||
# 全局赋值(无注解)— 从 Constant value 推断类型
|
||||
elif k == ast.ASTKind.Assign:
|
||||
asg: ast.Assign | t.CPtr = (ast.Assign | t.CPtr)(stmt)
|
||||
if asg.targets is not None and asg.value is not None:
|
||||
atn: t.CSizeT = asg.targets.__len__()
|
||||
if atn == 1:
|
||||
atg: ast.AST | t.CPtr = asg.targets.get(0)
|
||||
if atg is not None and atg.kind() == ast.ASTKind.Name:
|
||||
agn: ast.Name | t.CPtr = (ast.Name | t.CPtr)(atg)
|
||||
aval: ast.AST | t.CPtr = asg.value
|
||||
avk: int = aval.kind()
|
||||
inferred: int = 0
|
||||
if avk == ast.ASTKind.Constant:
|
||||
acv: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(aval)
|
||||
if acv.const_kind == ast.CONST_INT:
|
||||
inferred = 1
|
||||
elif acv.const_kind == ast.CONST_FLOAT:
|
||||
inferred = 2
|
||||
elif acv.const_kind == ast.CONST_STR:
|
||||
inferred = 3
|
||||
elif acv.const_kind == ast.CONST_BOOL:
|
||||
inferred = 4
|
||||
elif acv.const_kind == ast.CONST_NONE:
|
||||
inferred = 5
|
||||
if inferred > 0 and agn.id is not None:
|
||||
pos = _PyiEmit(buf, buf_size, pos, agn.id)
|
||||
pos = _PyiEmit(buf, buf_size, pos, ": ")
|
||||
if inferred == 1:
|
||||
pos = _PyiEmit(buf, buf_size, pos, "t.CInt")
|
||||
elif inferred == 2:
|
||||
pos = _PyiEmit(buf, buf_size, pos, "t.CDouble")
|
||||
elif inferred == 3:
|
||||
pos = _PyiEmit(buf, buf_size, pos, "str")
|
||||
elif inferred == 4:
|
||||
pos = _PyiEmit(buf, buf_size, pos, "bool")
|
||||
elif inferred == 5:
|
||||
pos = _PyiEmit(buf, buf_size, pos, "None")
|
||||
pos = _PyiEmit(buf, buf_size, pos, "\n")
|
||||
|
||||
i += 1
|
||||
|
||||
# NUL 终止
|
||||
|
||||
Reference in New Issue
Block a user