Skip to content

Commit 35dccb5

Browse files
authored
Update to latest generator
Includes better QLDoc generation and better escaping in the generated files (the latter has changed the dbscheme, so rebuilding databases will be required).
1 parent c2ecad7 commit 35dccb5

6 files changed

Lines changed: 114 additions & 25 deletions

File tree

extractor/src/extractor.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,7 @@ impl Visitor<'_> {
560560
Storage::Table {
561561
name: table_name,
562562
has_index,
563+
column_name: _,
563564
} => {
564565
for (index, child_value) in child_values.iter().enumerate() {
565566
if !*has_index && index > 0 {

generator/src/main.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ fn make_field_type<'a>(
6666
fn add_field_for_table_storage<'a>(
6767
field: &'a node_types::Field,
6868
table_name: &'a str,
69+
column_name: &'a str,
6970
has_index: bool,
7071
nodes: &'a node_types::NodeTypeMap,
7172
) -> (dbscheme::Table<'a>, Option<dbscheme::Entry<'a>>) {
@@ -90,10 +91,7 @@ fn add_field_for_table_storage<'a>(
9091
let field_column = dbscheme::Column {
9192
unique: true,
9293
db_type: dbscheme::DbColumnType::Int,
93-
name: match &field.name {
94-
None => "child",
95-
Some(name) => name,
96-
},
94+
name: column_name,
9795
ql_type: field_ql_type,
9896
ql_type_is_ref: true,
9997
};
@@ -205,9 +203,18 @@ fn convert_nodes<'a>(nodes: &'a node_types::NodeTypeMap) -> Vec<dbscheme::Entry<
205203
}
206204
main_table.columns.push(field_column);
207205
}
208-
node_types::Storage::Table { name, has_index } => {
209-
let (field_table, field_type_entry) =
210-
add_field_for_table_storage(field, name, *has_index, nodes);
206+
node_types::Storage::Table {
207+
name,
208+
has_index,
209+
column_name,
210+
} => {
211+
let (field_table, field_type_entry) = add_field_for_table_storage(
212+
field,
213+
name,
214+
column_name,
215+
*has_index,
216+
nodes,
217+
);
211218
if let Some(field_type_entry) = field_type_entry {
212219
entries.push(field_type_entry);
213220
}

generator/src/ql_gen.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ fn create_field_getters<'a>(
398398
node_types::Storage::Table {
399399
name: field_table_name,
400400
has_index,
401+
column_name: _,
401402
} => (
402403
create_get_field_expr_for_table_storage(
403404
get_value_result_var_name,
@@ -450,12 +451,21 @@ fn create_field_getters<'a>(
450451
(get_value, Some(get_value_any_index))
451452
}
452453
};
454+
let qldoc = match &field.name {
455+
Some(name) => {
456+
format!("Gets the node corresponding to the field `{}`.", name)
457+
}
458+
None => {
459+
if formal_parameters.len() == 0 {
460+
"Gets the child of this node.".to_owned()
461+
} else {
462+
"Gets the `i`th child of this node.".to_owned()
463+
}
464+
}
465+
};
453466
(
454467
ql::Predicate {
455-
qldoc: field
456-
.name
457-
.as_ref()
458-
.map(|name| format!("Gets the node corresponding to the field `{}`.", name)),
468+
qldoc: Some(qldoc),
459469
name: &field.getter_name,
460470
overridden: false,
461471
return_type,

node-types/src/lib.rs

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,15 @@ fn name_for_field_or_child(name: &Option<String>) -> String {
7070
pub enum Storage {
7171
/// the field is stored as a column in the parent table
7272
Column { name: String },
73-
/// the field is stored in a link table, and may or may not have an
74-
/// associated index column
75-
Table { name: String, has_index: bool },
73+
/// the field is stored in a link table
74+
Table {
75+
/// the name of the table
76+
name: String,
77+
/// the name of the column for the field in the dbscheme
78+
column_name: String,
79+
/// does it have an associated index column?
80+
has_index: bool,
81+
},
7682
}
7783

7884
pub fn read_node_types(node_types_path: &Path) -> std::io::Result<NodeTypeMap> {
@@ -206,12 +212,11 @@ fn add_field(
206212
token_kinds: &Set<TypeName>,
207213
) {
208214
let parent_flattened_name = node_type_name(&parent_type_name.kind, parent_type_name.named);
215+
let column_name = escape_name(&name_for_field_or_child(&field_name));
209216
let storage = if !field_info.multiple && field_info.required {
210217
// This field must appear exactly once, so we add it as
211218
// a column to the main table for the node type.
212-
Storage::Column {
213-
name: escape_name(&name_for_field_or_child(&field_name)),
214-
}
219+
Storage::Column { name: column_name }
215220
} else {
216221
// Put the field in an auxiliary table.
217222
let has_index = field_info.multiple;
@@ -223,6 +228,7 @@ fn add_field(
223228
Storage::Table {
224229
has_index,
225230
name: field_table_name,
231+
column_name,
226232
}
227233
};
228234
let converted_types = convert_types(&field_info.types);

0 commit comments

Comments
 (0)