Skip to content

Commit db00cb6

Browse files
author
Paolo Tranquilli
committed
Codegen: move class synth decorators to pragmas
1 parent 9d6ee09 commit db00cb6

File tree

7 files changed

+40
-35
lines changed

7 files changed

+40
-35
lines changed

misc/codegen/lib/schema.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,6 @@ class Class:
9393
properties: List[Property] = field(default_factory=list)
9494
group: str = ""
9595
pragmas: List[str] | Dict[str, object] = field(default_factory=dict)
96-
synth: Optional[Union[SynthInfo, bool]] = None
97-
"""^^^ filled with `True` for non-final classes with only synthesized final descendants """
9896
doc: List[str] = field(default_factory=list)
9997
hideable: bool = False
10098
test_with: Optional[str] = None
@@ -114,13 +112,21 @@ def check_types(self, known: typing.Iterable[str]):
114112
_check_type(d, known)
115113
for p in self.properties:
116114
_check_type(p.type, known)
117-
if self.synth is not None:
118-
_check_type(self.synth.from_class, known)
119-
if self.synth.on_arguments is not None:
120-
for t in self.synth.on_arguments.values():
115+
if "synth" in self.pragmas:
116+
synth = self.pragmas["synth"]
117+
_check_type(synth.from_class, known)
118+
if synth.on_arguments is not None:
119+
for t in synth.on_arguments.values():
121120
_check_type(t, known)
122121
_check_type(self.test_with, known)
123122

123+
@property
124+
def synth(self) -> SynthInfo | bool | None:
125+
return self.pragmas.get("synth")
126+
127+
def mark_synth(self):
128+
self.pragmas.setdefault("synth", True)
129+
124130

125131
@dataclass
126132
class Schema:

misc/codegen/lib/schemadefs.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,9 @@ class _Namespace:
6767
""" simple namespacing mechanism """
6868
name: str
6969

70-
def add(self, pragma: "_PragmaBase"):
70+
def add(self, pragma: "_PragmaBase", key: str | None = None):
7171
self.__dict__[pragma.pragma] = pragma
72-
pragma.pragma = f"{self.name}_{pragma.pragma}"
72+
pragma.pragma = key or f"{self.name}_{pragma.pragma}"
7373

7474

