Skip to content

Commit 088f07a

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

4 files changed

Lines changed: 26 additions & 14 deletions

File tree

‎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
ifletGenericBound::Trait(poly_trait) = bound
237-
&& letTraitBoundModifier::None = poly_trait.modifiers
237+
&& letTraitBoundModifiers::NONE = poly_trait.modifiers
238238
&& let[.., path] = poly_trait.trait_ref.path.segments
239239
&& poly_trait.bound_generic_params.is_empty()
240240
&& letSome(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
ifletGenericBound::Trait(poly_trait) = bound
303-
&& letTraitBoundModifier::None = poly_trait.modifiers
303+
&& letTraitBoundModifiers::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 intype_param_bounds(generics){
127-
if bound.trait_bound.modifiers == TraitBoundModifier::None
127+
if bound.trait_bound.modifiers == TraitBoundModifiers::NONE
128128
&& letSome(sized_bound) = maybe_sized_params.get(&bound.param)
129129
&& letSome(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
fncannot_combine_maybe_bound(&self,cx:&LateContext<'_>,bound:&GenericBound<'_>) -> bool{
234234
if !self.msrv.meets(msrvs::MAYBE_BOUND_IN_WHERE)
235235
&& letGenericBound::Trait(tr) = bound
236-
&& letTraitBoundModifier::Maybe = tr.modifiers
236+
&& letBoundPolarity::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
structComparableTraitRef<'a,'tcx>{
375375
cx:&'aLateContext<'tcx>,
376376
trait_ref:&'tcxTraitRef<'tcx>,
377-
modifier:TraitBoundModifier,
377+
modifiers:TraitBoundModifiers,
378378
}
379379

380380
implPartialEqforComparableTraitRef<'_,'_>{
381381
fneq(&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
fnhash<H:Hasher>(&self,state:&mutH){
391391
letmut 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-
ifletTraitBoundModifier::Maybe = t.modifiers{
403+
ifletBoundPolarity::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
pubfneq_path_segments(&mutself,left:&[PathSegment<'_>],right:&[PathSegment<'_>]) -> bool{
127128
self.inter_expr().eq_path_segments(left, right)
128129
}
130+
131+
pubfneq_modifiers(&mutself,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
pubstructHirEqInterExpr<'a,'b,'tcx>{
@@ -1143,6 +1149,12 @@ impl<'a, 'tcx> SpanlessHash<'a, 'tcx> {
11431149
}
11441150
}
11451151

1152+
pubfnhash_modifiers(&mutself,modifiers:TraitBoundModifiers){
1153+
letTraitBoundModifiers{ constness, polarity } = modifiers;
1154+
std::mem::discriminant(&polarity).hash(&mutself.s);
1155+
std::mem::discriminant(&constness).hash(&mutself.s);
1156+
}
1157+
11461158
pubfnhash_stmt(&mutself,b:&Stmt<'_>){
11471159
std::mem::discriminant(&b.kind).hash(&mutself.s);
11481160

0 commit comments

Comments
 (0)