Skip to content

Commit 388d361

Browse files
committed
Ruby: put AST node locations in a single table
1 parent 55e69d4 commit 388d361

File tree

6 files changed

+341
-822
lines changed

6 files changed

+341
-822
lines changed

ruby/extractor/src/extractor.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,11 +402,12 @@ impl Visitor<'_> {
402402
match &table.kind {
403403
EntryKind::Token { kind_id, .. } => {
404404
self.trap_writer.add_tuple(
405-
&format!("{}_ast_node_parent", self.language_prefix),
405+
&format!("{}_ast_node_info", self.language_prefix),
406406
vec![
407407
Arg::Label(id),
408408
Arg::Label(parent_id),
409409
Arg::Int(parent_index),
410+
Arg::Label(loc),
410411
],
411412
);
412413
self.trap_writer.add_tuple(
@@ -415,7 +416,6 @@ impl Visitor<'_> {
415416
Arg::Label(id),
416417
Arg::Int(*kind_id),
417418
sliced_source_arg(self.source, node),
418-
Arg::Label(loc),
419419
],
420420
);
421421
}
@@ -425,16 +425,16 @@ impl Visitor<'_> {
425425
} => {
426426
if let Some(args) = self.complex_node(&node, fields, &child_nodes, id) {
427427
self.trap_writer.add_tuple(
428-
&format!("{}_ast_node_parent", self.language_prefix),
428+
&format!("{}_ast_node_info", self.language_prefix),
429429
vec![
430430
Arg::Label(id),
431431
Arg::Label(parent_id),
432432
Arg::Int(parent_index),
433+
Arg::Label(loc),
433434
],
434435
);
435436
let mut all_args = vec![Arg::Label(id)];
436437
all_args.extend(args);
437-
all_args.push(Arg::Label(loc));
438438
self.trap_writer.add_tuple(table_name, all_args);
439439
}
440440
}

ruby/generator/src/main.rs

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -233,15 +233,6 @@ fn convert_nodes(
233233
});
234234
}
235235

236-
// Finally, the type's defining table also includes the location.
237-
main_table.columns.push(dbscheme::Column {
238-
unique: false,
239-
db_type: dbscheme::DbColumnType::Int,
240-
name: "loc",
241-
ql_type: ql::Type::At("location"),
242-
ql_type_is_ref: true,
243-
});
244-
245236
entries.push(dbscheme::Entry::Table(main_table));
246237
}
247238
node_types::EntryKind::Token { .. } => {}
@@ -251,18 +242,24 @@ fn convert_nodes(
251242
(entries, ast_node_members, token_kinds)
252243
}
253244

254-
/// Creates a dbscheme table entry representing the parent relation for AST nodes.
245+
/// Creates a dbscheme table specifying the parent node and location for each
246+
/// AST node.
255247
///
256248
/// # Arguments
257-
/// - `name` - the name of both the table to create and the node parent type.
249+
/// - `name` - the name of the table to create.
250+
/// - `parent_name` - the name of the parent type.
258251
/// - `ast_node_name` - the name of the node child type.
259-
fn create_ast_node_parent_table<'a>(name: &'a str, ast_node_name: &'a str) -> dbscheme::Table<'a> {
252+
fn create_ast_node_info_table<'a>(
253+
name: &'a str,
254+
parent_name: &'a str,
255+
ast_node_name: &'a str,
256+
) -> dbscheme::Table<'a> {
260257
dbscheme::Table {
261258
name,
262259
columns: vec![
263260
dbscheme::Column {
264261
db_type: dbscheme::DbColumnType::Int,
265-
name: "child",
262+
name: "node",
266263
unique: false,
267264
ql_type: ql::Type::At(ast_node_name),
268265
ql_type_is_ref: true,
@@ -271,7 +268,7 @@ fn create_ast_node_parent_table<'a>(name: &'a str, ast_node_name: &'a str) -> db
271268
db_type: dbscheme::DbColumnType::Int,
272269
name: "parent",
273270
unique: false,
274-
ql_type: ql::Type::At(name),
271+
ql_type: ql::Type::At(parent_name),
275272
ql_type_is_ref: true,
276273
},
277274
dbscheme::Column {
@@ -281,6 +278,13 @@ fn create_ast_node_parent_table<'a>(name: &'a str, ast_node_name: &'a str) -> db
281278
ql_type: ql::Type::Int,
282279
ql_type_is_ref: true,
283280
},
281+
dbscheme::Column {
282+
unique: false,
283+
db_type: dbscheme::DbColumnType::Int,
284+
name: "loc",
285+
ql_type: ql::Type::At("location"),
286+
ql_type_is_ref: true,
287+
},
284288
],
285289
keysets: Some(vec!["parent", "parent_index"]),
286290
}
@@ -312,13 +316,6 @@ fn create_tokeninfo<'a>(name: &'a str, type_name: &'a str) -> dbscheme::Table<'a
312316
ql_type: ql::Type::String,
313317
ql_type_is_ref: true,
314318
},
315-
dbscheme::Column {
316-
unique: false,
317-
db_type: dbscheme::DbColumnType::Int,
318-
name: "loc",
319-
ql_type: ql::Type::At("location"),
320-
ql_type_is_ref: true,
321-
},
322319
],
323320
}
324321
}
@@ -619,6 +616,7 @@ fn main() -> std::io::Result<()> {
619616
for language in languages {
620617
let prefix = node_types::to_snake_case(&language.name);
621618
let ast_node_name = format!("{}_ast_node", &prefix);
619+
let node_info_table_name = format!("{}_ast_node_info", &prefix);
622620
let ast_node_parent_name = format!("{}_ast_node_parent", &prefix);
623621
let token_name = format!("{}_token", &prefix);
624622
let tokeninfo_name = format!("{}_tokeninfo", &prefix);
@@ -641,7 +639,8 @@ fn main() -> std::io::Result<()> {
641639
name: &ast_node_parent_name,
642640
members: [&ast_node_name, "file"].iter().cloned().collect(),
643641
}),
644-
dbscheme::Entry::Table(create_ast_node_parent_table(
642+
dbscheme::Entry::Table(create_ast_node_info_table(
643+
&node_info_table_name,
645644
&ast_node_parent_name,
646645
&ast_node_name,
647646
)),
@@ -651,7 +650,7 @@ fn main() -> std::io::Result<()> {
651650
let mut body = vec![
652651
ql::TopLevel::Class(ql_gen::create_ast_node_class(
653652
&ast_node_name,
654-
&ast_node_parent_name,
653+
&node_info_table_name,
655654
)),
656655
ql::TopLevel::Class(ql_gen::create_token_class(&token_name, &tokeninfo_name)),
657656
ql::TopLevel::Class(ql_gen::create_reserved_word_class(&reserved_word_name)),

0 commit comments

Comments
 (0)