diff options
| author | flip1995 <philipp.krones@embecosm.com> | 2021-07-19 11:38:40 +0200 |
|---|---|---|
| committer | flip1995 <philipp.krones@embecosm.com> | 2021-07-19 11:48:49 +0200 |
| commit | 26321b35c8037b99156aeaa0a8c989fae7bccd14 (patch) | |
| tree | d4e84be3790f8ce86ee92539dcf3686405bec28c /clippy_utils | |
| parent | 1b0e57800c40784c81cd7b29459a19df515b12c6 (diff) | |
| parent | f467750680987427d7ff045bbe9e84317140d0aa (diff) | |
| download | rust-26321b35c8037b99156aeaa0a8c989fae7bccd14.tar.gz rust-26321b35c8037b99156aeaa0a8c989fae7bccd14.zip | |
Merge remote-tracking branch 'upstream/master' into rustup
Diffstat (limited to 'clippy_utils')
| -rw-r--r-- | clippy_utils/src/higher.rs | 25 | ||||
| -rw-r--r-- | clippy_utils/src/lib.rs | 47 | ||||
| -rw-r--r-- | clippy_utils/src/sugg.rs | 2 | ||||
| -rw-r--r-- | clippy_utils/src/ty.rs | 6 |
4 files changed, 40 insertions, 40 deletions
diff --git a/clippy_utils/src/higher.rs b/clippy_utils/src/higher.rs index 3e3e472e99f..f32f1109b08 100644 --- a/clippy_utils/src/higher.rs +++ b/clippy_utils/src/higher.rs @@ -11,31 +11,6 @@ use rustc_hir::{BorrowKind, Expr, ExprKind, StmtKind, UnOp}; use rustc_lint::LateContext; use rustc_span::{sym, ExpnKind, Span, Symbol}; -/// Converts a hir binary operator to the corresponding `ast` type. -#[must_use] -pub fn binop(op: hir::BinOpKind) -> ast::BinOpKind { - match op { - hir::BinOpKind::Eq => ast::BinOpKind::Eq, - hir::BinOpKind::Ge => ast::BinOpKind::Ge, - hir::BinOpKind::Gt => ast::BinOpKind::Gt, - hir::BinOpKind::Le => ast::BinOpKind::Le, - hir::BinOpKind::Lt => ast::BinOpKind::Lt, - hir::BinOpKind::Ne => ast::BinOpKind::Ne, - hir::BinOpKind::Or => ast::BinOpKind::Or, - hir::BinOpKind::Add => ast::BinOpKind::Add, - hir::BinOpKind::And => ast::BinOpKind::And, - hir::BinOpKind::BitAnd => ast::BinOpKind::BitAnd, - hir::BinOpKind::BitOr => ast::BinOpKind::BitOr, - hir::BinOpKind::BitXor => ast::BinOpKind::BitXor, - hir::BinOpKind::Div => ast::BinOpKind::Div, - hir::BinOpKind::Mul => ast::BinOpKind::Mul, - hir::BinOpKind::Rem => ast::BinOpKind::Rem, - hir::BinOpKind::Shl => ast::BinOpKind::Shl, - hir::BinOpKind::Shr => ast::BinOpKind::Shr, - hir::BinOpKind::Sub => ast::BinOpKind::Sub, - } -} - /// Represent a range akin to `ast::ExprKind::Range`. #[derive(Debug, Copy, Clone)] pub struct Range<'a> { diff --git a/clippy_utils/src/lib.rs b/clippy_utils/src/lib.rs index 4f0a9f442ed..00db52a9457 100644 --- a/clippy_utils/src/lib.rs +++ b/clippy_utils/src/lib.rs @@ -909,12 +909,8 @@ pub fn is_integer_const(cx: &LateContext<'_>, e: &Expr<'_>, value: u128) -> bool if is_integer_literal(e, value) { return true; } - let map = cx.tcx.hir(); - let parent_item = map.get_parent_item(e.hir_id); - if let Some((Constant::Int(v), _)) = map - .maybe_body_owned_by(parent_item) - .and_then(|body_id| constant(cx, cx.tcx.typeck_body(body_id), e)) - { + let enclosing_body = cx.tcx.hir().local_def_id(cx.tcx.hir().enclosing_body_owner(e.hir_id)); + if let Some((Constant::Int(v), _)) = constant(cx, cx.tcx.typeck(enclosing_body), e) { value == v } else { false @@ -1041,18 +1037,14 @@ pub fn is_refutable(cx: &LateContext<'_>, pat: &Pat<'_>) -> bool { PatKind::Struct(ref qpath, fields, _) => { is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, fields.iter().map(|field| &*field.pat)) }, - PatKind::TupleStruct(ref qpath, pats, _) => { - is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, pats) - }, + PatKind::TupleStruct(ref qpath, pats, _) => is_enum_variant(cx, qpath, pat.hir_id) || are_refutable(cx, pats), PatKind::Slice(head, middle, tail) => { match &cx.typeck_results().node_type(pat.hir_id).kind() { rustc_ty::Slice(..) => { // [..] is the only irrefutable slice pattern. !head.is_empty() || middle.is_none() || !tail.is_empty() }, - rustc_ty::Array(..) => { - are_refutable(cx, head.iter().chain(middle).chain(tail.iter())) - }, + rustc_ty::Array(..) => are_refutable(cx, head.iter().chain(middle).chain(tail.iter())), _ => { // unreachable!() true @@ -1710,3 +1702,34 @@ pub fn is_test_module_or_function(tcx: TyCtxt<'_>, item: &Item<'_>) -> bool { matches!(item.kind, ItemKind::Mod(..)) && item.ident.name.as_str().contains("test") } + +macro_rules! op_utils { + ($($name:ident $assign:ident)*) => { + /// Binary operation traits like `LangItem::Add` + pub static BINOP_TRAITS: &[LangItem] = &[$(LangItem::$name,)*]; + + /// Operator-Assign traits like `LangItem::AddAssign` + pub static OP_ASSIGN_TRAITS: &[LangItem] = &[$(LangItem::$assign,)*]; + + /// Converts `BinOpKind::Add` to `(LangItem::Add, LangItem::AddAssign)`, for example + pub fn binop_traits(kind: hir::BinOpKind) -> Option<(LangItem, LangItem)> { + match kind { + $(hir::BinOpKind::$name => Some((LangItem::$name, LangItem::$assign)),)* + _ => None, + } + } + }; +} + +op_utils! { + Add AddAssign + Sub SubAssign + Mul MulAssign + Div DivAssign + Rem RemAssign + BitXor BitXorAssign + BitAnd BitAndAssign + BitOr BitOrAssign + Shl ShlAssign + Shr ShrAssign +} diff --git a/clippy_utils/src/sugg.rs b/clippy_utils/src/sugg.rs index efc0ec50fdc..3bd75b10e90 100644 --- a/clippy_utils/src/sugg.rs +++ b/clippy_utils/src/sugg.rs @@ -154,7 +154,7 @@ impl<'a> Sugg<'a> { | hir::ExprKind::Err => Sugg::NonParen(snippet), hir::ExprKind::Assign(..) => Sugg::BinOp(AssocOp::Assign, snippet), hir::ExprKind::AssignOp(op, ..) => Sugg::BinOp(hirbinop2assignop(op), snippet), - hir::ExprKind::Binary(op, ..) => Sugg::BinOp(AssocOp::from_ast_binop(higher::binop(op.node)), snippet), + hir::ExprKind::Binary(op, ..) => Sugg::BinOp(AssocOp::from_ast_binop(op.node.into()), snippet), hir::ExprKind::Cast(..) => Sugg::BinOp(AssocOp::As, snippet), hir::ExprKind::Type(..) => Sugg::BinOp(AssocOp::Colon, snippet), } diff --git a/clippy_utils/src/ty.rs b/clippy_utils/src/ty.rs index 3f5c5604d43..523d55219ab 100644 --- a/clippy_utils/src/ty.rs +++ b/clippy_utils/src/ty.rs @@ -257,10 +257,12 @@ pub fn is_type_diagnostic_item(cx: &LateContext<'_>, ty: Ty<'_>, diag_item: Symb } } -/// Checks if the type is equal to a lang item +/// Checks if the type is equal to a lang item. +/// +/// Returns `false` if the `LangItem` is not defined. pub fn is_type_lang_item(cx: &LateContext<'_>, ty: Ty<'_>, lang_item: hir::LangItem) -> bool { match ty.kind() { - ty::Adt(adt, _) => cx.tcx.lang_items().require(lang_item).unwrap() == adt.did, + ty::Adt(adt, _) => cx.tcx.lang_items().require(lang_item).map_or(false, |li| li == adt.did), _ => false, } } |
