Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 630f31c

Browse files
committed
fix conflict with matches macro
1 parent 9e535f6 commit 630f31c

File tree

2 files changed

+133
-136
lines changed

2 files changed

+133
-136
lines changed

clippy_lints/src/matches/match_like_matches.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,12 @@ fn find_bool_lit(ex: &ExprKind<'_>) -> Option<bool> {
183183

184184
fn is_some(path_kind: PatKind<'_>) -> bool {
185185
match path_kind {
186-
PatKind::TupleStruct(ref path_left, patterns, _) if is_wild(&patterns[0]) => match path_left {
187-
QPath::Resolved(_, path) => {
188-
let name = path.segments[0].ident;
189-
if name.as_str() == "Some" {
190-
return true;
191-
}
192-
return false;
193-
},
194-
_ => false,
186+
PatKind::TupleStruct(QPath::Resolved(_, path), patterns, _) if is_wild(&patterns[0]) => {
187+
let name = path.segments[0].ident;
188+
if name.as_str() == "Some" {
189+
return true;
190+
}
191+
false
195192
},
196193
_ => false,
197194
}

clippy_lints/src/matches/redundant_pattern_match.rs

Lines changed: 127 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -188,132 +188,7 @@ fn find_sugg_for_if_let<'tcx>(
188188
pub(super) fn check_match<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, op: &Expr<'_>, arms: &[Arm<'_>]) {
189189
if arms.len() == 2 {
190190
let node_pair = (&arms[0].pat.kind, &arms[1].pat.kind);
191-
let found_good_method = match node_pair {
192-
(
193-
PatKind::TupleStruct(ref path_left, patterns_left, _),
194-
PatKind::TupleStruct(ref path_right, patterns_right, _),
195-
) if patterns_left.len() == 1 && patterns_right.len() == 1 => {
196-
if let (PatKind::Wild, PatKind::Wild) = (&patterns_left[0].kind, &patterns_right[0].kind) {
197-
find_good_method_for_match(
198-
cx,
199-
arms,
200-
path_left,
201-
path_right,
202-
Item::Lang(ResultOk),
203-
Item::Lang(ResultErr),
204-
"is_ok()",
205-
"is_err()",
206-
)
207-
.or_else(|| {
208-
find_good_method_for_match(
209-
cx,
210-
arms,
211-
path_left,
212-
path_right,
213-
Item::Diag(sym::IpAddr, sym!(V4)),
214-
Item::Diag(sym::IpAddr, sym!(V6)),
215-
"is_ipv4()",
216-
"is_ipv6()",
217-
)
218-
})
219-
} else {
220-
None
221-
}
222-
},
223-
(PatKind::TupleStruct(ref path_left, patterns, _), PatKind::Path(ref path_right))
224-
| (PatKind::Path(ref path_left), PatKind::TupleStruct(ref path_right, patterns, _))
225-
if patterns.len() == 1 =>
226-
{
227-
if let PatKind::Wild = patterns[0].kind {
228-
find_good_method_for_match(
229-
cx,
230-
arms,
231-
path_left,
232-
path_right,
233-
Item::Lang(OptionSome),
234-
Item::Lang(OptionNone),
235-
"is_some()",
236-
"is_none()",
237-
)
238-
.or_else(|| {
239-
find_good_method_for_match(
240-
cx,
241-
arms,
242-
path_left,
243-
path_right,
244-
Item::Lang(PollReady),
245-
Item::Lang(PollPending),
246-
"is_ready()",
247-
"is_pending()",
248-
)
249-
})
250-
} else {
251-
None
252-
}
253-
},
254-
(PatKind::TupleStruct(ref path_left, patterns, _), PatKind::Wild) if patterns.len() == 1 => {
255-
if let PatKind::Wild = patterns[0].kind {
256-
let ident = match path_left {
257-
QPath::Resolved(_, path) => {
258-
let name = path.segments[0].ident;
259-
Some(name)
260-
},
261-
_ => None,
262-
};
263-
if let Some(name) = ident {
264-
match name.as_str() {
265-
"Ok" => find_good_method_for_matches_macro(
266-
cx,
267-
arms,
268-
path_left,
269-
Item::Lang(ResultOk),
270-
"is_ok()",
271-
"is_err()",
272-
),
273-
"Some" => find_good_method_for_matches_macro(
274-
cx,
275-
arms,
276-
path_left,
277-
Item::Lang(OptionSome),
278-
"is_some()",
279-
"is_none()",
280-
),
281-
_ => None,
282-
}
283-
} else {
284-
None
285-
}
286-
} else {
287-
None
288-
}
289-
},
290-
(PatKind::Path(ref path_left), PatKind::Wild) => {
291-
let ident = match path_left {
292-
QPath::Resolved(_, path) => {
293-
let name = path.segments[0].ident;
294-
Some(name)
295-
},
296-
_ => None,
297-
};
298-
299-
if let Some(name) = ident {
300-
match name.as_str() {
301-
"None" => find_good_method_for_matches_macro(
302-
cx,
303-
arms,
304-
path_left,
305-
Item::Lang(OptionNone),
306-
"is_none()",
307-
"is_some()",
308-
),
309-
_ => None,
310-
}
311-
} else {
312-
None
313-
}
314-
},
315-
_ => None,
316-
};
191+
let found_good_method = found_good_method(cx, arms, node_pair);
317192

318193
if let Some(good_method) = found_good_method {
319194
let span = expr.span.to(op.span);
@@ -339,6 +214,132 @@ pub(super) fn check_match<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>, op
339214
}
340215
}
341216

217+
fn found_good_method<'a>(
218+
cx: &LateContext<'_>,
219+
arms: &[Arm<'_>],
220+
node: (&PatKind<'_>, &PatKind<'_>),
221+
) -> Option<&'a str> {
222+
match node {
223+
(
224+
PatKind::TupleStruct(ref path_left, patterns_left, _),
225+
PatKind::TupleStruct(ref path_right, patterns_right, _),
226+
) if patterns_left.len() == 1 && patterns_right.len() == 1 => {
227+
if let (PatKind::Wild, PatKind::Wild) = (&patterns_left[0].kind, &patterns_right[0].kind) {
228+
find_good_method_for_match(
229+
cx,
230+
arms,
231+
path_left,
232+
path_right,
233+
Item::Lang(ResultOk),
234+
Item::Lang(ResultErr),
235+
"is_ok()",
236+
"is_err()",
237+
)
238+
.or_else(|| {
239+
find_good_method_for_match(
240+
cx,
241+
arms,
242+
path_left,
243+
path_right,
244+
Item::Diag(sym::IpAddr, sym!(V4)),
245+
Item::Diag(sym::IpAddr, sym!(V6)),
246+
"is_ipv4()",
247+
"is_ipv6()",
248+
)
249+
})
250+
} else {
251+
None
252+
}
253+
},
254+
(PatKind::TupleStruct(ref path_left, patterns, _), PatKind::Path(ref path_right))
255+
| (PatKind::Path(ref path_left), PatKind::TupleStruct(ref path_right, patterns, _))
256+
if patterns.len() == 1 =>
257+
{
258+
if let PatKind::Wild = patterns[0].kind {
259+
find_good_method_for_match(
260+
cx,
261+
arms,
262+
path_left,
263+
path_right,
264+
Item::Lang(OptionSome),
265+
Item::Lang(OptionNone),
266+
"is_some()",
267+
"is_none()",
268+
)
269+
.or_else(|| {
270+
find_good_method_for_match(
271+
cx,
272+
arms,
273+
path_left,
274+
path_right,
275+
Item::Lang(PollReady),
276+
Item::Lang(PollPending),
277+
"is_ready()",
278+
"is_pending()",
279+
)
280+
})
281+
} else {
282+
None
283+
}
284+
},
285+
(PatKind::TupleStruct(ref path_left, patterns, _), PatKind::Wild) if patterns.len() == 1 => {
286+
if let PatKind::Wild = patterns[0].kind {
287+
get_good_method(cx, arms, path_left)
288+
} else {
289+
None
290+
}
291+
},
292+
(PatKind::Path(ref path_left), PatKind::Wild) => {
293+
if let Some(name) = get_ident(path_left) {
294+
match name.as_str() {
295+
"None" => find_good_method_for_matches_macro(
296+
cx,
297+
arms,
298+
path_left,
299+
Item::Lang(OptionNone),
300+
"is_none()",
301+
"is_some()",
302+
),
303+
_ => None,
304+
}
305+
} else {
306+
None
307+
}
308+
},
309+
_ => None,
310+
}
311+
}
312+
313+
fn get_ident(path: &QPath<'_>) -> Option<rustc_span::symbol::Ident> {
314+
match path {
315+
QPath::Resolved(_, path) => {
316+
let name = path.segments[0].ident;
317+
Some(name)
318+
},
319+
_ => None,
320+
}
321+
}
322+
323+
fn get_good_method<'a>(cx: &LateContext<'_>, arms: &[Arm<'_>], path_left: &QPath<'_>) -> Option<&'a str> {
324+
if let Some(name) = get_ident(path_left) {
325+
return match name.as_str() {
326+
"Ok" => {
327+
find_good_method_for_matches_macro(cx, arms, path_left, Item::Lang(ResultOk), "is_ok()", "is_err()")
328+
},
329+
"Some" => find_good_method_for_matches_macro(
330+
cx,
331+
arms,
332+
path_left,
333+
Item::Lang(OptionSome),
334+
"is_some()",
335+
"is_none()",
336+
),
337+
_ => None,
338+
};
339+
}
340+
None
341+
}
342+
342343
#[derive(Clone, Copy)]
343344
enum Item {
344345
Lang(LangItem),
@@ -406,7 +407,6 @@ fn find_good_method_for_match<'a>(
406407
}
407408
}
408409

409-
#[expect(clippy::too_many_arguments)]
410410
fn find_good_method_for_matches_macro<'a>(
411411
cx: &LateContext<'_>,
412412
arms: &[Arm<'_>],

0 commit comments

Comments
 (0)