Skip to content

Commit

Permalink
Add ExpandDerive handler
Browse files Browse the repository at this point in the history
commit-id:20ad0a61
  • Loading branch information
Draggu committed Nov 4, 2024
1 parent 4ae3d6f commit b112516
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
54 changes: 54 additions & 0 deletions scarb/src/ops/proc_macro_server/methods/expand_derive.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
use crate::{
compiler::plugin::proc_macro::{Expansion, ExpansionKind, ProcMacroHost},
ops::proc_macro_server::json_rpc::Handler,
};
use anyhow::Result;
use cairo_lang_macro::TokenStream;
use convert_case::{Case, Casing};
use scarb_proc_macro_server_types::methods::{expand::ExpandDerive, ProcMacroResult};
use std::sync::Arc;

impl Handler for ExpandDerive {
fn handle(proc_macros: Arc<ProcMacroHost>, params: Self::Params) -> Result<Self::Response> {
let mut derived_code = String::new();
let mut all_diagnostics = vec![];

for derive in params.derives {
let expansion = Expansion::new(derive.to_case(Case::Snake), ExpansionKind::Derive);
let package_id = proc_macros
.macros()
.into_iter()
.find(|e| e.get_expansions().contains(&expansion))
.map(|m| m.package_id())
.unwrap();

let instance = proc_macros
.macros()
.iter()
.find(|m| m.package_id() == package_id)
.unwrap();

let result = instance.generate_code(
expansion.name.clone(),
TokenStream::empty(),
params.item.clone(),
);

// Register diagnostics.
all_diagnostics.extend(result.diagnostics);

if result.token_stream.is_empty() {
// No code has been generated.
// We do not need to do anything.
continue;
}

derived_code.push_str(result.token_stream.to_string().as_str());
}

Ok(ProcMacroResult {
token_stream: TokenStream::new(derived_code),
diagnostics: all_diagnostics,
})
}
}
1 change: 1 addition & 0 deletions scarb/src/ops/proc_macro_server/methods/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod defined_macros;
pub mod expand_attribute;
pub mod expand_derive;
3 changes: 2 additions & 1 deletion scarb/src/ops/proc_macro_server/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use crossbeam_channel::{Receiver, Sender};
use json_rpc::Handler;
use scarb_proc_macro_server_types::jsonrpc::{ResponseError, RpcRequest, RpcResponse};
use scarb_proc_macro_server_types::methods::defined_macros::DefinedMacros;
use scarb_proc_macro_server_types::methods::expand::ExpandAttribute;
use scarb_proc_macro_server_types::methods::expand::{ExpandAttribute, ExpandDerive};
use scarb_proc_macro_server_types::methods::Method;
use serde_json::Value;

Expand Down Expand Up @@ -75,6 +75,7 @@ fn route_request(proc_macros: Arc<ProcMacroHost>, request: RpcRequest) -> Result
ExpandAttribute::METHOD => {
run_handler::<ExpandAttribute>(proc_macros.clone(), request.value)
}
ExpandDerive::METHOD => run_handler::<ExpandDerive>(proc_macros.clone(), request.value),
_ => Err(anyhow!("method not found")),
}
}
Expand Down

0 comments on commit b112516

Please sign in to comment.