about summary refs log tree commit diff
path: root/clippy_utils
diff options
context:
space:
mode:
authorCameron Steffen <cam.steffen94@gmail.com>2021-07-16 14:41:19 -0500
committerCameron Steffen <cam.steffen94@gmail.com>2021-07-17 20:49:19 -0500
commit98c500cf8361ef1a6b7152a321515146e02cbd10 (patch)
treed9ba45b21953d7248e2a361b94ac143dc62a7b37 /clippy_utils
parentefbf7ca61e6d024cd73c75bbbe43999350b55ac1 (diff)
downloadrust-98c500cf8361ef1a6b7152a321515146e02cbd10.tar.gz
rust-98c500cf8361ef1a6b7152a321515146e02cbd10.zip
Factor BinOp utils
Diffstat (limited to 'clippy_utils')
-rw-r--r--clippy_utils/src/lib.rs31
1 files changed, 31 insertions, 0 deletions
diff --git a/clippy_utils/src/lib.rs b/clippy_utils/src/lib.rs
index 6db221ab0fd..1fbbf4ac81f 100644
--- a/clippy_utils/src/lib.rs
+++ b/clippy_utils/src/lib.rs
@@ -1710,3 +1710,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
+}