Skip to content

Commit cee6f00

Browse files
committed
Tree-sitter: Split up ast_node_info table into two tables
1 parent f025430 commit cee6f00

File tree

3 files changed

+86
-64
lines changed

3 files changed

+86
-64
lines changed

shared/tree-sitter-extractor/src/extractor/mod.rs

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,10 @@ struct Visitor<'a> {
209209
diagnostics_writer: &'a mut diagnostics::LogWriter,
210210
/// A trap::Writer to accumulate trap entries
211211
trap_writer: &'a mut trap::Writer,
212-
/// A counter for top-level child nodes
213-
toplevel_child_counter: usize,
214-
/// Language-specific name of the AST info table
215-
ast_node_info_table_name: String,
212+
/// Language-specific name of the AST location table
213+
ast_node_location_table_name: String,
214+
/// Language-specific name of the AST parent table
215+
ast_node_parent_table_name: String,
216216
/// Language-specific name of the tokeninfo table
217217
tokeninfo_table_name: String,
218218
/// A lookup table from type name to node types
@@ -242,8 +242,8 @@ impl<'a> Visitor<'a> {
242242
source,
243243
diagnostics_writer,
244244
trap_writer,
245-
toplevel_child_counter: 0,
246-
ast_node_info_table_name: format!("{}_ast_node_info", language_prefix),
245+
ast_node_location_table_name: format!("{}_ast_node_location", language_prefix),
246+
ast_node_parent_table_name: format!("{}_ast_node_parent", language_prefix),
247247
tokeninfo_table_name: format!("{}_tokeninfo", language_prefix),
248248
schema,
249249
stack: Vec::new(),
@@ -342,27 +342,29 @@ impl<'a> Visitor<'a> {
342342
})
343343
.unwrap();
344344
let mut valid = true;
345-
let (parent_id, parent_index) = match self.stack.last_mut() {
345+
let parent_info = match self.stack.last_mut() {
346346
Some(p) if !node.is_extra() => {
347347
p.1 += 1;
348-
(p.0, p.1 - 1)
349-
}
350-
_ => {
351-
self.toplevel_child_counter += 1;
352-
(self.file_label, self.toplevel_child_counter - 1)
348+
Some((p.0, p.1 - 1))
353349
}
350+
_ => None,
354351
};
355352
match &table.kind {
356353
EntryKind::Token { kind_id, .. } => {
357354
self.trap_writer.add_tuple(
358-
&self.ast_node_info_table_name,
359-
vec![
360-
trap::Arg::Label(id),
361-
trap::Arg::Label(parent_id),
362-
trap::Arg::Int(parent_index),
363-
trap::Arg::Label(loc_label),
364-
],
355+
&self.ast_node_location_table_name,
356+
vec![trap::Arg::Label(id), trap::Arg::Label(loc_label)],
365357
);
358+
if let Some((parent_id, parent_index)) = parent_info {
359+
self.trap_writer.add_tuple(
360+
&self.ast_node_parent_table_name,
361+
vec![
362+
trap::Arg::Label(id),
363+
trap::Arg::Label(parent_id),
364+
trap::Arg::Int(parent_index),
365+
],
366+
);
367+
};
366368
self.trap_writer.add_tuple(
367369
&self.tokeninfo_table_name,
368370
vec![
@@ -378,14 +380,19 @@ impl<'a> Visitor<'a> {
378380
} => {
379381
if let Some(args) = self.complex_node(&node, fields, &child_nodes, id) {
380382
self.trap_writer.add_tuple(
381-
&self.ast_node_info_table_name,
382-
vec![
383-
trap::Arg::Label(id),
384-
trap::Arg::Label(parent_id),
385-
trap::Arg::Int(parent_index),
386-
trap::Arg::Label(loc_label),
387-
],
383+
&self.ast_node_location_table_name,
384+
vec![trap::Arg::Label(id), trap::Arg::Label(loc_label)],
388385
);
386+
if let Some((parent_id, parent_index)) = parent_info {
387+
self.trap_writer.add_tuple(
388+
&self.ast_node_parent_table_name,
389+
vec![
390+
trap::Arg::Label(id),
391+
trap::Arg::Label(parent_id),
392+
trap::Arg::Int(parent_index),
393+
],
394+
);
395+
};
389396
let mut all_args = vec![trap::Arg::Label(id)];
390397
all_args.extend(args);
391398
self.trap_writer.add_tuple(table_name, all_args);

shared/tree-sitter-extractor/src/generator/mod.rs

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ pub fn generate(
5252
for language in languages {
5353
let prefix = node_types::to_snake_case(&language.name);
5454
let ast_node_name = format!("{}_ast_node", &prefix);
55-
let node_info_table_name = format!("{}_ast_node_info", &prefix);
56-
let ast_node_parent_name = format!("{}_ast_node_parent", &prefix);
55+
let node_location_table_name = format!("{}_ast_node_location", &prefix);
56+
let node_parent_table_name = format!("{}_ast_node_parent", &prefix);
5757
let token_name = format!("{}_token", &prefix);
5858
let tokeninfo_name = format!("{}_tokeninfo", &prefix);
5959
let reserved_word_name = format!("{}_reserved_word", &prefix);
@@ -72,13 +72,12 @@ pub fn generate(
7272
name: &ast_node_name,
7373
members: ast_node_members,
7474
}),
75-
dbscheme::Entry::Union(dbscheme::Union {
76-
name: &ast_node_parent_name,
77-
members: [&ast_node_name, "file"].iter().cloned().collect(),
78-
}),
79-
dbscheme::Entry::Table(create_ast_node_info_table(
80-
&node_info_table_name,
81-
&ast_node_parent_name,
75+
dbscheme::Entry::Table(create_ast_node_location_table(
76+
&node_location_table_name,
77+
&ast_node_name,
78+
)),
79+
dbscheme::Entry::Table(create_ast_node_parent_table(
80+
&node_parent_table_name,
8281
&ast_node_name,
8382
)),
8483
],
@@ -87,7 +86,8 @@ pub fn generate(
8786
let mut body = vec![
8887
ql::TopLevel::Class(ql_gen::create_ast_node_class(
8988
&ast_node_name,
90-
&node_info_table_name,
89+
&node_location_table_name,
90+
&node_parent_table_name,
9191
)),
9292
ql::TopLevel::Class(ql_gen::create_token_class(&token_name, &tokeninfo_name)),
9393
ql::TopLevel::Class(ql_gen::create_reserved_word_class(&reserved_word_name)),
@@ -335,16 +335,13 @@ fn convert_nodes(
335335
(entries, ast_node_members, token_kinds)
336336
}
337337

338-
/// Creates a dbscheme table specifying the parent node and location for each
339-
/// AST node.
338+
/// Creates a dbscheme table specifying the location for each AST node.
340339
///
341340
/// # Arguments
342341
/// - `name` - the name of the table to create.
343-
/// - `parent_name` - the name of the parent type.
344342
/// - `ast_node_name` - the name of the node child type.
345-
fn create_ast_node_info_table<'a>(
343+
fn create_ast_node_location_table<'a>(
346344
name: &'a str,
347-
parent_name: &'a str,
348345
ast_node_name: &'a str,
349346
) -> dbscheme::Table<'a> {
350347
dbscheme::Table {
@@ -358,24 +355,45 @@ fn create_ast_node_info_table<'a>(
358355
ql_type_is_ref: true,
359356
},
360357
dbscheme::Column {
361-
db_type: dbscheme::DbColumnType::Int,
362-
name: "parent",
363358
unique: false,
364-
ql_type: ql::Type::At(parent_name),
359+
db_type: dbscheme::DbColumnType::Int,
360+
name: "loc",
361+
ql_type: ql::Type::At("location_default"),
365362
ql_type_is_ref: true,
366363
},
364+
],
365+
keysets: None,
366+
}
367+
}
368+
369+
/// Creates a dbscheme table specifying the parent node for each AST node.
370+
///
371+
/// # Arguments
372+
/// - `name` - the name of the table to create.
373+
/// - `ast_node_name` - the name of the node child type.
374+
fn create_ast_node_parent_table<'a>(name: &'a str, ast_node_name: &'a str) -> dbscheme::Table<'a> {
375+
dbscheme::Table {
376+
name,
377+
columns: vec![
367378
dbscheme::Column {
368-
unique: false,
369379
db_type: dbscheme::DbColumnType::Int,
370-
name: "parent_index",
371-
ql_type: ql::Type::Int,
380+
name: "node",
381+
unique: true,
382+
ql_type: ql::Type::At(ast_node_name),
383+
ql_type_is_ref: true,
384+
},
385+
dbscheme::Column {
386+
db_type: dbscheme::DbColumnType::Int,
387+
name: "parent",
388+
unique: false,
389+
ql_type: ql::Type::At(ast_node_name),
372390
ql_type_is_ref: true,
373391
},
374392
dbscheme::Column {
375393
unique: false,
376394
db_type: dbscheme::DbColumnType::Int,
377-
name: "loc",
378-
ql_type: ql::Type::At("location_default"),
395+
name: "parent_index",
396+
ql_type: ql::Type::Int,
379397
ql_type_is_ref: true,
380398
},
381399
],

shared/tree-sitter-extractor/src/generator/ql_gen.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ use crate::{generator::ql, node_types};
44

55
/// Creates the hard-coded `AstNode` class that acts as a supertype of all
66
/// classes we generate.
7-
pub fn create_ast_node_class<'a>(ast_node: &'a str, node_info_table: &'a str) -> ql::Class<'a> {
7+
pub fn create_ast_node_class<'a>(
8+
ast_node: &'a str,
9+
node_location_table: &'a str,
10+
node_parent_table: &'a str,
11+
) -> ql::Class<'a> {
812
// Default implementation of `toString` calls `this.getAPrimaryQlClass()`
913
let to_string = ql::Predicate {
1014
qldoc: Some(String::from(
@@ -32,13 +36,8 @@ pub fn create_ast_node_class<'a>(ast_node: &'a str, node_info_table: &'a str) ->
3236
return_type: Some(ql::Type::Normal("L::Location")),
3337
formal_parameters: vec![],
3438
body: ql::Expression::Pred(
35-
node_info_table,
36-
vec![
37-
ql::Expression::Var("this"),
38-
ql::Expression::Var("_"), // parent
39-
ql::Expression::Var("_"), // parent index
40-
ql::Expression::Var("result"), // location
41-
],
39+
node_location_table,
40+
vec![ql::Expression::Var("this"), ql::Expression::Var("result")],
4241
),
4342
};
4443
let get_a_field_or_child = create_none_predicate(
@@ -55,12 +54,11 @@ pub fn create_ast_node_class<'a>(ast_node: &'a str, node_info_table: &'a str) ->
5554
return_type: Some(ql::Type::Normal("AstNode")),
5655
formal_parameters: vec![],
5756
body: ql::Expression::Pred(
58-
node_info_table,
57+
node_parent_table,
5958
vec![
6059
ql::Expression::Var("this"),
6160
ql::Expression::Var("result"),
62-
ql::Expression::Var("_"), // parent index
63-
ql::Expression::Var("_"), // location
61+
ql::Expression::Var("_"),
6462
],
6563
),
6664
};
@@ -74,12 +72,11 @@ pub fn create_ast_node_class<'a>(ast_node: &'a str, node_info_table: &'a str) ->
7472
return_type: Some(ql::Type::Int),
7573
formal_parameters: vec![],
7674
body: ql::Expression::Pred(
77-
node_info_table,
75+
node_parent_table,
7876
vec![
7977
ql::Expression::Var("this"),
80-
ql::Expression::Var("_"), // parent
81-
ql::Expression::Var("result"), // parent index
82-
ql::Expression::Var("_"), // location
78+
ql::Expression::Var("_"),
79+
ql::Expression::Var("result"),
8380
],
8481
),
8582
};

0 commit comments

Comments
 (0)