Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[build]
rustflags = ["-Clink-arg=-fuse-ld=lld", "-Zthreads=16"]
16 changes: 16 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 26 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
cargo-features = ["codegen-backend"]
[package]
name = "codegen-sdk-core"
version = "0.1.0"
Expand All @@ -6,8 +7,8 @@ edition = "2024"
[dependencies]
clap = { version = "4.5.28", features = ["derive"] }
codegen-sdk-analyzer = { path = "codegen-sdk-analyzer" }
codegen-sdk-cst = { workspace = true }
codegen-sdk-common = { workspace = true }
codegen-sdk-cst = { workspace = true , features = ["typescript"]}
codegen-sdk-common = { workspace = true}
crossbeam = "0.8.4"
glob = "0.3.2"
env_logger = { workspace = true }
Expand Down Expand Up @@ -69,7 +70,30 @@ mockall = "0.13.1"
codegen-sdk-common = { path = "codegen-sdk-common" }
codegen-sdk-cst = { path = "codegen-sdk-cst"}
codegen-sdk-ast = { path = "codegen-sdk-ast" }
codegen-sdk-cst-generator = { path = "codegen-sdk-cst-generator" }
tempfile = "3.16.0"
quote = "1.0.38"
proc-macro2 = "1.0.93"
derive-visitor = "0.4.0"
insta = "1.42.1"
prettyplease = "0.2.29"
syn = { version = "2.0.98", features = ["proc-macro"] }
derive_more = { version = "2.0.1", features = ["debug", "display"] }

[profile.dev]
debug = 0
codegen-backend = "cranelift"

[profile.dev.package]
insta.opt-level = 3
similar.opt-level = 3

[profile.test]
inherits = "dev"
opt-level = 0
debug = 0
strip = "none"
lto = false
codegen-units = 256
incremental = true
codegen-backend = "cranelift"
10 changes: 10 additions & 0 deletions codegen-sdk-ast-generator/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,14 @@ edition = "2024"

[dependencies]
codegen-sdk-common = { workspace = true }
codegen-sdk-cst = { workspace = true , features = ["ts_query"]}
anyhow = { workspace = true }
quote = { workspace = true }
proc-macro2 = { workspace = true }
log = { workspace = true }
derive_more = { workspace = true }
codegen-sdk-cst-generator = { workspace = true }
convert_case = { workspace = true }
[dev-dependencies]
test-log = { workspace = true }
insta = { workspace = true }
13 changes: 10 additions & 3 deletions codegen-sdk-ast-generator/src/generator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,31 @@ pub fn generate_ast(language: &Language) -> anyhow::Result<String> {
#[derive(Debug, Clone)]
pub struct {language_struct_name}File {{
node: {language_name}::{root_node_name},
path: PathBuf
path: PathBuf,
pub visitor: QueryExecutor
}}
impl File for {language_struct_name}File {{
fn path(&self) -> &PathBuf {{
&self.path
}}
fn parse(path: &PathBuf) -> Result<Self, ParseError> {{
log::debug!(\"Parsing {language_name} file: {{}}\", path.display());
let ast = {language_name}::{language_struct_name}::parse_file(path)?;
let mut visitor = QueryExecutor::default();
ast.drive(&mut visitor);
Ok({language_struct_name}File {{ node: ast, path: path.clone(), visitor }})
}}
}}
impl HasNode for {language_struct_name}File {{
type Node = {language_name}::{root_node_name};
fn node(&self) -> &Self::Node {{
&self.node
}}
}}

",
language_struct_name = language.struct_name,
language_name = language.name(),
root_node_name = language.root_node()
root_node_name = language.root_node(),
);
// for (name, query) in language.definitions() {
// content.push_str(&format!("
Expand Down
28 changes: 26 additions & 2 deletions codegen-sdk-ast-generator/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,31 @@
use codegen_sdk_common::language::Language;
#![feature(extend_one)]

use codegen_sdk_common::{generator::format_code, language::Language};
use quote::quote;

use crate::query::HasQuery;
mod generator;
mod query;
mod visitor;
pub fn generate_ast(language: &Language) -> anyhow::Result<()> {
let ast = generator::generate_ast(language)?;
let imports = quote! {
use derive_visitor::{Visitor, Drive};
use codegen_sdk_common::*;
use std::path::PathBuf;
use codegen_sdk_cst::CSTLanguage;
};
let mut ast = generator::generate_ast(language)?;
let visitor = visitor::generate_visitor(
&language
.definitions()
.values()
.into_iter()
.flatten()
.collect(),
language,
);
ast = imports.to_string() + &ast + &visitor.to_string();
ast = format_code(&ast).unwrap();
let out_dir = std::env::var("OUT_DIR")?;
let out_file = format!("{}/{}.rs", out_dir, language.name());
std::fs::write(out_file, ast)?;
Expand Down
Loading
Loading