Skip to content
This repository has been archived by the owner on Mar 4, 2024. It is now read-only.

Commit

Permalink
Extend @default-return value to allow blocks
Browse files Browse the repository at this point in the history
  • Loading branch information
GuillaumeGomez committed Nov 9, 2020
1 parent aeaa5ec commit bd0d9c7
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 30 deletions.
53 changes: 23 additions & 30 deletions glib-macros/src/clone.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)]
Expand Down Expand Up @@ -319,6 +319,25 @@ fn parse_ident(parts: &mut Peekable<ProcIter>, elements: &mut Vec<ElemToClone>)
});
}

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<ProcIter>) -> String {
let mut ret = String::new();
let mut total = 0;
Expand All @@ -331,7 +350,7 @@ fn get_expr(parts: &mut Peekable<ProcIter>) -> 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 {
Expand All @@ -347,21 +366,7 @@ fn get_expr(parts: &mut Peekable<ProcIter>) -> 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;
Expand Down Expand Up @@ -484,19 +489,7 @@ pub fn tokens_to_string(mut parts: Peekable<ProcIter>) -> 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));
}
}
}
Expand Down
2 changes: 2 additions & 0 deletions glib/tests/clone.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down

0 comments on commit bd0d9c7

Please # to comment.