Skip to content

Commit 088f07a

Browse files
Represent TraitBoundModifiers as distinct parts in HIR
1 parent 78fc7bb commit 088f07a

File tree

4 files changed

+26
-14
lines changed

4 files changed

+26
-14
lines changed

clippy_lints/src/implied_bounds_in_impls.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use clippy_utils::source::snippet;
33
use rustc_errors::{Applicability, SuggestionStyle};
44
use rustc_hir::def_id::DefId;
55
use rustc_hir::{
6-
AssocItemConstraint, GenericArg, GenericBound, GenericBounds, PredicateOrigin, TraitBoundModifier, TyKind,
6+
AssocItemConstraint, GenericArg, GenericBound, GenericBounds, PredicateOrigin, TraitBoundModifiers, TyKind,
77
WherePredicate,
88
};
99
use rustc_hir_analysis::lower_ty;
@@ -234,7 +234,7 @@ fn collect_supertrait_bounds<'tcx>(cx: &LateContext<'tcx>, bounds: GenericBounds
234234
.iter()
235235
.filter_map(|bound| {
236236
if let GenericBound::Trait(poly_trait) = bound
237-
&& let TraitBoundModifier::None = poly_trait.modifiers
237+
&& let TraitBoundModifiers::NONE = poly_trait.modifiers
238238
&& let [.., path] = poly_trait.trait_ref.path.segments
239239
&& poly_trait.bound_generic_params.is_empty()
240240
&& let Some(trait_def_id) = path.res.opt_def_id()
@@ -300,7 +300,7 @@ fn check<'tcx>(cx: &LateContext<'tcx>, bounds: GenericBounds<'tcx>) {
300300
// simply comparing trait `DefId`s won't be enough. We also need to compare the generics.
301301
for (index, bound) in bounds.iter().enumerate() {
302302
if let GenericBound::Trait(poly_trait) = bound
303-
&& let TraitBoundModifier::None = poly_trait.modifiers
303+
&& let TraitBoundModifiers::NONE = poly_trait.modifiers
304304
&& let [.., path] = poly_trait.trait_ref.path.segments
305305
&& let implied_args = path.args.map_or([].as_slice(), |a| a.args)
306306
&& let implied_constraints = path.args.map_or([].as_slice(), |a| a.constraints)

clippy_lints/src/needless_maybe_sized.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use clippy_utils::diagnostics::span_lint_and_then;
22
use rustc_errors::Applicability;
33
use rustc_hir::def_id::{DefId, DefIdMap};
4-
use rustc_hir::{GenericBound, Generics, PolyTraitRef, TraitBoundModifier, WherePredicate};
4+
use rustc_hir::{GenericBound, Generics, PolyTraitRef, TraitBoundModifiers, BoundPolarity, WherePredicate};
55
use rustc_lint::{LateContext, LateLintPass};
66
use rustc_middle::ty::{ClauseKind, PredicatePolarity};
77
use rustc_session::declare_lint_pass;
@@ -118,13 +118,13 @@ impl LateLintPass<'_> for NeedlessMaybeSized {
118118
let maybe_sized_params: DefIdMap<_> = type_param_bounds(generics)
119119
.filter(|bound| {
120120
bound.trait_bound.trait_ref.trait_def_id() == Some(sized_trait)
121-
&& bound.trait_bound.modifiers == TraitBoundModifier::Maybe
121+
&& matches!(bound.trait_bound.modifiers.polarity, BoundPolarity::Maybe(_))
122122
})
123123
.map(|bound| (bound.param, bound))
124124
.collect();
125125

126126
for bound in type_param_bounds(generics) {
127-
if bound.trait_bound.modifiers == TraitBoundModifier::None
127+
if bound.trait_bound.modifiers == TraitBoundModifiers::NONE
128128
&& let Some(sized_bound) = maybe_sized_params.get(&bound.param)
129129
&& let Some(path) = path_to_sized_bound(cx, bound.trait_bound)
130130
{

clippy_lints/src/trait_bounds.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use rustc_errors::Applicability;
1111
use rustc_hir::def::Res;
1212
use rustc_hir::{
1313
GenericBound, Generics, Item, ItemKind, LangItem, Node, Path, PathSegment, PredicateOrigin, QPath,
14-
TraitBoundModifier, TraitItem, TraitRef, Ty, TyKind, WherePredicate,
14+
TraitBoundModifiers, TraitItem, TraitRef, Ty, TyKind, WherePredicate, BoundPolarity,
1515
};
1616
use rustc_lint::{LateContext, LateLintPass};
1717
use rustc_session::impl_lint_pass;
@@ -233,7 +233,7 @@ impl TraitBounds {
233233
fn cannot_combine_maybe_bound(&self, cx: &LateContext<'_>, bound: &GenericBound<'_>) -> bool {
234234
if !self.msrv.meets(msrvs::MAYBE_BOUND_IN_WHERE)
235235
&& let GenericBound::Trait(tr) = bound
236-
&& let TraitBoundModifier::Maybe = tr.modifiers
236+
&& let BoundPolarity::Maybe(_) = tr.modifiers.polarity
237237
{
238238
cx.tcx.lang_items().get(LangItem::Sized) == tr.trait_ref.path.res.opt_def_id()
239239
} else {
@@ -374,12 +374,12 @@ fn check_trait_bound_duplication<'tcx>(cx: &LateContext<'tcx>, generics: &'_ Gen
374374
struct ComparableTraitRef<'a, 'tcx> {
375375
cx: &'a LateContext<'tcx>,
376376
trait_ref: &'tcx TraitRef<'tcx>,
377-
modifier: TraitBoundModifier,
377+
modifiers: TraitBoundModifiers,
378378
}
379379

380380
impl PartialEq for ComparableTraitRef<'_, '_> {
381381
fn eq(&self, other: &Self) -> bool {
382-
self.modifier == other.modifier
382+
SpanlessEq::new(self.cx).eq_modifiers(self.modifiers, other.modifiers)
383383
&& SpanlessEq::new(self.cx)
384384
.paths_by_resolution()
385385
.eq_path(self.trait_ref.path, other.trait_ref.path)
@@ -390,8 +390,8 @@ impl Hash for ComparableTraitRef<'_, '_> {
390390
fn hash<H: Hasher>(&self, state: &mut H) {
391391
let mut s = SpanlessHash::new(self.cx).paths_by_resolution();
392392
s.hash_path(self.trait_ref.path);
393+
s.hash_modifiers(self.modifiers);
393394
state.write_u64(s.finish());
394-
self.modifier.hash(state);
395395
}
396396
}
397397

@@ -400,7 +400,7 @@ fn get_trait_info_from_bound<'a>(bound: &'a GenericBound<'_>) -> Option<(Res, &'
400400
let trait_path = t.trait_ref.path;
401401
let trait_span = {
402402
let path_span = trait_path.span;
403-
if let TraitBoundModifier::Maybe = t.modifiers {
403+
if let BoundPolarity::Maybe(_) = t.modifiers.polarity {
404404
path_span.with_lo(path_span.lo() - BytePos(1)) // include the `?`
405405
} else {
406406
path_span
@@ -427,7 +427,7 @@ fn rollup_traits<'cx, 'tcx>(
427427
ComparableTraitRef {
428428
cx,
429429
trait_ref: &t.trait_ref,
430-
modifier: t.modifiers,
430+
modifiers: t.modifiers,
431431
},
432432
t.span,
433433
))

clippy_utils/src/hir_utils.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ use rustc_hir::def::{DefKind, Res};
99
use rustc_hir::{
1010
ArrayLen, AssocItemConstraint, BinOpKind, BindingMode, Block, BodyId, Closure, ConstArg, ConstArgKind, Expr,
1111
ExprField, ExprKind, FnRetTy, GenericArg, GenericArgs, HirId, HirIdMap, InlineAsmOperand, LetExpr, Lifetime,
12-
LifetimeName, Pat, PatField, PatKind, Path, PathSegment, PrimTy, QPath, Stmt, StmtKind, Ty, TyKind,
12+
LifetimeName, Pat, PatField, PatKind, Path, PathSegment, PrimTy, QPath, Stmt, StmtKind, TraitBoundModifiers, Ty,
13+
TyKind,
1314
};
1415
use rustc_lexer::{TokenKind, tokenize};
1516
use rustc_lint::LateContext;
@@ -126,6 +127,11 @@ impl<'a, 'tcx> SpanlessEq<'a, 'tcx> {
126127
pub fn eq_path_segments(&mut self, left: &[PathSegment<'_>], right: &[PathSegment<'_>]) -> bool {
127128
self.inter_expr().eq_path_segments(left, right)
128129
}
130+
131+
pub fn eq_modifiers(&mut self, left: TraitBoundModifiers, right: TraitBoundModifiers) -> bool {
132+
std::mem::discriminant(&left.constness) == std::mem::discriminant(&right.constness)
133+
&& std::mem::discriminant(&left.polarity) == std::mem::discriminant(&right.polarity)
134+
}
129135
}
130136

131137
pub struct HirEqInterExpr<'a, 'b, 'tcx> {
@@ -1143,6 +1149,12 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> {
11431149
}
11441150
}
11451151

1152+
pub fn hash_modifiers(&mut self, modifiers: TraitBoundModifiers) {
1153+
let TraitBoundModifiers { constness, polarity } = modifiers;
1154+
std::mem::discriminant(&polarity).hash(&mut self.s);
1155+
std::mem::discriminant(&constness).hash(&mut self.s);
1156+
}
1157+
11461158
pub fn hash_stmt(&mut self, b: &Stmt<'_>) {
11471159
std::mem::discriminant(&b.kind).hash(&mut self.s);
11481160

0 commit comments

Comments
 (0)