Skip to content

Commit a6ce268

Browse files
committed
Fix clippy not compiling with new FieldDef
1 parent 7cec0d7 commit a6ce268

File tree

3 files changed

+30
-9
lines changed

3 files changed

+30
-9
lines changed

src/tools/clippy/clippy_lints/src/excessive_bools.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use clippy_utils::diagnostics::span_lint_and_help;
22
use clippy_utils::{in_macro, match_path_ast};
3-
use rustc_ast::ast::{AssocItemKind, Extern, FnKind, FnSig, ImplKind, Item, ItemKind, TraitKind, Ty, TyKind};
3+
use rustc_ast::ast::{AssocItemKind, Extern, FnKind, FnSig, ImplKind, Item, ItemKind, TraitKind, Ty, TyKind, FieldVariant, NamedField};
44
use rustc_lint::{EarlyContext, EarlyLintPass};
55
use rustc_session::{declare_tool_lint, impl_lint_pass};
66
use rustc_span::{sym, Span};
@@ -145,7 +145,11 @@ impl EarlyLintPass for ExcessiveBools {
145145
let struct_bools = variant_data
146146
.fields()
147147
.iter()
148-
.filter(|field| is_bool_ty(&field.ty))
148+
.filter(|field| match &field.variant {
149+
FieldVariant::Named(NamedField{ty, ident:_}) if is_bool_ty(ty) => true,
150+
// FIXME: Handle Unnamed variant
151+
_ => false
152+
})
149153
.count()
150154
.try_into()
151155
.unwrap();

src/tools/clippy/clippy_lints/src/manual_non_exhaustive.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use clippy_utils::diagnostics::span_lint_and_then;
33
use clippy_utils::meets_msrv;
44
use clippy_utils::source::snippet_opt;
55
use if_chain::if_chain;
6-
use rustc_ast::ast::{FieldDef, Item, ItemKind, Variant, VariantData, VisibilityKind};
6+
use rustc_ast::ast::{FieldDef, Item, ItemKind, Variant, VariantData, VisibilityKind, FieldVariant, NamedField};
77
use rustc_errors::Applicability;
88
use rustc_lint::{EarlyContext, EarlyLintPass};
99
use rustc_semver::RustcVersion;
@@ -141,7 +141,12 @@ fn check_manual_non_exhaustive_struct(cx: &EarlyContext<'_>, item: &Item, data:
141141
}
142142

143143
fn is_non_exhaustive_marker(field: &FieldDef) -> bool {
144-
is_private(field) && field.ty.kind.is_unit() && field.ident.map_or(true, |n| n.as_str().starts_with('_'))
144+
match &field.variant {
145+
FieldVariant::Named(NamedField{ty, ident}) =>
146+
is_private(field) && ty.kind.is_unit() && ident.map_or(true, |n| n.as_str().starts_with('_')),
147+
// FIXME: Handle Unnamed variant
148+
_ => false
149+
}
145150
}
146151

147152
fn find_header_span(cx: &EarlyContext<'_>, item: &Item, data: &VariantData) -> Span {

src/tools/clippy/clippy_utils/src/ast_utils.rs

+17-5
Original file line numberDiff line numberDiff line change
@@ -362,11 +362,23 @@ pub fn eq_variant_data(l: &VariantData, r: &VariantData) -> bool {
362362
}
363363

364364
pub fn eq_struct_field(l: &FieldDef, r: &FieldDef) -> bool {
365-
l.is_placeholder == r.is_placeholder
366-
&& over(&l.attrs, &r.attrs, |l, r| eq_attr(l, r))
367-
&& eq_vis(&l.vis, &r.vis)
368-
&& both(&l.ident, &r.ident, |l, r| eq_id(*l, *r))
369-
&& eq_ty(&l.ty, &r.ty)
365+
if l.is_placeholder != r.is_placeholder
366+
|| !over(&l.attrs, &r.attrs, |l, r| eq_attr(l, r))
367+
|| !eq_vis(&l.vis, &r.vis)
368+
{
369+
false
370+
} else {
371+
match (&l.variant, &r.variant) {
372+
(FieldVariant::Named(NamedField{ident: l_ident, ty: l_ty}),
373+
FieldVariant::Named(NamedField{ident: r_ident, ty: r_ty})) =>
374+
both(l_ident, r_ident, |l, r| eq_id(*l, *r))
375+
&& eq_ty(l_ty, r_ty),
376+
// FIXME: Compare two unnamed fields and check for equality
377+
(FieldVariant::Unnamed(_),
378+
FieldVariant::Named(_)) => false,
379+
_ => false
380+
}
381+
}
370382
}
371383

372384
pub fn eq_fn_sig(l: &FnSig, r: &FnSig) -> bool {

0 commit comments

Comments
 (0)