Skip to content

Commit cdcae3b

Browse files
authored
feat: basic compile time query support (#26)
* it works? * wip: ast queries * Get interfaces to work * misc fixes * Fix more tests * Update warning * make tests pass * Install cranelift * Update workflow * Add rustfmt * update snapshots
1 parent de41e7c commit cdcae3b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+864
-220
lines changed

.cargo/config.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[build]
2+
rustflags = ["-Clink-arg=-fuse-ld=lld", "-Zthreads=16"]

.github/actions/setup-environment/action.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,7 @@ runs:
44
using: "composite"
55
steps:
66
- uses: actions-rust-lang/setup-rust-toolchain@v1
7+
with:
8+
toolchain: nightly
9+
components: rustc-codegen-cranelift-preview, rustfmt
710
- uses: taiki-e/install-action@nextest

Cargo.lock

Lines changed: 16 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: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
cargo-features = ["codegen-backend"]
12
[package]
23
name = "codegen-sdk-core"
34
version = "0.1.0"
@@ -6,8 +7,8 @@ edition = "2024"
67
[dependencies]
78
clap = { version = "4.5.28", features = ["derive"] }
89
codegen-sdk-analyzer = { path = "codegen-sdk-analyzer" }
9-
codegen-sdk-cst = { workspace = true }
10-
codegen-sdk-common = { workspace = true }
10+
codegen-sdk-cst = { workspace = true , features = ["typescript"]}
11+
codegen-sdk-common = { workspace = true}
1112
crossbeam = "0.8.4"
1213
glob = "0.3.2"
1314
env_logger = { workspace = true }
@@ -69,7 +70,30 @@ mockall = "0.13.1"
6970
codegen-sdk-common = { path = "codegen-sdk-common" }
7071
codegen-sdk-cst = { path = "codegen-sdk-cst"}
7172
codegen-sdk-ast = { path = "codegen-sdk-ast" }
73+
codegen-sdk-cst-generator = { path = "codegen-sdk-cst-generator" }
74+
tempfile = "3.16.0"
75+
quote = "1.0.38"
76+
proc-macro2 = "1.0.93"
77+
derive-visitor = "0.4.0"
78+
insta = "1.42.1"
79+
prettyplease = "0.2.29"
80+
syn = { version = "2.0.98", features = ["proc-macro"] }
81+
derive_more = { version = "2.0.1", features = ["debug", "display"] }
82+
83+
[profile.dev]
84+
debug = 0
85+
codegen-backend = "cranelift"
7286

7387
[profile.dev.package]
7488
insta.opt-level = 3
7589
similar.opt-level = 3
90+
91+
[profile.test]
92+
inherits = "dev"
93+
opt-level = 0
94+
debug = 0
95+
strip = "none"
96+
lto = false
97+
codegen-units = 256
98+
incremental = true
99+
codegen-backend = "cranelift"

codegen-sdk-ast-generator/Cargo.toml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,14 @@ edition = "2024"
55

66
[dependencies]
77
codegen-sdk-common = { workspace = true }
8+
codegen-sdk-cst = { workspace = true , features = ["ts_query"]}
89
anyhow = { workspace = true }
10+
quote = { workspace = true }
11+
proc-macro2 = { workspace = true }
12+
log = { workspace = true }
13+
derive_more = { workspace = true }
14+
codegen-sdk-cst-generator = { workspace = true }
15+
convert_case = { workspace = true }
16+
[dev-dependencies]
17+
test-log = { workspace = true }
18+
insta = { workspace = true }

codegen-sdk-ast-generator/src/generator.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,31 @@ pub fn generate_ast(language: &Language) -> anyhow::Result<String> {
55
#[derive(Debug, Clone)]
66
pub struct {language_struct_name}File {{
77
node: {language_name}::{root_node_name},
8-
path: PathBuf
8+
path: PathBuf,
9+
pub visitor: QueryExecutor
910
}}
1011
impl File for {language_struct_name}File {{
1112
fn path(&self) -> &PathBuf {{
1213
&self.path
1314
}}
15+
fn parse(path: &PathBuf) -> Result<Self, ParseError> {{
16+
log::debug!(\"Parsing {language_name} file: {{}}\", path.display());
17+
let ast = {language_name}::{language_struct_name}::parse_file(path)?;
18+
let mut visitor = QueryExecutor::default();
19+
ast.drive(&mut visitor);
20+
Ok({language_struct_name}File {{ node: ast, path: path.clone(), visitor }})
21+
}}
1422
}}
1523
impl HasNode for {language_struct_name}File {{
1624
type Node = {language_name}::{root_node_name};
1725
fn node(&self) -> &Self::Node {{
1826
&self.node
1927
}}
2028
}}
21-
2229
",
2330
language_struct_name = language.struct_name,
2431
language_name = language.name(),
25-
root_node_name = language.root_node()
32+
root_node_name = language.root_node(),
2633
);
2734
// for (name, query) in language.definitions() {
2835
// content.push_str(&format!("

codegen-sdk-ast-generator/src/lib.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,31 @@
1-
use codegen_sdk_common::language::Language;
1+
#![feature(extend_one)]
2+
3+
use codegen_sdk_common::{generator::format_code, language::Language};
4+
use quote::quote;
5+
6+
use crate::query::HasQuery;
27
mod generator;
8+
mod query;
9+
mod visitor;
310
pub fn generate_ast(language: &Language) -> anyhow::Result<()> {
4-
let ast = generator::generate_ast(language)?;
11+
let imports = quote! {
12+
use derive_visitor::{Visitor, Drive};
13+
use codegen_sdk_common::*;
14+
use std::path::PathBuf;
15+
use codegen_sdk_cst::CSTLanguage;
16+
};
17+
let mut ast = generator::generate_ast(language)?;
18+
let visitor = visitor::generate_visitor(
19+
&language
20+
.definitions()
21+
.values()
22+
.into_iter()
23+
.flatten()
24+
.collect(),
25+
language,
26+
);
27+
ast = imports.to_string() + &ast + &visitor.to_string();
28+
ast = format_code(&ast).unwrap();
529
let out_dir = std::env::var("OUT_DIR")?;
630
let out_file = format!("{}/{}.rs", out_dir, language.name());
731
std::fs::write(out_file, ast)?;

0 commit comments

Comments
 (0)