Skip to content

Commit f9aa206

Browse files
authored
Merge pull request #1786 from dtolnay/fieldcall
Fix parenthesization of field expressions in function calls
2 parents 1cf735e + 1445ccf commit f9aa206

File tree

2 files changed

+17
-20
lines changed

2 files changed

+17
-20
lines changed

src/expr.rs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1036,6 +1036,16 @@ impl IdentFragment for Member {
10361036
}
10371037
}
10381038

1039+
#[cfg(any(feature = "parsing", feature = "printing"))]
1040+
impl Member {
1041+
pub(crate) fn is_named(&self) -> bool {
1042+
match self {
1043+
Member::Named(_) => true,
1044+
Member::Unnamed(_) => false,
1045+
}
1046+
}
1047+
}
1048+
10391049
ast_struct! {
10401050
/// The index of an unnamed tuple struct field.
10411051
#[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))]
@@ -3021,15 +3031,6 @@ pub(crate) mod parsing {
30213031
Ok(!trailing_dot)
30223032
}
30233033

3024-
impl Member {
3025-
pub(crate) fn is_named(&self) -> bool {
3026-
match self {
3027-
Member::Named(_) => true,
3028-
Member::Unnamed(_) => false,
3029-
}
3030-
}
3031-
}
3032-
30333034
#[cfg(feature = "full")]
30343035
#[cfg_attr(docsrs, doc(cfg(feature = "parsing")))]
30353036
impl Parse for PointerMutability {
@@ -3405,22 +3406,17 @@ pub(crate) mod printing {
34053406
fn print_expr_call(e: &ExprCall, tokens: &mut TokenStream, fixup: FixupContext) {
34063407
outer_attrs_to_tokens(&e.attrs, tokens);
34073408

3408-
let call_precedence = if let Expr::Field(_) = &*e.func {
3409-
Precedence::MIN
3410-
} else {
3411-
Precedence::Unambiguous
3412-
};
34133409
let func_fixup = fixup.leftmost_subexpression_with_begin_operator(
34143410
#[cfg(feature = "full")]
34153411
true,
34163412
false,
34173413
);
3418-
print_subexpression(
3419-
&e.func,
3420-
func_fixup.leading_precedence(&e.func) < call_precedence,
3421-
tokens,
3422-
func_fixup,
3423-
);
3414+
let needs_group = if let Expr::Field(func) = &*e.func {
3415+
func.member.is_named()
3416+
} else {
3417+
func_fixup.leading_precedence(&e.func) < Precedence::Unambiguous
3418+
};
3419+
print_subexpression(&e.func, needs_group, tokens, func_fixup);
34243420

34253421
e.paren_token.surround(tokens, |tokens| {
34263422
e.args.to_tokens(tokens);

tests/test_expr.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,7 @@ fn test_fixup() {
703703
quote! { (1 < 2) == (3 < 4) },
704704
quote! { { (let _ = ()) } },
705705
quote! { (#[attr] thing).field },
706+
quote! { (self.f)() },
706707
] {
707708
let original: Expr = syn::parse2(tokens).unwrap();
708709

0 commit comments

Comments
 (0)