Skip to content

Commit f1233b1

Browse files
author
Paolo Tranquilli
committed
Rust: fix generated hierarchy
1 parent 8f93f5e commit f1233b1

File tree

7 files changed

+304
-252
lines changed

7 files changed

+304
-252
lines changed

misc/codegen/generators/rustgen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def _get_class(self, name: str) -> rust.Class:
8080
if "rust_skip" not in p.pragmas and not p.synth
8181
] if not cls.derived else [],
8282
ancestors=sorted(set(a.name for a in _get_ancestors(cls, self._classmap))),
83-
table_name=inflection.tableize(cls.name),
83+
entry_table=inflection.tableize(cls.name) if not cls.derived else None,
8484
)
8585

8686
def get_classes(self):

misc/codegen/lib/rust.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,19 @@ def is_label(self):
110110
@dataclasses.dataclass
111111
class Class:
112112
name: str
113-
table_name: str | None = None
113+
entry_table: str | None = None
114114
fields: list[Field] = dataclasses.field(default_factory=list)
115115
ancestors: list[str] = dataclasses.field(default_factory=list)
116116

117117
@property
118-
def single_field_entries(self):
119-
ret = {self.table_name: []}
118+
def is_entry(self) -> bool:
119+
return bool(self.entry_table)
120+
121+
@property
122+
def single_field_entries(self) -> dict[str, list[dict]]:
123+
ret = {}
124+
if self.is_entry:
125+
ret[self.entry_table] = []
120126
for f in self.fields:
121127
if f.is_single:
122128
ret.setdefault(f.table_name, []).append(f)

misc/codegen/templates/rust_classes.mustache

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
use crate::trap;
66
{{#classes}}
77

8-
{{#table_name}}
8+
{{#is_entry}}
99
#[derive(Debug)]
1010
pub struct {{name}} {
1111
pub id: trap::TrapId<{{name}}>,
@@ -15,15 +15,13 @@ pub struct {{name}} {
1515
}
1616

1717
impl trap::TrapEntry for {{name}} {
18-
fn class_name() -> &'static str { "{{name}}" }
19-
2018
fn extract_id(&mut self) -> trap::TrapId<Self> {
2119
std::mem::replace(&mut self.id, trap::TrapId::Star)
2220
}
2321

2422
fn emit(self, id: trap::Label<Self>, out: &mut trap::Writer) {
2523
{{#single_field_entries}}
26-
out.add_tuple("{{table_name}}", vec![id.into(){{#fields}}, self.{{field_name}}.into(){{/fields}}]);
24+
out.add_tuple("{{entry_table}}", vec![id.into(){{#fields}}, self.{{field_name}}.into(){{/fields}}]);
2725
{{/single_field_entries}}
2826
{{#fields}}
2927
{{#is_predicate}}
@@ -53,13 +51,18 @@ impl trap::TrapEntry for {{name}} {
5351
{{/fields}}
5452
}
5553
}
56-
{{/table_name}}
57-
{{^table_name}}
54+
{{/is_entry}}
55+
{{^is_entry}}
5856
{{! virtual class, make it unbuildable }}
57+
#[derive(Debug)]
5958
pub struct {{name}} {
60-
unused: ()
59+
_unused: ()
60+
}
61+
{{/is_entry}}
62+
63+
impl trap::TrapClass for {{name}} {
64+
fn class_name() -> &'static str { "{{name}}" }
6165
}
62-
{{/table_name}}
6366
{{#ancestors}}
6467
6568
impl From<trap::Label<{{name}}>> for trap::Label<{{.}}> {

rust/extractor/src/generated/.generated.list

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)