@@ -981,6 +981,75 @@ impl BinOpKind {
981981
982982pub type BinOp = Spanned < BinOpKind > ;
983983
984+ // Sometimes `BinOpKind` and `AssignOpKind` need the same treatment. The
985+ // operations covered by `AssignOpKind` are a subset of those covered by
986+ // `BinOpKind`, so it makes sense to convert `AssignOpKind` to `BinOpKind`.
987+ impl From < AssignOpKind > for BinOpKind {
988+ fn from ( op : AssignOpKind ) -> BinOpKind {
989+ match op {
990+ AssignOpKind :: AddAssign => BinOpKind :: Add ,
991+ AssignOpKind :: SubAssign => BinOpKind :: Sub ,
992+ AssignOpKind :: MulAssign => BinOpKind :: Mul ,
993+ AssignOpKind :: DivAssign => BinOpKind :: Div ,
994+ AssignOpKind :: RemAssign => BinOpKind :: Rem ,
995+ AssignOpKind :: BitXorAssign => BinOpKind :: BitXor ,
996+ AssignOpKind :: BitAndAssign => BinOpKind :: BitAnd ,
997+ AssignOpKind :: BitOrAssign => BinOpKind :: BitOr ,
998+ AssignOpKind :: ShlAssign => BinOpKind :: Shl ,
999+ AssignOpKind :: ShrAssign => BinOpKind :: Shr ,
1000+ }
1001+ }
1002+ }
1003+
1004+ #[ derive( Clone , Copy , Debug , PartialEq , Encodable , Decodable , HashStable_Generic ) ]
1005+ pub enum AssignOpKind {
1006+ /// The `+=` operator (addition)
1007+ AddAssign ,
1008+ /// The `-=` operator (subtraction)
1009+ SubAssign ,
1010+ /// The `*=` operator (multiplication)
1011+ MulAssign ,
1012+ /// The `/=` operator (division)
1013+ DivAssign ,
1014+ /// The `%=` operator (modulus)
1015+ RemAssign ,
1016+ /// The `^=` operator (bitwise xor)
1017+ BitXorAssign ,
1018+ /// The `&=` operator (bitwise and)
1019+ BitAndAssign ,
1020+ /// The `|=` operator (bitwise or)
1021+ BitOrAssign ,
1022+ /// The `<<=` operator (shift left)
1023+ ShlAssign ,
1024+ /// The `>>=` operator (shift right)
1025+ ShrAssign ,
1026+ }
1027+
1028+ impl AssignOpKind {
1029+ pub fn as_str ( & self ) -> & ' static str {
1030+ use AssignOpKind :: * ;
1031+ match self {
1032+ AddAssign => "+=" ,
1033+ SubAssign => "-=" ,
1034+ MulAssign => "*=" ,
1035+ DivAssign => "/=" ,
1036+ RemAssign => "%=" ,
1037+ BitXorAssign => "^=" ,
1038+ BitAndAssign => "&=" ,
1039+ BitOrAssign => "|=" ,
1040+ ShlAssign => "<<=" ,
1041+ ShrAssign => ">>=" ,
1042+ }
1043+ }
1044+
1045+ /// AssignOps are always by value.
1046+ pub fn is_by_value ( self ) -> bool {
1047+ true
1048+ }
1049+ }
1050+
1051+ pub type AssignOp = Spanned < AssignOpKind > ;
1052+
9841053/// Unary operator.
9851054///
9861055/// Note that `&data` is not an operator, it's an `AddrOf` expression.
@@ -1593,7 +1662,7 @@ pub enum ExprKind {
15931662 /// An assignment with an operator.
15941663 ///
15951664 /// E.g., `a += 1`.
1596- AssignOp ( BinOp , P < Expr > , P < Expr > ) ,
1665+ AssignOp ( AssignOp , P < Expr > , P < Expr > ) ,
15971666 /// Access of a named (e.g., `obj.foo`) or unnamed (e.g., `obj.0`) struct field.
15981667 Field ( P < Expr > , Ident ) ,
15991668 /// An indexing operation (e.g., `foo[2]`).
0 commit comments