From bd0d9c708d86977b34481ede448df01de51e12e5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 9 Nov 2020 22:28:40 +0100 Subject: [PATCH] Extend @default-return value to allow blocks --- glib-macros/src/clone.rs | 53 +++++++++++++++++----------------------- glib/tests/clone.rs | 2 ++ 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/glib-macros/src/clone.rs b/glib-macros/src/clone.rs index 3929331b69e1..5cf90f074e7e 100644 --- a/glib-macros/src/clone.rs +++ b/glib-macros/src/clone.rs @@ -4,7 +4,7 @@ use crate::utils::crate_ident_new; use proc_macro::token_stream::IntoIter as ProcIter; -use proc_macro::{Delimiter, TokenStream, TokenTree}; +use proc_macro::{Delimiter, Group, TokenStream, TokenTree}; use std::iter::Peekable; #[derive(Clone, Copy, Debug)] @@ -319,6 +319,25 @@ fn parse_ident(parts: &mut Peekable, elements: &mut Vec) }); } +fn group_to_string(g: &Group) -> String { + format!( + "{}{}{}", + match g.delimiter() { + Delimiter::Parenthesis => "(", + Delimiter::Brace => "{", + Delimiter::Bracket => "[", + Delimiter::None => "", + }, + tokens_to_string(g.stream().into_iter().peekable()), + match g.delimiter() { + Delimiter::Parenthesis => ")", + Delimiter::Brace => "}", + Delimiter::Bracket => "]", + Delimiter::None => "", + }, + ) +} + fn get_expr(parts: &mut Peekable) -> String { let mut ret = String::new(); let mut total = 0; @@ -331,7 +350,7 @@ fn get_expr(parts: &mut Peekable) -> String { } x => panic!("Unexpected token `{}` after `@default-return`", x), }, - Some(x) => panic!("Unexpected token `{}` after `@default-return", x), + Some(TokenTree::Group(g)) => return group_to_string(&g), None => panic!("Unexpected end after `@default-return`"), }; loop { @@ -347,21 +366,7 @@ fn get_expr(parts: &mut Peekable) -> String { } ret.push_str(&p_s); } - Some(TokenTree::Group(g)) => { - ret.push_str(match g.delimiter() { - Delimiter::Parenthesis => "(", - Delimiter::Brace => "{", - Delimiter::Bracket => "[", - Delimiter::None => "", - }); - ret.push_str(&tokens_to_string(g.stream().into_iter().peekable())); - ret.push_str(match g.delimiter() { - Delimiter::Parenthesis => ")", - Delimiter::Brace => "}", - Delimiter::Bracket => "]", - Delimiter::None => "", - }); - } + Some(TokenTree::Group(g)) => ret.push_str(&group_to_string(g)), Some(x) => { if total == 0 && !ret.ends_with(":") { return ret; @@ -484,19 +489,7 @@ pub fn tokens_to_string(mut parts: Peekable) -> String { TokenTree::Literal(l) => handle_ident_like(l.to_string(), &mut ret, &mut prev_is_ident), TokenTree::Group(g) => { prev_is_ident = false; - ret.push_str(match g.delimiter() { - Delimiter::Parenthesis => "(", - Delimiter::Brace => "{", - Delimiter::Bracket => "[", - Delimiter::None => "", - }); - ret.push_str(&tokens_to_string(g.stream().into_iter().peekable())); - ret.push_str(match g.delimiter() { - Delimiter::Parenthesis => ")", - Delimiter::Brace => "}", - Delimiter::Bracket => "]", - Delimiter::None => "", - }); + ret.push_str(&group_to_string(&g)); } } } diff --git a/glib/tests/clone.rs b/glib/tests/clone.rs index 1526dce9f616..7e2d37e3c695 100644 --- a/glib/tests/clone.rs +++ b/glib/tests/clone.rs @@ -467,6 +467,8 @@ fn test_clone_macro_default_return() { let _closure = clone!(@weak v => @default-return Enum::A, move || { Enum::A }); let _closure = clone!(@weak v => @default-return Enum::B(0), move || { Enum::A }); let _closure = clone!(@weak v => @default-return Enum::C { x: 0 }, move || { Enum::A }); + let _closure = + clone!(@weak v => @default-return { let x = 12; x + 2 }, move || { 19 }); } #[test]