Skip to content

Commit 202d31b

Browse files
authored
basic AST generation support and other fixes (#10)
* fix parsing issues * Add tags and root node support * wip: ast * wip: ast * idk * idk * query lang * Automate cst addition of new languages * wip: query support/debugging * query parsing pt1 * move naming * kind id support * Automated pre-commit update
1 parent 3cce668 commit 202d31b

File tree

39 files changed

+592
-136
lines changed

39 files changed

+592
-136
lines changed

Cargo.lock

Lines changed: 56 additions & 3 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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ sysinfo = "0.33.1"
1717
[workspace]
1818
members = [
1919
"codegen-sdk-analyzer",
20-
"codegen-sdk-ast",
20+
"codegen-sdk-ast", "codegen-sdk-ast-generator",
2121
"codegen-sdk-common",
2222
"codegen-sdk-cst",
2323
"codegen-sdk-cst-generator", "codegen-sdk-macros",
@@ -37,3 +37,4 @@ bytes = "1.10.0"
3737
convert_case = "0.7.1"
3838
serde = { version = "1.0.217", features = ["derive"] }
3939
serde_json = "1.0.138"
40+
anyhow = { version = "1.0.95", features = ["backtrace"] }
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "codegen-sdk-ast-generator"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
codegen-sdk-common = { path = "../codegen-sdk-common"}
8+
anyhow = { workspace = true }
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use codegen_sdk_common::language::Language;
2+
pub fn generate_ast(language: &Language) -> anyhow::Result<String> {
3+
let content = format!(
4+
"
5+
#[derive(Debug)]
6+
pub struct {language_struct_name}File {{
7+
node: {language_name}::{root_node_name},
8+
path: PathBuf
9+
}}
10+
impl File for {language_struct_name}File {{
11+
fn path(&self) -> &PathBuf {{
12+
&self.path
13+
}}
14+
}}
15+
impl HasNode for {language_struct_name}File {{
16+
type Node = {language_name}::{root_node_name};
17+
fn node(&self) -> &Self::Node {{
18+
&self.node
19+
}}
20+
}}
21+
22+
",
23+
language_struct_name = language.struct_name,
24+
language_name = language.name,
25+
root_node_name = language.root_node()
26+
);
27+
// for (name, query) in language.definitions() {
28+
// content.push_str(&format!("
29+
// impl {language_struct_name}File {{
30+
// pub fn {name}(&self) -> {language_struct_name}File {{
31+
// {language_struct_name}File {{
32+
// node: self.node.children().find(|node| node.type_name == \"{name}\").unwrap(),
33+
// path: self.path.clone()
34+
// }}
35+
// }}
36+
// "));
37+
// }
38+
Ok(content)
39+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use codegen_sdk_common::language::Language;
2+
mod generator;
3+
pub fn generate_ast(language: &Language) -> anyhow::Result<()> {
4+
let ast = generator::generate_ast(language)?;
5+
let out_dir = std::env::var("OUT_DIR")?;
6+
let out_file = format!("{}/{}.rs", out_dir, language.name);
7+
std::fs::write(out_file, ast)?;
8+
Ok(())
9+
}

codegen-sdk-ast/Cargo.toml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,10 @@ edition = "2021"
55

66
[dependencies]
77
codegen-sdk-cst = { path = "../codegen-sdk-cst" }
8+
codegen-sdk-common = { path = "../codegen-sdk-common"}
9+
10+
[build-dependencies]
11+
codegen-sdk-common = { path = "../codegen-sdk-common"}
12+
env_logger = { workspace = true }
13+
rayon = { workspace = true }
14+
codegen-sdk-ast-generator = { path = "../codegen-sdk-ast-generator"}

codegen-sdk-ast/build.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
use codegen_sdk_ast_generator::generate_ast;
2+
use codegen_sdk_common::language::LANGUAGES;
3+
use rayon::prelude::*;
4+
fn main() {
5+
env_logger::init();
6+
LANGUAGES.par_iter().for_each(|language| {
7+
generate_ast(language).unwrap();
8+
});
9+
}

codegen-sdk-ast/src/lib.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,12 @@
1+
use codegen_sdk_common::{File, HasNode};
12
pub use codegen_sdk_cst::*;
3+
pub trait Named {
4+
fn name(&self) -> &str;
5+
}
6+
impl<T: File> Named for T {
7+
fn name(&self) -> &str {
8+
self.path().file_name().unwrap().to_str().unwrap()
9+
}
10+
}
11+
use std::path::PathBuf;
12+
include!(concat!(env!("OUT_DIR"), "/typescript.rs"));

codegen-sdk-ast/src/main.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pub use codegen_sdk_common::language::LANGUAGES;
2+
fn main() {
3+
for language in LANGUAGES.iter() {
4+
println!("{}", language.tags_query);
5+
}
6+
}

codegen-sdk-common/Cargo.toml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,18 @@ tree-sitter-json = { workspace = true, optional = true }
1414
tree-sitter-java = { workspace = true, optional = true }
1515
lazy_static = "1.5.0"
1616
thiserror = "2.0.11"
17+
serde = { workspace = true, features = ["derive"] }
18+
serde_json = { workspace = true }
19+
anyhow = { workspace = true }
20+
convert_case = { workspace = true }
21+
tree-sitter-query = {git = "https://github.com/tree-sitter-grammars/tree-sitter-query", optional = true}
22+
tree-sitter-language = "0.1.4"
23+
phf = { version = "0.11.3", features = ["macros"] }
1724
[features]
1825
python = ["dep:tree-sitter-python"]
1926
json = ["dep:tree-sitter-json"]
2027
java = ["dep:tree-sitter-java"]
2128
typescript = ["dep:tree-sitter-typescript", "dep:tree-sitter-javascript"]
22-
all = ["python", "typescript", "json", "java"]
29+
ts_query = ["dep:tree-sitter-query"]
30+
default = ["all"]
31+
all = ["python", "typescript", "json", "java", "ts_query"]

0 commit comments

Comments
 (0)