Skip to content

Commit 4454c41

Browse files
Initial Soufflé codegen
1 parent e87f913 commit 4454c41

File tree

29 files changed

+588
-77
lines changed

29 files changed

+588
-77
lines changed

.github/workflows/release.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ jobs:
1111
steps:
1212
- uses: actions/checkout@v3
1313

14+
- name: Run Datalog generators
15+
run: |
16+
cargo run --bin treeedbgen-souffle-java -- --output treeedb-java.dl
17+
cargo run --bin treeedbgen-souffle-souffle -- --output treeedb-souffle.dl
18+
1419
- name: Deps
1520
run: |
1621
sudo apt-get install -y musl-tools
@@ -20,12 +25,11 @@ jobs:
2025
run: |
2126
make static
2227
cp target/x86_64-unknown-linux-musl/release/treeedb-java .
28+
cp target/x86_64-unknown-linux-musl/release/treeedb-souffle .
2329
2430
- uses: ncipollo/release-action@v1
2531
with:
26-
artifacts: "treeedb-java"
32+
artifacts: "treeedb-java,treeedb-java.dl,treeedb-souffle,treeedb-souffle.dl"
2733
artifactErrorsFailBuild: true
28-
# TODO(lb):
29-
# body: ""
3034
draft: true
3135
token: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22
/target
33

