From 5f2a0d2714c200f1bd7ad7d19c5848822153022e Mon Sep 17 00:00:00 2001 From: maciektr Date: Mon, 29 Jan 2024 11:21:12 +0100 Subject: [PATCH] Create shared proc-macro primitives lib commit-id:4d5003fc --- Cargo.lock | 11 +++++ Cargo.toml | 1 + scarb/Cargo.toml | 1 + utils/scarb-proc-macro-interface/Cargo.toml | 19 ++++++++ utils/scarb-proc-macro-interface/README.md | 1 + utils/scarb-proc-macro-interface/src/lib.rs | 2 + .../scarb-proc-macro-interface/src/plugin.rs | 46 +++++++++++++++++++ .../scarb-proc-macro-interface/src/shared.rs | 17 +++++++ 8 files changed, 98 insertions(+) create mode 100644 utils/scarb-proc-macro-interface/Cargo.toml create mode 100644 utils/scarb-proc-macro-interface/README.md create mode 100644 utils/scarb-proc-macro-interface/src/lib.rs create mode 100644 utils/scarb-proc-macro-interface/src/plugin.rs create mode 100644 utils/scarb-proc-macro-interface/src/shared.rs diff --git a/Cargo.lock b/Cargo.lock index b57eb001f..9256f9b38 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4487,6 +4487,7 @@ dependencies = [ "reqwest", "scarb-build-metadata", "scarb-metadata 1.11.0", + "scarb-proc-macro-interface", "scarb-test-support", "scarb-ui", "semver", @@ -4607,6 +4608,16 @@ dependencies = [ "thiserror", ] +[[package]] +name = "scarb-proc-macro-interface" +version = "0.0.1" +dependencies = [ + "anyhow", + "libc", + "serde", + "serde_json", +] + [[package]] name = "scarb-snforge-test-collector" version = "2.5.3" diff --git a/Cargo.toml b/Cargo.toml index c33aea1e1..f4f11c292 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "extensions/scarb-snforge-test-collector", "utils/create-output-dir", "utils/scarb-build-metadata", + "utils/scarb-proc-macro-interface", "utils/scarb-test-support", "utils/scarb-ui", "utils/test-for-each-example", diff --git a/scarb/Cargo.toml b/scarb/Cargo.toml index b120ab443..f1d0fb029 100644 --- a/scarb/Cargo.toml +++ b/scarb/Cargo.toml @@ -78,6 +78,7 @@ windows-sys.workspace = true xxhash-rust.workspace = true zip.workspace = true zstd.workspace = true +scarb-proc-macro-interface = { path = "../utils/scarb-proc-macro-interface" } [target.'cfg(not(target_os = "linux"))'.dependencies] reqwest = { workspace = true, default-features = true} diff --git a/utils/scarb-proc-macro-interface/Cargo.toml b/utils/scarb-proc-macro-interface/Cargo.toml new file mode 100644 index 000000000..aab014566 --- /dev/null +++ b/utils/scarb-proc-macro-interface/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "scarb-proc-macro-interface" +version = "0.0.1" +edition.workspace = true + +authors.workspace = true +categories = ["development-tools"] +description = "Cariro procedural macro interface primitives." +homepage.workspace = true +keywords = ["scarb"] +license.workspace = true +readme = "README.md" +repository.workspace = true + +[dependencies] +anyhow.workspace = true +serde.workspace = true +serde_json.workspace = true +libc.workspace = true diff --git a/utils/scarb-proc-macro-interface/README.md b/utils/scarb-proc-macro-interface/README.md new file mode 100644 index 000000000..406164e33 --- /dev/null +++ b/utils/scarb-proc-macro-interface/README.md @@ -0,0 +1 @@ +# scarb-proc-macro-interface diff --git a/utils/scarb-proc-macro-interface/src/lib.rs b/utils/scarb-proc-macro-interface/src/lib.rs new file mode 100644 index 000000000..14f5e881e --- /dev/null +++ b/utils/scarb-proc-macro-interface/src/lib.rs @@ -0,0 +1,2 @@ +pub mod plugin; +pub mod shared; diff --git a/utils/scarb-proc-macro-interface/src/plugin.rs b/utils/scarb-proc-macro-interface/src/plugin.rs new file mode 100644 index 000000000..58c78b546 --- /dev/null +++ b/utils/scarb-proc-macro-interface/src/plugin.rs @@ -0,0 +1,46 @@ +use crate::shared::{FfiProcMacroResult, FfiTokenStream}; +use std::ffi::CString; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum ProcMacroResult { + /// Plugin has not taken any action. + Leave, + /// Plugin generated TokenStream replacement. + Replace(TokenStream), + /// Plugin ordered item removal. + Remove, +} + +#[derive(Debug, Default, Clone)] +pub struct TokenStream(String); + +impl FfiTokenStream { + /// # Safety + pub unsafe fn to_string(&self) -> String { + if self.0.is_null() { + String::default() + } else { + let cstr = CString::from_raw(self.0); + cstr.to_string_lossy().to_string() + } + } +} + +impl TokenStream { + /// # Safety + pub unsafe fn to_ffi(&self) -> FfiTokenStream { + FfiTokenStream(CString::new(self.0.clone()).unwrap().into_raw()) + } +} + +impl ProcMacroResult { + /// # Safety + pub unsafe fn to_ffi(&self) -> FfiProcMacroResult { + match self { + Self::Leave => FfiProcMacroResult::Leave, + Self::Remove => FfiProcMacroResult::Remove, + Self::Replace(token_stream) => FfiProcMacroResult::Replace(token_stream.to_ffi()), + } + } +} diff --git a/utils/scarb-proc-macro-interface/src/shared.rs b/utils/scarb-proc-macro-interface/src/shared.rs new file mode 100644 index 000000000..c78625296 --- /dev/null +++ b/utils/scarb-proc-macro-interface/src/shared.rs @@ -0,0 +1,17 @@ +use std::os::raw::c_char; + +#[repr(C)] +#[derive(Debug)] +#[allow(dead_code)] +pub enum FfiProcMacroResult { + /// Plugin has not taken any action. + Leave, + /// Plugin generated TokenStream replacement. + Replace(FfiTokenStream), + /// Plugin ordered item removal. + Remove, +} + +#[repr(C)] +#[derive(Debug)] +pub struct FfiTokenStream(pub *mut c_char);