Skip to content

Commit dbe2951

Browse files
authored
Merge pull request github#7880 from github/nickrolfe/locations_column_ql
QL for QL: sync changes from Ruby
2 parents db8ffb5 + 073d325 commit dbe2951

File tree

8 files changed

+6900
-12459
lines changed

8 files changed

+6900
-12459
lines changed

ql/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
}

ql/generator/src/main.rs

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -232,15 +232,6 @@ fn convert_nodes(
232232
});
233233
}
234234

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

253-
/// Creates a dbscheme table entry representing the parent relation for AST nodes.
244+
/// Creates a dbscheme table specifying the parent node and location for each
245+
/// AST node.
254246
///
255247
/// # Arguments
256-
/// - `name` - the name of both the table to create and the node parent type.
248+
/// - `name` - the name of the table to create.
249+
/// - `parent_name` - the name of the parent type.
257250
/// - `ast_node_name` - the name of the node child type.
258-
fn create_ast_node_parent_table<'a>(name: &'a str, ast_node_name: &'a str) -> dbscheme::Table<'a> {
251+
fn create_ast_node_info_table<'a>(
252+
name: &'a str,
253+
parent_name: &'a str,
254+
ast_node_name: &'a str,
255+
) -> dbscheme::Table<'a> {
259256
dbscheme::Table {
260257
name,
261258
columns: vec![
262259
dbscheme::Column {
263260
db_type: dbscheme::DbColumnType::Int,
264-
name: "child",
261+
name: "node",
265262
unique: false,
266263
ql_type: ql::Type::At(ast_node_name),
267264
ql_type_is_ref: true,
@@ -270,7 +267,7 @@ fn create_ast_node_parent_table<'a>(name: &'a str, ast_node_name: &'a str) -> db
270267
db_type: dbscheme::DbColumnType::Int,
271268
name: "parent",
272269
unique: false,
273-
ql_type: ql::Type::At(name),
270+
ql_type: ql::Type::At(parent_name),
274271
ql_type_is_ref: true,
275272
},
276273
dbscheme::Column {
@@ -280,6 +277,13 @@ fn create_ast_node_parent_table<'a>(name: &'a str, ast_node_name: &'a str) -> db
280277
ql_type: ql::Type::Int,
281278
ql_type_is_ref: true,
282279
},
280+
dbscheme::Column {
281+
unique: false,
282+
db_type: dbscheme::DbColumnType::Int,
283+
name: "loc",
284+
ql_type: ql::Type::At("location"),
285+
ql_type_is_ref: true,
286+
},
283287
],
284288
keysets: Some(vec!["parent", "parent_index"]),
285289
}
@@ -311,13 +315,6 @@ fn create_tokeninfo<'a>(name: &'a str, type_name: &'a str) -> dbscheme::Table<'a
311315
ql_type: ql::Type::String,
312316
ql_type_is_ref: true,
313317
},
314-
dbscheme::Column {
315-
unique: false,
316-
db_type: dbscheme::DbColumnType::Int,
317-
name: "loc",
318-
ql_type: ql::Type::At("location"),
319-
ql_type_is_ref: true,
320-
},
321318
],
322319
}
323320
}
@@ -605,15 +602,16 @@ fn main() -> std::io::Result<()> {
605602
)?;
606603
ql::write(
607604
&mut ql_writer,
608-
&[
609-
ql::TopLevel::Import("codeql.files.FileSystem"),
610-
ql::TopLevel::Import("codeql.Locations"),
611-
],
605+
&[ql::TopLevel::Import(ql::Import {
606+
module: "codeql.Locations",
607+
alias: Some("L"),
608+
})],
612609
)?;
613610

614611
for language in languages {
615612
let prefix = node_types::to_snake_case(&language.name);
616613
let ast_node_name = format!("{}_ast_node", &prefix);
614+
let node_info_table_name = format!("{}_ast_node_info", &prefix);
617615
let ast_node_parent_name = format!("{}_ast_node_parent", &prefix);
618616
let token_name = format!("{}_token", &prefix);
619617
let tokeninfo_name = format!("{}_tokeninfo", &prefix);
@@ -636,7 +634,8 @@ fn main() -> std::io::Result<()> {
636634
name: &ast_node_parent_name,
637635
members: [&ast_node_name, "file"].iter().cloned().collect(),
638636
}),
639-
dbscheme::Entry::Table(create_ast_node_parent_table(
637+
dbscheme::Entry::Table(create_ast_node_info_table(
638+
&node_info_table_name,
640639
&ast_node_parent_name,
641640
&ast_node_name,
642641
)),
@@ -646,7 +645,7 @@ fn main() -> std::io::Result<()> {
646645
let mut body = vec![
647646
ql::TopLevel::Class(ql_gen::create_ast_node_class(
648647
&ast_node_name,
649-
&ast_node_parent_name,
648+
&node_info_table_name,
650649
)),
651650
ql::TopLevel::Class(ql_gen::create_token_class(&token_name, &tokeninfo_name)),
652651
ql::TopLevel::Class(ql_gen::create_reserved_word_class(&reserved_word_name)),

ql/generator/src/ql.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,35 @@ use std::fmt;
44
#[derive(Clone, Eq, PartialEq, Hash)]
55
pub enum TopLevel<'a> {
66
Class(Class<'a>),
7-
Import(&'a str),
7+
Import(Import<'a>),
88
Module(Module<'a>),
99
}
1010

1111
impl<'a> fmt::Display for TopLevel<'a> {
1212
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1313
match self {
14-
TopLevel::Import(x) => write!(f, "private import {}", x),
14+
TopLevel::Import(imp) => write!(f, "{}", imp),
1515
TopLevel::Class(cls) => write!(f, "{}", cls),
1616
TopLevel::Module(m) => write!(f, "{}", m),
1717
}
1818
}
1919
}
2020

21+
#[derive(Clone, Eq, PartialEq, Hash)]
22+
pub struct Import<'a> {
23+
pub module: &'a str,
24+
pub alias: Option<&'a str>,
25+
}
26+
27+
impl<'a> fmt::Display for Import<'a> {
28+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
29+
write!(f, "import {}", &self.module)?;
30+
if let Some(name) = &self.alias {
31+
write!(f, " as {}", name)?;
32+
}
33+
Ok(())
34+
}
35+
}
2136
#[derive(Clone, Eq, PartialEq, Hash)]
2237
pub struct Class<'a> {
2338
pub qldoc: Option<String>,
@@ -53,6 +68,7 @@ impl<'a> fmt::Display for Class<'a> {
5368
qldoc: None,
5469
name: self.name,
5570
overridden: false,
71+
is_final: false,
5672
return_type: None,
5773
formal_parameters: vec![],
5874
body: charpred.clone(),
@@ -224,6 +240,7 @@ pub struct Predicate<'a> {
224240
pub qldoc: Option<String>,
225241
pub name: &'a str,
226242
pub overridden: bool,
243+
pub is_final: bool,
227244
pub return_type: Option<Type<'a>>,
228245
pub formal_parameters: Vec<FormalParameter<'a>>,
229246
pub body: Expression<'a>,
@@ -234,6 +251,9 @@ impl<'a> fmt::Display for Predicate<'a> {
234251
if let Some(qldoc) = &self.qldoc {
235252
write!(f, "/** {} */", qldoc)?;
236253
}
254+
if self.is_final {
255+
write!(f, "final ")?;
256+
}
237257
if self.overridden {
238258
write!(f, "override ")?;
239259
}

0 commit comments

Comments
 (0)