Rust: Add Callable as a base class of Function and ClosureExpr

This commit is contained in:
Tom Hvitved
2024-10-11 12:00:30 +02:00
parent 854d7660eb
commit b284a2a7c0
2 changed files with 22 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
from typing import (
Callable as _Callable,
Dict as _Dict,
List as _List,
ClassVar as _ClassVar,
)
from misc.codegen.lib import schema as _schema
@@ -278,7 +279,7 @@ _ = _PropertyAnnotation()
drop = object()
def annotate(annotated_cls: type, replace_bases: _Dict[type, type] | None = None) -> _Callable[[type], _PropertyAnnotation]:
def annotate(annotated_cls: type, add_bases: _List[type] | None = None, replace_bases: _Dict[type, type] | None = None) -> _Callable[[type], _PropertyAnnotation]:
"""
Add or modify schema annotations after a class has been defined previously.
@@ -295,6 +296,8 @@ def annotate(annotated_cls: type, replace_bases: _Dict[type, type] | None = None
_ClassPragma(p, value=v)(annotated_cls)
if replace_bases:
annotated_cls.__bases__ = tuple(replace_bases.get(b, b) for b in annotated_cls.__bases__)
if add_bases:
annotated_cls.__bases__ = tuple(annotated_cls.__bases__) + tuple(add_bases)
for a in dir(cls):
if a.startswith(_schema.inheritable_pragma_prefix):
setattr(annotated_cls, a, getattr(cls, a))

View File

@@ -1520,3 +1520,21 @@ class _:
todo!()
```
"""
class Callable(AstNode):
"""
A callable. Either a `Function` or a `ClosureExpr`.
"""
param_list: optional["ParamList"] | child
attrs: list["Attr"] | child
@annotate(Function, add_bases=[Callable])
class _:
param_list: drop
attrs: drop
@annotate(ClosureExpr, add_bases=[Callable])
class _:
param_list: drop
attrs: drop