diff --git a/extractor/src/extractor.rs b/extractor/src/extractor.rs index 980d9562519..1f282d8211c 100644 --- a/extractor/src/extractor.rs +++ b/extractor/src/extractor.rs @@ -328,11 +328,17 @@ impl Visitor<'_> { match &table.kind { EntryKind::Token { kind_id, .. } => { self.trap_writer.add_tuple( - "tokeninfo", + "ast_node_parent", vec![ Arg::Label(id), Arg::Label(parent_id), Arg::Int(parent_index), + ], + ); + self.trap_writer.add_tuple( + "tokeninfo", + vec![ + Arg::Label(id), Arg::Int(*kind_id), Arg::Label(self.file_label), Arg::Int(self.token_counter), @@ -347,10 +353,16 @@ impl Visitor<'_> { name: table_name, } => { if let Some(args) = self.complex_node(&node, fields, &child_nodes, id) { + self.trap_writer.add_tuple( + "ast_node_parent", + vec![ + Arg::Label(id), + Arg::Label(parent_id), + Arg::Int(parent_index), + ], + ); let mut all_args = Vec::new(); all_args.push(Arg::Label(id)); - all_args.push(Arg::Label(parent_id)); - all_args.push(Arg::Int(parent_index)); all_args.extend(args); all_args.push(Arg::Label(loc)); self.trap_writer.add_tuple(&table_name, all_args); diff --git a/generator/src/main.rs b/generator/src/main.rs index c9a59dbb871..b3e73c5a445 100644 --- a/generator/src/main.rs +++ b/generator/src/main.rs @@ -178,30 +178,14 @@ fn convert_nodes<'a>(nodes: &'a node_types::NodeTypeMap) -> Vec(nodes: &'a node_types::NodeTypeMap) -> Vec( - token_kinds: Map<&'a str, usize>, -) -> (dbscheme::Case<'a>, dbscheme::Table<'a>) { - let table = dbscheme::Table { - name: "tokeninfo", - keysets: Some(vec!["parent", "parent_index"]), +fn create_ast_node_parent_table<'a>() -> dbscheme::Table<'a> { + dbscheme::Table { + name: "ast_node_parent", columns: vec![ dbscheme::Column { db_type: dbscheme::DbColumnType::Int, - name: "id", - unique: true, - ql_type: ql::Type::AtType("token"), - ql_type_is_ref: false, + name: "child", + unique: false, + ql_type: ql::Type::AtType("ast_node"), + ql_type_is_ref: true, }, dbscheme::Column { db_type: dbscheme::DbColumnType::Int, @@ -306,6 +289,25 @@ fn create_tokeninfo<'a>( ql_type: ql::Type::Int, ql_type_is_ref: true, }, + ], + keysets: Some(vec!["parent", "parent_index"]), + } +} + +fn create_tokeninfo<'a>( + token_kinds: Map<&'a str, usize>, +) -> (dbscheme::Case<'a>, dbscheme::Table<'a>) { + let table = dbscheme::Table { + name: "tokeninfo", + keysets: None, + columns: vec![ + dbscheme::Column { + db_type: dbscheme::DbColumnType::Int, + name: "id", + unique: true, + ql_type: ql::Type::AtType("token"), + ql_type_is_ref: false, + }, dbscheme::Column { unique: false, db_type: dbscheme::DbColumnType::Int, diff --git a/generator/src/ql_gen.rs b/generator/src/ql_gen.rs index 3a26c0ee018..fcdbe5541f7 100644 --- a/generator/src/ql_gen.rs +++ b/generator/src/ql_gen.rs @@ -75,33 +75,48 @@ fn create_ast_node_class<'a>() -> ql::Class<'a> { } fn create_token_class<'a>() -> ql::Class<'a> { + let tokeninfo_arity = 6; let get_parent = ql::Predicate { name: "getParent", overridden: true, return_type: Some(ql::Type::Normal("AstNode")), formal_parameters: vec![], - body: create_get_field_expr_for_column_storage("result", "tokeninfo", 0, 8), + body: ql::Expression::Pred( + "ast_node_parent", + vec![ + ql::Expression::Var("this"), + ql::Expression::Var("result"), + ql::Expression::Var("_"), + ], + ), }; let get_parent_index = ql::Predicate { name: "getParentIndex", overridden: true, return_type: Some(ql::Type::Int), formal_parameters: vec![], - body: create_get_field_expr_for_column_storage("result", "tokeninfo", 1, 8), + body: ql::Expression::Pred( + "ast_node_parent", + vec![ + ql::Expression::Var("this"), + ql::Expression::Var("_"), + ql::Expression::Var("result"), + ], + ), }; let get_value = ql::Predicate { name: "getValue", overridden: false, return_type: Some(ql::Type::String), formal_parameters: vec![], - body: create_get_field_expr_for_column_storage("result", "tokeninfo", 5, 8), + body: create_get_field_expr_for_column_storage("result", "tokeninfo", 3, tokeninfo_arity), }; let get_location = ql::Predicate { name: "getLocation", overridden: true, return_type: Some(ql::Type::Normal("Location")), formal_parameters: vec![], - body: create_get_field_expr_for_column_storage("result", "tokeninfo", 6, 8), + body: create_get_field_expr_for_column_storage("result", "tokeninfo", 4, tokeninfo_arity), }; let to_string = ql::Predicate { name: "toString", @@ -476,12 +491,10 @@ pub fn convert_nodes<'a>(nodes: &'a node_types::NodeTypeMap) -> Vec(nodes: &'a node_types::NodeTypeMap) -> Vec = Vec::new(); // Iterate through the fields, creating: @@ -538,11 +551,13 @@ pub fn convert_nodes<'a>(nodes: &'a node_types::NodeTypeMap) -> Vec(nodes: &'a node_types::NodeTypeMap) -> Vec