Skip to content

Commit 1ce8ccf

Browse files
authored
Merge pull request #1538 from dtolnay/testinvisible
Add test for parsing Delimiter::None in expressions
2 parents 9ec66d4 + d06bff8 commit 1ce8ccf

File tree

1 file changed

+64
-4
lines changed

1 file changed

+64
-4
lines changed

tests/test_precedence.rs

Lines changed: 64 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
"\nFAIL {} - 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+
"\nFAIL {} - 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.
447507
fn collect_exprs(file: syn::File) -> Vec<syn::Expr> {
448508
use syn::fold::Fold;

0 commit comments

Comments
 (0)