Skip to content

Commit fc99b54

Browse files
authored
Add ExpandInline handler (#1686)
1 parent 3e71fa0 commit fc99b54

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use std::sync::Arc;
2+
3+
use anyhow::Result;
4+
use cairo_lang_macro::TokenStream;
5+
use scarb_proc_macro_server_types::methods::{expand::ExpandInline, ProcMacroResult};
6+
7+
use super::Handler;
8+
use crate::compiler::plugin::proc_macro::{ExpansionKind, ProcMacroHost};
9+
10+
impl Handler for ExpandInline {
11+
fn handle(proc_macro_host: Arc<ProcMacroHost>, params: Self::Params) -> Result<Self::Response> {
12+
let instance = proc_macro_host
13+
.macros()
14+
.iter()
15+
.find(|e| {
16+
e.get_expansions()
17+
.iter()
18+
.filter(|expansion| expansion.kind == ExpansionKind::Inline)
19+
.any(|expansion| expansion.name == params.name)
20+
})
21+
.unwrap();
22+
23+
let result = instance.generate_code(params.name.into(), TokenStream::empty(), params.args);
24+
25+
Ok(ProcMacroResult {
26+
token_stream: result.token_stream,
27+
diagnostics: result.diagnostics,
28+
})
29+
}
30+
}

scarb/src/ops/proc_macro_server/methods/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::compiler::plugin::proc_macro::ProcMacroHost;
88
pub mod defined_macros;
99
pub mod expand_attribute;
1010
pub mod expand_derive;
11+
pub mod expand_inline;
1112

1213
pub trait Handler: Method {
1314
fn handle(proc_macro_host: Arc<ProcMacroHost>, params: Self::Params) -> Result<Self::Response>;

scarb/src/ops/proc_macro_server/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crossbeam_channel::{Receiver, Sender};
88
use methods::Handler;
99
use scarb_proc_macro_server_types::jsonrpc::{ResponseError, RpcRequest, RpcResponse};
1010
use scarb_proc_macro_server_types::methods::defined_macros::DefinedMacros;
11-
use scarb_proc_macro_server_types::methods::expand::{ExpandAttribute, ExpandDerive};
11+
use scarb_proc_macro_server_types::methods::expand::{ExpandAttribute, ExpandDerive, ExpandInline};
1212
use scarb_proc_macro_server_types::methods::Method;
1313
use serde_json::Value;
1414

@@ -75,6 +75,7 @@ fn route_request(proc_macros: Arc<ProcMacroHost>, request: RpcRequest) -> Result
7575
run_handler::<ExpandAttribute>(proc_macros.clone(), request.value)
7676
}
7777
ExpandDerive::METHOD => run_handler::<ExpandDerive>(proc_macros.clone(), request.value),
78+
ExpandInline::METHOD => run_handler::<ExpandInline>(proc_macros.clone(), request.value),
7879
_ => Err(anyhow!("method not found")),
7980
}
8081
}

scarb/tests/proc_macro_server.rs

+45
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use scarb_proc_macro_server_types::methods::expand::ExpandAttribute;
77
use scarb_proc_macro_server_types::methods::expand::ExpandAttributeParams;
88
use scarb_proc_macro_server_types::methods::expand::ExpandDerive;
99
use scarb_proc_macro_server_types::methods::expand::ExpandDeriveParams;
10+
use scarb_proc_macro_server_types::methods::expand::ExpandInline;
11+
use scarb_proc_macro_server_types::methods::expand::ExpandInlineMacroParams;
1012
use scarb_test_support::cairo_plugin_project_builder::CairoPluginProjectBuilder;
1113
use scarb_test_support::proc_macro_server::ProcMacroClient;
1214
use scarb_test_support::proc_macro_server::SIMPLE_MACROS;
@@ -126,3 +128,46 @@ fn expand_derive() {
126128
TokenStream::new("impl SomeImpl of SomeTrait {}".to_string())
127129
);
128130
}
131+
132+
#[test]
133+
fn expand_inline() {
134+
let t = TempDir::new().unwrap();
135+
let plugin_package = t.child("some");
136+
137+
let replace_all_15_with_25 = r#"
138+
#[inline_macro]
139+
pub fn replace_all_15_with_25(token_stream: TokenStream) -> ProcMacroResult {
140+
ProcMacroResult::new(TokenStream::new(token_stream.to_string().replace("15", "25")))
141+
}
142+
"#;
143+
144+
CairoPluginProjectBuilder::default()
145+
.lib_rs(format!("{SIMPLE_MACROS}\n{replace_all_15_with_25}"))
146+
.build(&plugin_package);
147+
148+
let project = t.child("test_package");
149+
150+
ProjectBuilder::start()
151+
.name("test_package")
152+
.version("1.0.0")
153+
.lib_cairo("")
154+
.dep("some", plugin_package)
155+
.build(&project);
156+
157+
let mut proc_macro_server = ProcMacroClient::new(&project);
158+
159+
let response = proc_macro_server
160+
.request_and_wait::<ExpandInline>(ExpandInlineMacroParams {
161+
name: "replace_all_15_with_25".to_string(),
162+
args: TokenStream::new(
163+
"struct A { field: 15 , other_field: macro_call!(12)}".to_string(),
164+
),
165+
})
166+
.unwrap();
167+
168+
assert_eq!(response.diagnostics, vec![]);
169+
assert_eq!(
170+
response.token_stream,
171+
TokenStream::new("struct A { field: 25 , other_field: macro_call!(12)}".to_string())
172+
);
173+
}

0 commit comments

Comments
 (0)