From ea504096df8e92eb224408b65ed0d7031fc3f402 Mon Sep 17 00:00:00 2001 From: Kamen Mladenov Date: Wed, 5 Feb 2025 12:33:32 +0200 Subject: feat(guests_macro/parse_fn): Fix args split with composite angled bracket types Types like HashMap, i.e. with commas inside the angled brackets --- guests_macro/src/parse_fn.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'guests_macro/src') 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 { 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, Vec) { 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, Vec) { } 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; -- cgit v1.2.3