diff options
| author | Kamen Mladenov <kamen@syndamia.com> | 2025-02-05 12:33:32 +0200 |
|---|---|---|
| committer | Kamen Mladenov <kamen@syndamia.com> | 2025-02-05 12:33:32 +0200 |
| commit | ea504096df8e92eb224408b65ed0d7031fc3f402 (patch) | |
| tree | 040b18a6c37d6a9cec8b358986dc9efef0f04469 | |
| parent | 8b930aaea3fd937ade4b4828a7dd666c4a5c949c (diff) | |
| download | zkVMs-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
| -rw-r--r-- | guests_macro/src/parse_fn.rs | 22 |
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; |
