支持 tls 关键字,全面准备清退 t, c
This commit is contained in:
1 parent
2b4679073e
commit
8d27747c7c
1 file changed
+43
@@ -62,6 +62,12 @@ _VIRTUAL_EXAMPLE: str = (
|
||||
'novirtual class B: novirtual def helper(self) -> int: ...'
|
||||
)
|
||||
|
||||
# tls 修饰符(软关键字):`tls def f(...)` ⇒ 合成既有装饰器 `@t.TLS`
|
||||
#(一次性初始化守卫,见 HandlesFunctions 的 TLS 分支)。与 virtual/novirtual 同一套
|
||||
# "软关键字 + 合成既有装饰器"表示,不新增第二套语义;只在语句起始且后随 def 时生效,
|
||||
# 故 `tls: local = local()` / `tls.set(...)` 等把 tls 当标识符的写法逐字不变。
|
||||
_TLS_KEYWORD: str = 'tls'
|
||||
|
||||
# ======================================================================
|
||||
# struct 纯数据类型定义关键字(软关键字)
|
||||
# ======================================================================
|
||||
@@ -189,6 +195,9 @@ class Parser(ExprParserMixin):
|
||||
# 故 `virtual fn m()` 在此已是 `virtual def m()`;本层只认 class/def。
|
||||
if v in _VIRTUAL_MARKERS:
|
||||
return self._ParseVirtualModified()
|
||||
# tls 修饰符(软关键字):语句起始 + 紧跟 def 时生效,合成既有装饰器 @t.TLS。
|
||||
if v == _TLS_KEYWORD and self._IsTlsDefStart():
|
||||
return self._ParseTlsModified()
|
||||
# 软关键字函数定义:fn/fun/func/function + 标识符
|
||||
if v in SOFT_KEYWORDS and self._Peek(1).Type == NAME:
|
||||
return self._ParseFunctionDef()
|
||||
@@ -715,6 +724,9 @@ class Parser(ExprParserMixin):
|
||||
if tok.Type == NAME and tok.Value in _VIRTUAL_MARKERS:
|
||||
# `@deco` 与 `virtual class`/`virtual def` 组合:合成标记追加在既有装饰器之后
|
||||
return self._ParseVirtualModified(decorators=decorator_list)
|
||||
if tok.Type == NAME and tok.Value == _TLS_KEYWORD and self._IsTlsDefStart():
|
||||
# `@deco` 与 `tls def` 组合:合成 @t.TLS 追加在既有装饰器之后
|
||||
return self._ParseTlsModified(decorators=decorator_list)
|
||||
raise SyntaxError(f"decorator must be followed by def/class, got {tok.Value!r}")
|
||||
|
||||
# ==================================================================
|
||||
@@ -796,6 +808,37 @@ class Parser(ExprParserMixin):
|
||||
return self._ParseClassDef(decorators=deco_list)
|
||||
return self._ParseFunctionDef(decorators=deco_list)
|
||||
|
||||
# ==================================================================
|
||||
# tls 修饰符 + def
|
||||
# ==================================================================
|
||||
def _IsTlsDefStart(self) -> bool:
|
||||
"""下一个 token 是否为 `tls` 修饰符后的函数定义起点(def / 其别名 + '(' / '[')。"""
|
||||
nxt: Token = self._Peek(1)
|
||||
if nxt.Type != NAME:
|
||||
return False
|
||||
if nxt.Value == 'def':
|
||||
return True
|
||||
if nxt.Value in _DEF_ALIASES:
|
||||
nxt2: Token = self._Peek(2)
|
||||
return nxt2.Type == OP and nxt2.Value in ('(', '[')
|
||||
return False
|
||||
|
||||
def _ParseTlsModified(self, decorators: list[N.expr] | None = None) -> N.stmt:
|
||||
"""`tls def f(...)`:消费 tls,合成 `@t.TLS` 后交给 _ParseFunctionDef。
|
||||
|
||||
与手写 `@t.TLS` 逐字段同形(decorator_list 追加
|
||||
Attribute(Name('t', Load), 'TLS', Load)),故下游一次性初始化的守卫生成路径
|
||||
(HandlesFunctions 的 TLS 分支)零新增判据。tls 对方法与模块级函数同样生效。
|
||||
"""
|
||||
mod: Token = self._Peek() # tls
|
||||
self._Next() # 消费修饰符
|
||||
deco: N.expr = N.Attribute(value=N.Name(id='t', ctx=N.Load()),
|
||||
attr='TLS', ctx=N.Load())
|
||||
self._FixLoc(deco, mod)
|
||||
deco_list: list[N.expr] = list(decorators or [])
|
||||
deco_list.append(deco)
|
||||
return self._ParseFunctionDef(decorators=deco_list)
|
||||
|
||||
# ==================================================================
|
||||
# struct 纯数据类型定义(软关键字:`struct X:` / `struct X(Base):`)
|
||||
# ==================================================================
|
||||
|
||||
Reference in new issue
Block a user