@@ -220,20 +220,47 @@ fn parse_fields(input: TokenStream) -> Result<Vec<Field>, MacroError> {
220220
221221fn parse_field ( mut buffer : & [ TokenTree ] ) -> Result < Field , MacroError > {
222222 let mut skip = false ;
223+ let mut substitution = None ;
223224 if matches ! ( & buffer[ 0 ] , TT :: Punct ( c) if c. as_char( ) == '#' ) {
224225 if let TT :: Group ( attribute_group) = & buffer[ 1 ] {
225226 for a in chunked ( attribute_group. stream ( ) , 2 ) {
226- let [ name, group ] = & a[ ..] else {
227+ let [ name, group_tt ] = & a[ ..] else {
227228 unreachable ! ( )
228229 } ;
229230 if matches ! ( name, TT :: Ident ( s) if s. to_string( ) == "quicksilver" ) {
230- let TT :: Group ( group) = group else {
231- panic ! ( "Expected group ." )
231+ let TT :: Group ( group) = group_tt else {
232+ error_single ! ( group_tt , "Expected TokenTree::Group ." )
232233 } ;
233- for attr in group. stream ( ) {
234- if matches ! ( attr, TT :: Ident ( s) if s. to_string( ) == "skip" ) {
234+ // dbg!(&group);
235+ let mut it = group. stream ( ) . into_iter ( ) ;
236+ match ( it. next ( ) , it. next ( ) ) {
237+ ( Some ( TT :: Ident ( s) ) , None ) if s. to_string ( ) == "skip" => {
235238 skip = true ;
236239 }
240+ ( Some ( TT :: Ident ( p) ) , Some ( ref proxy_tt @ TT :: Group ( ref subst_group) ) )
241+ if p. to_string ( ) == "proxy" =>
242+ {
243+ let mut it = subst_group. stream ( ) . into_iter ( ) ;
244+ match ( it. next ( ) , it. next ( ) , it. next ( ) , it. next ( ) ) {
245+ (
246+ Some ( TT :: Ident ( from) ) ,
247+ Some ( TT :: Punct ( c) ) ,
248+ Some ( TT :: Ident ( to) ) ,
249+ None ,
250+ ) if c. as_char ( ) == ',' => {
251+ substitution = Some ( ( from. to_string ( ) , to. to_string ( ) ) ) ;
252+ }
253+ _ => {
254+ error_single ! (
255+ & proxy_tt,
256+ "Wrong arguments for proxy atttribute."
257+ )
258+ }
259+ }
260+ }
261+ _ => {
262+ error_single ! ( group_tt, "Unknown attribute" ) ;
263+ }
237264 }
238265 }
239266 }
@@ -243,15 +270,15 @@ fn parse_field(mut buffer: &[TokenTree]) -> Result<Field, MacroError> {
243270
244271 let mut iter = buffer. iter ( ) ;
245272
246- match ( iter. next ( ) , iter. next ( ) , iter. next ( ) ) {
273+ let mut r = match ( iter. next ( ) , iter. next ( ) , iter. next ( ) ) {
247274 ( Some ( TT :: Ident ( ty) ) , None , None ) => {
248275 let name = None ;
249276 let mirror = parse_mirror ( & buffer, & ty. to_string ( ) , skip) ?;
250- Ok ( Field {
277+ Field {
251278 name,
252279 mirror,
253280 ty : ty. to_string ( ) ,
254- } )
281+ }
255282 }
256283 ( Some ( TT :: Ident ( name) ) , Some ( TT :: Punct ( colon) ) , Some ( TT :: Ident ( ty) ) )
257284 if colon. as_char ( ) == ':' =>
@@ -264,7 +291,7 @@ fn parse_field(mut buffer: &[TokenTree]) -> Result<Field, MacroError> {
264291 . map ( |it| it. to_string ( ) )
265292 . collect :: < Vec < _ > > ( )
266293 . join ( "" ) ;
267- Ok ( Field { name, mirror, ty } )
294+ Field { name, mirror, ty }
268295 }
269296 ( Some ( TT :: Ident ( ty) ) , Some ( TT :: Punct ( stair) ) , Some ( _) ) if stair. as_char ( ) == '<' => {
270297 let name = None ;
@@ -274,15 +301,24 @@ fn parse_field(mut buffer: &[TokenTree]) -> Result<Field, MacroError> {
274301 . map ( |it| it. to_string ( ) )
275302 . collect :: < Vec < _ > > ( )
276303 . join ( "" ) ;
277- Ok ( Field { name, mirror, ty } )
304+ Field { name, mirror, ty }
278305 }
279306 _ => {
280307 error ! (
281308 & [ buffer[ 0 ] . clone( ) , buffer. last( ) . unwrap( ) . clone( ) ] ,
282309 "Quicksilver can't parse this."
283310 )
284311 }
312+ } ;
313+
314+ if let Some ( ( from, to) ) = substitution {
315+ if let Some ( ref mut name) = r. name {
316+ * name = name. replace ( & from, & to) ;
317+ }
318+ r. mirror = r. mirror . replace ( & from, & to) ;
285319 }
320+
321+ Ok ( r)
286322}
287323
288324fn parse_mirror ( buffer : & [ TokenTree ] , ty : & str , skip : bool ) -> Result < String , MacroError > {
0 commit comments