@@ -311,34 +311,35 @@ fn include_references(initial_element: &ast::Expr) -> (ast::Expr, String) {
311311
312312 let mut prefix = String :: new ( ) ;
313313
314+ let mut found_ref_or_deref = false ;
315+
314316 while let Some ( parent_deref_element) =
315317 resulting_element. syntax ( ) . parent ( ) . and_then ( ast:: PrefixExpr :: cast)
316318 {
317319 if parent_deref_element. op_kind ( ) != Some ( ast:: UnaryOp :: Deref ) {
318320 break ;
319321 }
320322
323+ found_ref_or_deref = true ;
321324 resulting_element = ast:: Expr :: from ( parent_deref_element) ;
322325
323326 prefix. insert ( 0 , '*' ) ;
324327 }
325328
326- if let Some ( first_ref_expr) = resulting_element. syntax ( ) . parent ( ) . and_then ( ast:: RefExpr :: cast) {
327- if let Some ( expr) = first_ref_expr. expr ( ) {
328- resulting_element = expr;
329- }
329+ while let Some ( parent_ref_element) =
330+ resulting_element. syntax ( ) . parent ( ) . and_then ( ast:: RefExpr :: cast)
331+ {
332+ found_ref_or_deref = true ;
333+ let exclusive = parent_ref_element. mut_token ( ) . is_some ( ) ;
334+ resulting_element = ast:: Expr :: from ( parent_ref_element) ;
330335
331- while let Some ( parent_ref_element) =
332- resulting_element. syntax ( ) . parent ( ) . and_then ( ast:: RefExpr :: cast)
333- {
334- let exclusive = parent_ref_element. mut_token ( ) . is_some ( ) ;
335- resulting_element = ast:: Expr :: from ( parent_ref_element) ;
336+ prefix. insert_str ( 0 , if exclusive { "&mut " } else { "&" } ) ;
337+ }
336338
337- prefix. insert_str ( 0 , if exclusive { "&mut " } else { "&" } ) ;
338- }
339- } else {
340- // If we do not find any ref expressions, restore
339+ if !found_ref_or_deref {
340+ // If we do not find any ref/deref expressions, restore
341341 // all the progress of tree climbing
342+ prefix. clear ( ) ;
342343 resulting_element = initial_element. clone ( ) ;
343344 }
344345
0 commit comments