44
/*.csv
5+
/*.dl
56
/*.java
67
/*.tsv

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
members = [
44
"treeedb",
55
"treeedb-java",
6+
"treeedb-souffle",
67
"treeedbgen",
78
"treeedbgen-souffle",
89
"treeedbgen-souffle-java",
10+
"treeedbgen-souffle-souffle",
911
]
1012

1113
[profile.release]

README.md

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,47 @@
11
# treeedb
22

3-
`treeedb` is a Rust library and collection of executables for generating
4-
relational views of [tree-sitter][tree-sitter] parse trees. These views may be
5-
used as inputs to a Datalog program or to construct a relational database.
3+
`treeedb` generates [Soufflé Datalog][souffle] types, relations, and facts that
4+
represent ASTs from a variety of programming languages. The parsers are based on
5+
[tree-sitter][tree-sitter] grammars.
6+
7+
<!-- for f in **/Cargo.toml; do printf "- [\`%s\`](%s): %s\n" "$(dirname ${f})" "./$(dirname ${f})" "$(grep descript "${f}" | grep -oP 'description = "\K[^"]+')"; done -->
8+
9+
- [`treeedb`](./treeedb): Generate Datalog facts from tree-sitter parse trees
10+
- [`treeedbgen`](./treeedbgen): Parse node-types.json from a tree-sitter grammar
11+
- [`treeedbgen-souffle`](./treeedbgen-souffle): Generate Soufflé types and relations from tree-sitter grammars
12+
- [`treeedbgen-souffle-java`](./treeedbgen-souffle-java): Generate Soufflé types and relations from the Java tree-sitter grammar
13+
- [`treeedbgen-souffle-souffle`](./treeedbgen-souffle-souffle): Generate Soufflé types and relations from the Soufflé tree-sitter grammar
14+
- [`treeedb-java`](./treeedb-java): Generate Datalog facts from Java source code
15+
- [`treeedb-souffle`](./treeedb-souffle): Generate Datalog facts from Soufflé source code
16+
17+
Don't see your favorite language? Adding a new one is *very* simple, see any of
18+
the existing languages. Or file an issue!
619

720
The name is a portmanteau of "tree-sitter" with "EDB", where EDB stands for
821
"extensional database" and refers to the set of facts in a Datalog program.
922

23+
## Usage
24+
25+
### Example: Analyzing Java Code with Soufflé
26+
27+
Navigate to the most recent release on the [releases page][releases]. Download
28+
the Java-related artifacts, namely the `treeedb-java` executable and
29+
`treeedb-java.dl`. Create a Java file:
30+
31+
```java
32+
class HelloWorld {
33+
public static void main(String[] args) {
34+
int x = 2 + 2;
35+
}
36+
}
37+
```
38+
39+
Let's try to find constant-valued variables in this code!
40+
41+
TODO(lb)!
42+
43+
[cargo]: https://doc.rust-lang.org/cargo/
1044
[tree-sitter]: https://tree-sitter.github.io/tree-sitter/
45+
[releases]: https://github.com/langston-barrett/treeedb/releases
46+
[rustup]: https://rustup.rs/
47+
[souffle]: https://souffle-lang.github.io/index.html

treeedb-java/Cargo.toml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@ repository = "https://github.com/langston-barrett/treeedb"
1212

1313
[dependencies]
1414
anyhow = "1.0"
15-
clap = { version = "4.0", features = ["derive"] }
16-
treeedb = { version = "0.1.0", path = "../treeedb" }
17-
tree-sitter = "0.20"
18-
tree-sitter-java = { version = "0.20", git = 'https://github.com/tree-sitter/tree-sitter-java', ref = "88339390aa70ca6784ecac82c34affa456dc6382" }
15+
treeedb = { version = "0.1.0", path = "../treeedb", features = ["cli"] }
16+
tree-sitter-java = { version = "0.20", git = 'https://github.com/tree-sitter/tree-sitter-java' }
1917

2018
# TODO(lb): Enable when this hits stable
2119
# https://doc.rust-lang.org/cargo/reference/unstable.html#artifact-dependencies

treeedb-java/src/cli.rs

Lines changed: 0 additions & 10 deletions
This file was deleted.

treeedb-java/src/main.rs

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,5 @@
1-
use std::fs;
2-
3-
use anyhow::{Context, Result};
4-
use clap::Parser;
5-
6-
mod cli;
7-
8-
fn read_file(file: &str) -> Result<String> {
9-
fs::read_to_string(file).with_context(|| format!("Failed to read file {}", file))
10-
}
11-
12-
fn parse(language: tree_sitter::Language, code: &str) -> Result<tree_sitter::Tree> {
13-
let mut parser = tree_sitter::Parser::new();
14-
parser
15-
.set_language(language)
16-
.context("Failed to set tree-sitter parser language")?;
17-
parser.parse(code, None).context("Failed to parse code")
18-
}
1+
use anyhow::Result;
192

203
fn main() -> Result<()> {
21-
let args = cli::Args::parse();
22-
let language = tree_sitter_java::language();
23-
let mut fc = treeedb::wide::WideCsvConsumer::new("node.csv".into(), "field.csv".into())?;
24-
for path in args.java_files {
25-
let tree = parse(language, &read_file(&path)?)?;
26-
treeedb::facts(&mut fc, tree).unwrap();
27-
}
28-
Ok(())
4+
treeedb::cli::main(tree_sitter_java::language())
295
}

treeedb-souffle/Cargo.toml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
[package]
2+
name = "treeedb-souffle"
3+
version = "0.1.0"
4+
edition = "2021"
5+
description = "Generate Datalog facts from Soufflé source code"
6+
keywords = ["datalog", "parsing", "souffle"]
7+
authors = ["Langston Barrett <[email protected]>"]
8+
license = "MIT"
9+
readme = "README.md"
10+
homepage = "https://github.com/langston-barrett/treeedb"
11+
repository = "https://github.com/langston-barrett/treeedb"
12+
13+
[dependencies]
14+
anyhow = "1.0"
15+
treeedb = { version = "0.1.0", path = "../treeedb", features = ["cli"] }
16+
tree-sitter-souffle = { version = "0.4.0" }
17+
18+
# TODO(lb): Enable when this hits stable
19+
# https://doc.rust-lang.org/cargo/reference/unstable.html#artifact-dependencies
20+
# [dev-dependencies]
21+
# cargo-deb = { version = "1", artifact = "bin" }
22+
23+
# TODO(lb):
24+
# [package.metadata.deb]
25+
# assets = [
26+
# ["../README.md", "usr/share/doc/treeedb-java/README.md", "644"],
27+
# ["target/x86_64-unknown-linux-musl/release/treedb-java", "usr/bin/", "755"],
28+
# ]

treeedb-souffle/src/main.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
use anyhow::Result;
2+
3+
fn main() -> Result<()> {
4+
treeedb::cli::main(tree_sitter_souffle::language())
5+
}

treeedb/Cargo.toml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,11 @@ homepage = "https://github.com/langston-barrett/treeedb"
1111
repository = "https://github.com/langston-barrett/treeedb"
1212

1313
[dependencies]
14+
anyhow = { version = "1", optional = true }
15+
clap = { version = "4", features = ["derive"], optional = true }
1416
csv = "1"
15-
tree-sitter = "0.20"
17+
tree-sitter = "0.20"
18+
19+
[features]
20+
default = []
21+
cli = ["dep:anyhow", "dep:clap"]

0 commit comments

Comments
 (0)