Ruby-Generator: add --dbscheme and --library flags

This commit is contained in:
Arthur Baars
2021-07-21 16:23:43 +02:00
parent fc8f5919f3
commit fe868e4c05
9 changed files with 41 additions and 21 deletions

View File

@@ -47,7 +47,7 @@ jobs:
run: cargo build --release
- name: Generate dbscheme
if: ${{ matrix.os == 'ubuntu-latest' }}
run: target/release/ruby-generator
run: target/release/ruby-generator --dbscheme ql/src/ruby.dbscheme --library ql/src/codeql_ruby/ast/internal/TreeSitter.qll
- uses: actions/upload-artifact@v2
if: ${{ matrix.os == 'ubuntu-latest' }}
with:

1
Cargo.lock generated
View File

@@ -396,6 +396,7 @@ dependencies = [
name = "ruby-generator"
version = "0.1.0"
dependencies = [
"clap",
"node-types",
"tracing",
"tracing-subscriber",

View File

@@ -16,7 +16,7 @@ The generated `ql/src/ruby.dbscheme` and `ql/src/codeql_ruby/ast/internal/TreeSi
```bash
# Run the generator
cargo run --release -p ruby-generator
cargo run --release -p ruby-generator -- --dbscheme ql/src/ruby.dbscheme --library ql/src/codeql_ruby/ast/internal/TreeSitter.qll
# Then auto-format the QL library
codeql query format -i ql/src/codeql_ruby/ast/internal/TreeSitter.qll
```

View File

@@ -1,6 +1,6 @@
cargo build --release
cargo run --release -p ruby-generator
cargo run --release -p ruby-generator -- --dbscheme ql/src/ruby.dbscheme --library ql/src/codeql_ruby/ast/internal/TreeSitter.qll
codeql query format -i ql\src\codeql_ruby\ast\internal\TreeSitter.qll
rm -Recurse -Force extractor-pack

View File

@@ -12,7 +12,7 @@ fi
cargo build --release
cargo run --release -p ruby-generator
cargo run --release -p ruby-generator -- --dbscheme ql/src/ruby.dbscheme --library ql/src/codeql_ruby/ast/internal/TreeSitter.qll
codeql query format -i ql/src/codeql_ruby/ast/internal/TreeSitter.qll
rm -rf extractor-pack

View File

@@ -7,6 +7,7 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
clap = "2.33"
node-types = { path = "../node-types" }
tracing = "0.1"
tracing-subscriber = { version = "0.2", features = ["env-filter"] }

View File

@@ -1,8 +1,4 @@
use std::path::PathBuf;
pub struct Language {
pub name: String,
pub node_types: &'static str,
pub dbscheme_path: PathBuf,
pub ql_library_path: PathBuf,
}

View File

@@ -3,6 +3,7 @@ mod language;
mod ql;
mod ql_gen;
use clap;
use language::Language;
use std::collections::BTreeMap as Map;
use std::collections::BTreeSet as Set;
@@ -369,16 +370,20 @@ fn create_tokeninfo<'a>(
(case, table)
}
fn write_dbscheme(language: &Language, entries: &[dbscheme::Entry]) -> std::io::Result<()> {
fn write_dbscheme(
dbscheme_path: PathBuf,
language: &Language,
entries: &[dbscheme::Entry],
) -> std::io::Result<()> {
info!(
"Writing database schema for {} to '{}'",
&language.name,
match language.dbscheme_path.to_str() {
match dbscheme_path.to_str() {
None => "<undisplayable>",
Some(p) => p,
}
);
let file = File::create(&language.dbscheme_path)?;
let file = File::create(dbscheme_path)?;
let mut file = LineWriter::new(file);
dbscheme::write(&language.name, &mut file, &entries)
}
@@ -665,7 +670,7 @@ fn create_diagnostics<'a>() -> (dbscheme::Case<'a>, dbscheme::Table<'a>) {
(case, table)
}
fn main() {
fn main() -> std::io::Result<()> {
tracing_subscriber::fmt()
.with_target(false)
.without_time()
@@ -673,13 +678,24 @@ fn main() {
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
.init();
// TODO: figure out proper dbscheme output path and/or take it from the
// command line.
let matches = clap::App::new("Ruby dbscheme generator")
.version("1.0")
.author("GitHub")
.about("CodeQL Ruby dbscheme generator")
.args_from_usage(
"--dbscheme=<FILE> 'Path of the generated dbscheme file'
--library=<FILE> 'Path of the generated QLL file'",
)
.get_matches();
let dbscheme_path = matches.value_of("dbscheme").expect("missing --dbscheme");
let dbscheme_path = PathBuf::from(dbscheme_path);
let ql_library_path = matches.value_of("library").expect("missing --library");
let ql_library_path = PathBuf::from(ql_library_path);
let ruby = Language {
name: "Ruby".to_owned(),
node_types: tree_sitter_ruby::NODE_TYPES,
dbscheme_path: PathBuf::from("ql/src/ruby.dbscheme"),
ql_library_path: PathBuf::from("ql/src/codeql_ruby/ast/internal/TreeSitter.qll"),
};
match node_types::read_node_types_str(&ruby.node_types) {
Err(e) => {
@@ -689,17 +705,18 @@ fn main() {
Ok(nodes) => {
let dbscheme_entries = convert_nodes(&nodes);
if let Err(e) = write_dbscheme(&ruby, &dbscheme_entries) {
if let Err(e) = write_dbscheme(dbscheme_path, &ruby, &dbscheme_entries) {
error!("Failed to write dbscheme: {}", e);
std::process::exit(2);
}
let classes = ql_gen::convert_nodes(&nodes);
if let Err(e) = ql_gen::write(&ruby, &classes) {
if let Err(e) = ql_gen::write(ql_library_path, &ruby, &classes) {
println!("Failed to write QL library: {}", e);
std::process::exit(3);
}
Ok(())
}
}
}

View File

@@ -3,6 +3,7 @@ use crate::ql;
use std::collections::BTreeSet;
use std::fs::File;
use std::io::LineWriter;
use std::path::PathBuf;
/// Writes the QL AST library for the given library.
///
@@ -10,16 +11,20 @@ use std::io::LineWriter;
///
/// `language` - the language for which we're generating a library
/// `classes` - the list of classes to write.
pub fn write(language: &Language, classes: &[ql::TopLevel]) -> std::io::Result<()> {
pub fn write(
ql_library_path: PathBuf,
language: &Language,
classes: &[ql::TopLevel]
) -> std::io::Result<()> {
println!(
"Writing QL library for {} to '{}'",
&language.name,
match language.ql_library_path.to_str() {
match ql_library_path.to_str() {
None => "<undisplayable>",
Some(p) => p,
}
);
let file = File::create(&language.ql_library_path)?;
let file = File::create(ql_library_path)?;
let mut file = LineWriter::new(file);
ql::write(&language.name, &mut file, &classes)
}