Skip to content

Commit 70992ab

Browse files
Add Go support (#200)
1 parent 24f2c59 commit 70992ab

8 files changed

Lines changed: 120 additions & 0 deletions

File tree

Cargo.lock

Lines changed: 31 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ members = [
55
"treeedb-c",
66
"treeedb-cpp",
77
"treeedb-csharp",
8+
"treeedb-go",
89
"treeedb-java",
910
"treeedb-javascript",
1011
"treeedb-rust",
@@ -17,6 +18,7 @@ members = [
1718
"treeedbgen-souffle-c",
1819
"treeedbgen-souffle-cpp",
1920
"treeedbgen-souffle-csharp",
21+
"treeedbgen-souffle-go",
2022
"treeedbgen-souffle-java",
2123
"treeedbgen-souffle-javascript",
2224
"treeedbgen-souffle-php",

treeedb-go/Cargo.toml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[package]
2+
name = "treeedb-go"
3+
version = "0.1.0"
4+
edition = "2021"
5+
description = "Generate Datalog facts from Go source code"
6+
keywords = ["datalog", "go", "parsing", "souffle"]
7+
authors = ["Langston Barrett <langston.barrett@gmail.com>"]
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-go = { version = "0.20" }

treeedb-go/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_go::language())
5+
}

treeedbgen-souffle-go/Cargo.toml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[package]
2+
name = "treeedbgen-souffle-go"
3+
version = "0.1.0"
4+
edition = "2021"
5+
description = "Generate Soufflé types and relations from the Go tree-sitter grammar"
6+
keywords = ["datalog", "go", "parsing", "souffle"]
7+
authors = ["Langston Barrett <langston.barrett@gmail.com>"]
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"
15+
treeedbgen-souffle = { version = "0.1.0", path = "../treeedbgen-souffle", features = ["cli"] }
16+
tree-sitter-go = { version = "0.20" }
17+
18+
[dev-dependencies]
19+
assert_cmd = "2.0"
20+
predicates = "3.1"
21+
tempfile = "3"

treeedbgen-souffle-go/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+
treeedbgen_souffle::cli::main(tree_sitter_go::NODE_TYPES)
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func main() {
6+
fmt.Println("Hello, World!")
7+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use std::process::Command;
2+
3+
use assert_cmd::prelude::*;
4+
use predicates::prelude::*;
5+
use tempfile::NamedTempFile;
6+
7+
#[test]
8+
fn test_gen() -> Result<(), Box<dyn std::error::Error>> {
9+
let mut cmd = Command::cargo_bin("treeedbgen-souffle-go")?;
10+
let tmp = NamedTempFile::new()?;
11+
cmd.arg("-o").arg(tmp.path());
12+
cmd.arg("--prefix=c").arg("--printsize");
13+
cmd.assert()
14+
.success()
15+
.stdout(predicate::str::is_empty())
16+
.stderr(predicate::str::is_empty());
17+
18+
let mut cmd = Command::cargo_bin("treeedb-go")?;
19+
cmd.arg("tests/go/hello-world.go");
20+
cmd.assert()
21+
.success()
22+
.stdout(predicate::str::is_empty())
23+
.stderr(predicate::str::is_empty());
24+
25+
let mut souffle = Command::new("souffle");
26+
souffle.arg(tmp.path());
27+
souffle
28+
.assert()
29+
.success()
30+
.stdout(predicate::str::contains("go_node\t17"))
31+
.stderr(predicate::str::is_empty());
32+
Ok(())
33+
}

0 commit comments

Comments
 (0)