7575
@_dataclass
@@ -142,7 +142,7 @@ class _ParametrizedClassPragma(_PragmaBase):
142142
"""
143143
_pragma_class: _ClassVar[type] = _ClassPragma
144144

145-
function: _Callable[[...], object] = None
145+
function: _Callable[..., object] = None
146146

147147
def __post_init__(self):
148148
self.__signature__ = _inspect.signature(self.function).replace(return_annotation=self._pragma_class)
@@ -248,10 +248,10 @@ def group(name: str = "") -> _ClassDecorator:
248248
return _annotate(group=name)
249249

250250

251-
synth.from_class = lambda ref: _annotate(synth=_schema.SynthInfo(
252-
from_class=_schema.get_type_name(ref)))
253-
synth.on_arguments = lambda **kwargs: _annotate(
254-
synth=_schema.SynthInfo(on_arguments={k: _schema.get_type_name(t) for k, t in kwargs.items()}))
251+
synth.add(_ParametrizedClassPragma("from_class", lambda ref: _schema.SynthInfo(
252+
from_class=_schema.get_type_name(ref))), key="synth")
253+
synth.add(_ParametrizedClassPragma("on_arguments", lambda **kwargs:
254+
_schema.SynthInfo(on_arguments={k: _schema.get_type_name(t) for k, t in kwargs.items()})), key="synth")
255255

256256

257257
class _PropertyModifierList(_schema.PropertyModifier):

misc/codegen/loaders/schemaloader.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ def _get_class(cls: type) -> schema.Class:
5050
test_with=_get_name(getattr(cls, "_test_with", None)),
5151
# in the following we don't use `getattr` to avoid inheriting
5252
pragmas=cls.__dict__.get("_pragmas", {}),
53-
synth=cls.__dict__.get("_synth", None),
5453
properties=[
5554
a | _PropertyNamer(n)
5655
for n, a in cls.__dict__.get("__annotations__", {}).items()
@@ -100,8 +99,8 @@ def fill_is_synth(name: str):
10099
fill_is_synth(root)
101100

102101
for name, cls in classes.items():
103-
if cls.synth is None and is_synth[name]:
104-
cls.synth = True
102+
if is_synth[name]:
103+
cls.mark_synth()
105104

106105

107106
def _fill_hideable_information(classes: typing.Dict[str, schema.Class]):

misc/codegen/test/test_cppgen.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,15 +185,15 @@ def test_synth_classes_ignored(generate):
185185
assert generate([
186186
schema.Class(
187187
name="W",
188-
synth=schema.SynthInfo(),
188+
pragmas={"synth": schema.SynthInfo()},
189189
),
190190
schema.Class(
191191
name="X",
192-
synth=schema.SynthInfo(from_class="A"),
192+
pragmas={"synth": schema.SynthInfo(from_class="A")},
193193
),
194194
schema.Class(
195195
name="Y",
196-
synth=schema.SynthInfo(on_arguments={"a": "A", "b": "int"}),
196+
pragmas={"synth": schema.SynthInfo(on_arguments={"a": "A", "b": "int"})},
197197
),
198198
schema.Class(
199199
name="Z",

misc/codegen/test/test_dbschemegen.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -536,9 +536,9 @@ def test_null_class(generate):
536536

537537
def test_synth_classes_ignored(generate):
538538
assert generate([
539-
schema.Class(name="A", synth=schema.SynthInfo()),
540-
schema.Class(name="B", synth=schema.SynthInfo(from_class="A")),
541-
schema.Class(name="C", synth=schema.SynthInfo(on_arguments={"x": "A"})),
539+
schema.Class(name="A", pragmas={"synth": schema.SynthInfo()}),
540+
schema.Class(name="B", pragmas={"synth": schema.SynthInfo(from_class="A")}),
541+
schema.Class(name="C", pragmas={"synth": schema.SynthInfo(on_arguments={"x": "A"})}),
542542
]) == dbscheme.Scheme(
543543
src=schema_file.name,
544544
includes=[],
@@ -549,7 +549,7 @@ def test_synth_classes_ignored(generate):
549549
def test_synth_derived_classes_ignored(generate):
550550
assert generate([
551551
schema.Class(name="A", derived={"B", "C"}),
552-
schema.Class(name="B", bases=["A"], synth=schema.SynthInfo()),
552+
schema.Class(name="B", bases=["A"], pragmas={"synth": schema.SynthInfo()}),
553553
schema.Class(name="C", bases=["A"]),
554554
]) == dbscheme.Scheme(
555555
src=schema_file.name,

misc/codegen/test/test_qlgen.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -937,7 +937,7 @@ def test_property_on_class_with_default_doc_name(generate_classes):
937937

938938
def test_stub_on_class_with_synth_from_class(generate_classes):
939939
assert generate_classes([
940-
schema.Class("MyObject", synth=schema.SynthInfo(from_class="A"),
940+
schema.Class("MyObject", pragmas={"synth": schema.SynthInfo(from_class="A")},
941941
properties=[schema.SingleProperty("foo", "bar")]),
942942
]) == {
943943
"MyObject.qll": (a_ql_class_public(name="MyObject"), a_ql_stub(name="MyObject", synth_accessors=[
@@ -952,7 +952,7 @@ def test_stub_on_class_with_synth_from_class(generate_classes):
952952

953953
def test_stub_on_class_with_synth_on_arguments(generate_classes):
954954
assert generate_classes([
955-
schema.Class("MyObject", synth=schema.SynthInfo(on_arguments={"base": "A", "index": "int", "label": "string"}),
955+
schema.Class("MyObject", pragmas={"synth": schema.SynthInfo(on_arguments={"base": "A", "index": "int", "label": "string"})},
956956
properties=[schema.SingleProperty("foo", "bar")]),
957957
]) == {
958958
"MyObject.qll": (a_ql_class_public(name="MyObject"), a_ql_stub(name="MyObject", synth_accessors=[

misc/codegen/test/test_schemaloader.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,8 @@ class B(A):
355355
pass
356356

357357
assert data.classes == {
358-
'A': schema.Class('A', derived={'B'}, synth=True),
359-
'B': schema.Class('B', bases=['A'], synth=schema.SynthInfo(from_class="A")),
358+
'A': schema.Class('A', derived={'B'}, pragmas={"synth": True}),
359+
'B': schema.Class('B', bases=['A'], pragmas={"synth": schema.SynthInfo(from_class="A")}),
360360
}
361361

362362

@@ -371,7 +371,7 @@ class B(A):
371371
pass
372372

373373
assert data.classes == {
374-
'A': schema.Class('A', derived={'B'}, synth=schema.SynthInfo(from_class="B")),
374+
'A': schema.Class('A', derived={'B'}, pragmas={"synth": schema.SynthInfo(from_class="B")}),
375375
'B': schema.Class('B', bases=['A']),
376376
}
377377

@@ -396,8 +396,8 @@ class B(A):
396396
pass
397397

398398
assert data.classes == {
399-
'A': schema.Class('A', derived={'B'}, synth=True),
400-
'B': schema.Class('B', bases=['A'], synth=schema.SynthInfo(on_arguments={'a': 'A', 'i': 'int'})),
399+
'A': schema.Class('A', derived={'B'}, pragmas={"synth": True}),
400+
'B': schema.Class('B', bases=['A'], pragmas={"synth": schema.SynthInfo(on_arguments={'a': 'A', 'i': 'int'})}),
401401
}
402402

403403

@@ -415,7 +415,7 @@ class B(A):
415415
pass
416416

417417
assert data.classes == {
418-
'A': schema.Class('A', derived={'B'}, synth=schema.SynthInfo(on_arguments={'b': 'B', 'i': 'int'})),
418+
'A': schema.Class('A', derived={'B'}, pragmas={"synth": schema.SynthInfo(on_arguments={'b': 'B', 'i': 'int'})}),
419419
'B': schema.Class('B', bases=['A']),
420420
}
421421

@@ -454,10 +454,10 @@ class C(Root):
454454

455455
assert data.classes == {
456456
'Root': schema.Class('Root', derived={'Base', 'C'}),
457-
'Base': schema.Class('Base', bases=['Root'], derived={'Intermediate', 'B'}, synth=True),
458-
'Intermediate': schema.Class('Intermediate', bases=['Base'], derived={'A'}, synth=True),
459-
'A': schema.Class('A', bases=['Intermediate'], synth=schema.SynthInfo(on_arguments={'a': 'Base', 'i': 'int'})),
460-
'B': schema.Class('B', bases=['Base'], synth=schema.SynthInfo(from_class='Base')),
457+
'Base': schema.Class('Base', bases=['Root'], derived={'Intermediate', 'B'}, pragmas={"synth": True}),
458+
'Intermediate': schema.Class('Intermediate', bases=['Base'], derived={'A'}, pragmas={"synth": True}),
459+
'A': schema.Class('A', bases=['Intermediate'], pragmas={"synth": schema.SynthInfo(on_arguments={'a': 'Base', 'i': 'int'})}),
460+
'B': schema.Class('B', bases=['Base'], pragmas={"synth": schema.SynthInfo(from_class='Base')}),
461461
'C': schema.Class('C', bases=['Root']),
462462
}
463463

0 commit comments

Comments
 (0)