支持 tls 关键字,全面准备清退 t, c

This commit is contained in:
TermiNexus committed 2026-10-17 23:39:41 +08:00
1 parent 2b4679073e
commit 8d27747c7c
1 file changed
+43
+43
View File
@@ -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):`)
# ==================================================================