aboutsummaryrefslogtreecommitdiff
path: root/guests_macro/src
diff options
context:
space:
mode:
authorKamen Mladenov <kamen@syndamia.com>2025-02-05 12:33:32 +0200
committerKamen Mladenov <kamen@syndamia.com>2025-02-05 12:33:32 +0200
commitea504096df8e92eb224408b65ed0d7031fc3f402 (patch)
tree040b18a6c37d6a9cec8b358986dc9efef0f04469 /guests_macro/src
parent8b930aaea3fd937ade4b4828a7dd666c4a5c949c (diff)
downloadzkVMs-benchmarks-ea504096df8e92eb224408b65ed0d7031fc3f402.tar
zkVMs-benchmarks-ea504096df8e92eb224408b65ed0d7031fc3f402.tar.gz
zkVMs-benchmarks-ea504096df8e92eb224408b65ed0d7031fc3f402.zip
feat(guests_macro/parse_fn): Fix args split with composite angled bracket types
Types like HashMap<Key, Value>, i.e. with commas inside the angled brackets
Diffstat (limited to 'guests_macro/src')
-rw-r--r--guests_macro/src/parse_fn.rs22
1 files changed, 15 insertions, 7 deletions
diff --git a/guests_macro/src/parse_fn.rs b/guests_macro/src/parse_fn.rs
index 535d27f..c5006a8 100644
--- a/guests_macro/src/parse_fn.rs
+++ b/guests_macro/src/parse_fn.rs
@@ -52,19 +52,24 @@ pub fn args_split(item: &TokenStream) -> Vec<TokenStream> {
contents = group.stream().into_iter();
}
else {
- unreachable!();
+ unreachable!("Item passed to args_split is not a group: \"{item}\"");
}
let mut args = Vec::new();
let mut ts = TokenStream::new();
+ let mut angle_level = 0;
for tt in contents {
match tt {
- TokenTree::Punct(ref punct) =>
- if punct.as_char() == ',' {
- args.push(ts);
- ts = TokenStream::new();
- continue;
+ TokenTree::Punct(ref punct) => match punct.as_char() {
+ '<' => angle_level += 1,
+ '>' => angle_level -= 1,
+ ',' => if angle_level == 0 {
+ args.push(ts);
+ ts = TokenStream::new();
+ continue;
+ },
+ _ => {},
},
_ => {},
}
@@ -109,6 +114,7 @@ pub fn args_divide(item: &TokenStream) -> (Vec<TokenStream>, Vec<TokenStream>) {
let mut types = Vec::new();
let mut ts = TokenStream::new();
let mut ignore_next = false;
+ let mut angle_level = 0;
for tt in contents {
match tt {
@@ -118,12 +124,14 @@ pub fn args_divide(item: &TokenStream) -> (Vec<TokenStream>, Vec<TokenStream>) {
}
else if !ignore_next {
match punct.as_char() {
+ '<' => angle_level += 1,
+ '>' => angle_level -= 1,
':' => {
patterns.push(ts);
ts = TokenStream::new();
continue;
},
- ',' => {
+ ',' => if angle_level == 0 {
types.push(ts);
ts = TokenStream::new();
continue;