@@ -128,7 +128,8 @@ fn test_expressions(path: &Path, edition: Edition, exprs: Vec<syn::Expr>) -> (us
128128 continue ;
129129 } ;
130130
131- let syn_parenthesized_code = syn_parenthesize ( expr) . to_token_stream ( ) . to_string ( ) ;
131+ let syn_parenthesized_code =
132+ syn_parenthesize ( expr. clone ( ) ) . to_token_stream ( ) . to_string ( ) ;
132133 let syn_ast = if let Some ( e) = parse:: librustc_expr ( & syn_parenthesized_code) {
133134 e
134135 } else {
@@ -140,9 +141,7 @@ fn test_expressions(path: &Path, edition: Edition, exprs: Vec<syn::Expr>) -> (us
140141 continue ;
141142 } ;
142143
143- if SpanlessEq :: eq ( & syn_ast, & librustc_ast) {
144- passed += 1 ;
145- } else {
144+ if !SpanlessEq :: eq ( & syn_ast, & librustc_ast) {
146145 failed += 1 ;
147146 let syn_pretty = pprust:: expr_to_string ( & syn_ast) ;
148147 let librustc_pretty = pprust:: expr_to_string ( & librustc_ast) ;
@@ -152,7 +151,30 @@ fn test_expressions(path: &Path, edition: Edition, exprs: Vec<syn::Expr>) -> (us
152151 syn_pretty,
153152 librustc_pretty,
154153 ) ;
154+ continue ;
155+ }
156+
157+ let expr_invisible = make_parens_invisible ( expr) ;
158+ let Ok ( reparsed_expr_invisible) = syn:: parse2 ( expr_invisible. to_token_stream ( ) ) else {
159+ failed += 1 ;
160+ errorf ! (
161+ "\n FAIL {} - syn failed to parse invisible delimiters\n {}\n " ,
162+ path. display( ) ,
163+ source_code,
164+ ) ;
165+ continue ;
166+ } ;
167+ if expr_invisible != reparsed_expr_invisible {
168+ failed += 1 ;
169+ errorf ! (
170+ "\n FAIL {} - mismatch after parsing invisible delimiters\n {}\n " ,
171+ path. display( ) ,
172+ source_code,
173+ ) ;
174+ continue ;
155175 }
176+
177+ passed += 1 ;
156178 }
157179 } ) ;
158180
@@ -443,6 +465,44 @@ fn syn_parenthesize(syn_expr: syn::Expr) -> syn::Expr {
443465 folder. fold_expr ( syn_expr)
444466}
445467
468+ fn make_parens_invisible ( expr : syn:: Expr ) -> syn:: Expr {
469+ use syn:: fold:: { fold_expr, fold_stmt, Fold } ;
470+ use syn:: { token, Expr , ExprGroup , ExprParen , Stmt } ;
471+
472+ struct MakeParensInvisible ;
473+
474+ impl Fold for MakeParensInvisible {
475+ fn fold_expr ( & mut self , mut expr : Expr ) -> Expr {
476+ if let Expr :: Paren ( paren) = expr {
477+ expr = Expr :: Group ( ExprGroup {
478+ attrs : paren. attrs ,
479+ group_token : token:: Group ( paren. paren_token . span . join ( ) ) ,
480+ expr : paren. expr ,
481+ } ) ;
482+ }
483+ fold_expr ( self , expr)
484+ }
485+
486+ fn fold_stmt ( & mut self , stmt : Stmt ) -> Stmt {
487+ if let Stmt :: Expr ( expr @ ( Expr :: Binary ( _) | Expr :: Cast ( _) ) , None ) = stmt {
488+ Stmt :: Expr (
489+ Expr :: Paren ( ExprParen {
490+ attrs : Vec :: new ( ) ,
491+ paren_token : token:: Paren :: default ( ) ,
492+ expr : Box :: new ( fold_expr ( self , expr) ) ,
493+ } ) ,
494+ None ,
495+ )
496+ } else {
497+ fold_stmt ( self , stmt)
498+ }
499+ }
500+ }
501+
502+ let mut folder = MakeParensInvisible ;
503+ folder. fold_expr ( expr)
504+ }
505+
446506/// Walk through a crate collecting all expressions we can find in it.
447507fn collect_exprs ( file : syn:: File ) -> Vec < syn:: Expr > {
448508 use syn:: fold:: Fold ;
0 commit comments