From 206948efa17f190a0a0f843ea2c5e949aebc8fa6 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Tue, 26 Aug 2025 15:39:36 -0500 Subject: [PATCH] Experimenting with build.rs, quote, and syn. --- Cargo.lock | 28 ++++++++++++++++++++++++---- Cargo.toml | 7 +++++++ ast-generator/Cargo.toml | 9 +++++++++ ast-generator/src/lib.rs | 30 ++++++++++++++++++++++++++++++ build.rs | 14 ++++++++++++++ 5 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 ast-generator/Cargo.toml create mode 100644 ast-generator/src/lib.rs create mode 100644 build.rs diff --git a/Cargo.lock b/Cargo.lock index bb676ae..6f544a0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,6 +51,15 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "ast-generator" +version = "0.1.0" +dependencies = [ + "prettyplease", + "quote", + "syn", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -146,6 +155,7 @@ dependencies = [ name = "deimos" version = "0.1.0" dependencies = [ + "ast-generator", "clap", "codespan-reporting", "indoc", @@ -261,6 +271,16 @@ dependencies = [ "sha2", ] +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + [[package]] name = "proc-macro2" version = "1.0.92" @@ -272,9 +292,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -318,9 +338,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "syn" -version = "2.0.90" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 338a3d2..0b277e7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,3 +18,10 @@ pest_derive = { version = "2.8.0", features = ["grammar-extras"] } codespan-reporting = "0.12.0" log = "0.4.27" indoc = "2.0.6" + +[build-dependencies] +ast-generator = { path = "ast-generator" } + +[workspace] +resolver = "3" +members = ["ast-generator"] diff --git a/ast-generator/Cargo.toml b/ast-generator/Cargo.toml new file mode 100644 index 0000000..9897028 --- /dev/null +++ b/ast-generator/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "ast-generator" +version = "0.1.0" +edition = "2024" + +[dependencies] +prettyplease = "0.2.37" +quote = "1.0.40" +syn = "2.0.106" diff --git a/ast-generator/src/lib.rs b/ast-generator/src/lib.rs new file mode 100644 index 0000000..1626d60 --- /dev/null +++ b/ast-generator/src/lib.rs @@ -0,0 +1,30 @@ +use quote::quote; + +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +pub fn speak(s: &str) { + println!("{}", s); +} + +pub fn do_some_quoting(msg: &str) -> String { + let output = quote! { + pub fn some_quoting() { + println!(#msg); + } + }; + let syntax_tree = syn::parse2(output).unwrap(); + prettyplease::unparse(&syntax_tree) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..f388c96 --- /dev/null +++ b/build.rs @@ -0,0 +1,14 @@ +use std::env; +use std::fs::write; +use std::path::Path; +use ast_generator::do_some_quoting; + +fn main() -> std::io::Result<()> { + println!("cargo:rerun-if-changed=src/parser/deimos.pest"); + let out_dir = env::var("OUT_DIR").unwrap(); + let out_dir_path = Path::new(&out_dir); + let testing_txt_path = out_dir_path.join("testing.rs"); + let output = do_some_quoting("Hello, World!"); + write(&testing_txt_path, output)?; + Ok(()) +}