@@ -3,51 +3,15 @@ use rustc_span::kw;
33use crate :: ast:: { self , BinOpKind } ;
44use crate :: token:: { self , BinOpToken , Token } ;
55
6- /// Associative operator with precedence.
7- ///
8- /// This is the enum which specifies operator precedence and fixity to the parser.
6+ /// Associative operator.
97#[ derive( Copy , Clone , PartialEq , Debug ) ]
108pub enum AssocOp {
11- /// `+`
12- Add ,
13- /// `-`
14- Subtract ,
15- /// `*`
16- Multiply ,
17- /// `/`
18- Divide ,
19- /// `%`
20- Modulus ,
21- /// `&&`
22- LAnd ,
23- /// `||`
24- LOr ,
25- /// `^`
26- BitXor ,
27- /// `&`
28- BitAnd ,
29- /// `|`
30- BitOr ,
31- /// `<<`
32- ShiftLeft ,
33- /// `>>`
34- ShiftRight ,
35- /// `==`
36- Equal ,
37- /// `<`
38- Less ,
39- /// `<=`
40- LessEqual ,
41- /// `!=`
42- NotEqual ,
43- /// `>`
44- Greater ,
45- /// `>=`
46- GreaterEqual ,
47- /// `=`
48- Assign ,
9+ /// A binary op.
10+ Binary ( BinOpKind ) ,
4911 /// `?=` where ? is one of the assignable BinOps
5012 AssignOp ( BinOpKind ) ,
13+ /// `=`
14+ Assign ,
5115 /// `as`
5216 As ,
5317 /// `..` range
@@ -67,11 +31,21 @@ pub enum Fixity {
6731}
6832
6933impl AssocOp {
70- /// Creates a new AssocOP from a token
34+ /// Creates a new AssocOp from a token.
7135 pub fn from_token ( t : & Token ) -> Option < AssocOp > {
7236 use AssocOp :: * ;
7337 match t. kind {
7438 token:: Eq => Some ( Assign ) ,
39+ token:: BinOp ( BinOpToken :: Plus ) => Some ( Binary ( BinOpKind :: Add ) ) ,
40+ token:: BinOp ( BinOpToken :: Minus ) => Some ( Binary ( BinOpKind :: Sub ) ) ,
41+ token:: BinOp ( BinOpToken :: Star ) => Some ( Binary ( BinOpKind :: Mul ) ) ,
42+ token:: BinOp ( BinOpToken :: Slash ) => Some ( Binary ( BinOpKind :: Div ) ) ,
43+ token:: BinOp ( BinOpToken :: Percent ) => Some ( Binary ( BinOpKind :: Rem ) ) ,
44+ token:: BinOp ( BinOpToken :: Caret ) => Some ( Binary ( BinOpKind :: BitXor ) ) ,
45+ token:: BinOp ( BinOpToken :: And ) => Some ( Binary ( BinOpKind :: BitAnd ) ) ,
46+ token:: BinOp ( BinOpToken :: Or ) => Some ( Binary ( BinOpKind :: BitOr ) ) ,
47+ token:: BinOp ( BinOpToken :: Shl ) => Some ( Binary ( BinOpKind :: Shl ) ) ,
48+ token:: BinOp ( BinOpToken :: Shr ) => Some ( Binary ( BinOpKind :: Shr ) ) ,
7549 token:: BinOpEq ( BinOpToken :: Plus ) => Some ( AssignOp ( BinOpKind :: Add ) ) ,
7650 token:: BinOpEq ( BinOpToken :: Minus ) => Some ( AssignOp ( BinOpKind :: Sub ) ) ,
7751 token:: BinOpEq ( BinOpToken :: Star ) => Some ( AssignOp ( BinOpKind :: Mul ) ) ,
@@ -82,74 +56,31 @@ impl AssocOp {
8256 token:: BinOpEq ( BinOpToken :: Or ) => Some ( AssignOp ( BinOpKind :: BitOr ) ) ,
8357 token:: BinOpEq ( BinOpToken :: Shl ) => Some ( AssignOp ( BinOpKind :: Shl ) ) ,
8458 token:: BinOpEq ( BinOpToken :: Shr ) => Some ( AssignOp ( BinOpKind :: Shr ) ) ,
85- token:: BinOp ( BinOpToken :: Plus ) => Some ( Add ) ,
86- token:: BinOp ( BinOpToken :: Minus ) => Some ( Subtract ) ,
87- token:: BinOp ( BinOpToken :: Star ) => Some ( Multiply ) ,
88- token:: BinOp ( BinOpToken :: Slash ) => Some ( Divide ) ,
89- token:: BinOp ( BinOpToken :: Percent ) => Some ( Modulus ) ,
90- token:: BinOp ( BinOpToken :: Caret ) => Some ( BitXor ) ,
91- token:: BinOp ( BinOpToken :: And ) => Some ( BitAnd ) ,
92- token:: BinOp ( BinOpToken :: Or ) => Some ( BitOr ) ,
93- token:: BinOp ( BinOpToken :: Shl ) => Some ( ShiftLeft ) ,
94- token:: BinOp ( BinOpToken :: Shr ) => Some ( ShiftRight ) ,
95- token:: Lt => Some ( Less ) ,
96- token:: Le => Some ( LessEqual ) ,
97- token:: Ge => Some ( GreaterEqual ) ,
98- token:: Gt => Some ( Greater ) ,
99- token:: EqEq => Some ( Equal ) ,
100- token:: Ne => Some ( NotEqual ) ,
101- token:: AndAnd => Some ( LAnd ) ,
102- token:: OrOr => Some ( LOr ) ,
59+ token:: Lt => Some ( Binary ( BinOpKind :: Lt ) ) ,
60+ token:: Le => Some ( Binary ( BinOpKind :: Le ) ) ,
61+ token:: Ge => Some ( Binary ( BinOpKind :: Ge ) ) ,
62+ token:: Gt => Some ( Binary ( BinOpKind :: Gt ) ) ,
63+ token:: EqEq => Some ( Binary ( BinOpKind :: Eq ) ) ,
64+ token:: Ne => Some ( Binary ( BinOpKind :: Ne ) ) ,
65+ token:: AndAnd => Some ( Binary ( BinOpKind :: And ) ) ,
66+ token:: OrOr => Some ( Binary ( BinOpKind :: Or ) ) ,
10367 token:: DotDot => Some ( DotDot ) ,
10468 token:: DotDotEq => Some ( DotDotEq ) ,
10569 // DotDotDot is no longer supported, but we need some way to display the error
10670 token:: DotDotDot => Some ( DotDotEq ) ,
10771 // `<-` should probably be `< -`
108- token:: LArrow => Some ( Less ) ,
72+ token:: LArrow => Some ( Binary ( BinOpKind :: Lt ) ) ,
10973 _ if t. is_keyword ( kw:: As ) => Some ( As ) ,
11074 _ => None ,
11175 }
11276 }
11377
114- /// Creates a new AssocOp from ast::BinOpKind.
115- pub fn from_ast_binop ( op : BinOpKind ) -> Self {
116- use AssocOp :: * ;
117- match op {
118- BinOpKind :: Lt => Less ,
119- BinOpKind :: Gt => Greater ,
120- BinOpKind :: Le => LessEqual ,
121- BinOpKind :: Ge => GreaterEqual ,
122- BinOpKind :: Eq => Equal ,
123- BinOpKind :: Ne => NotEqual ,
124- BinOpKind :: Mul => Multiply ,
125- BinOpKind :: Div => Divide ,
126- BinOpKind :: Rem => Modulus ,
127- BinOpKind :: Add => Add ,
128- BinOpKind :: Sub => Subtract ,
129- BinOpKind :: Shl => ShiftLeft ,
130- BinOpKind :: Shr => ShiftRight ,
131- BinOpKind :: BitAnd => BitAnd ,
132- BinOpKind :: BitXor => BitXor ,
133- BinOpKind :: BitOr => BitOr ,
134- BinOpKind :: And => LAnd ,
135- BinOpKind :: Or => LOr ,
136- }
137- }
138-
13978 /// Gets the precedence of this operator
14079 pub fn precedence ( & self ) -> ExprPrecedence {
14180 use AssocOp :: * ;
14281 match * self {
14382 As => ExprPrecedence :: Cast ,
144- Multiply | Divide | Modulus => ExprPrecedence :: Product ,
145- Add | Subtract => ExprPrecedence :: Sum ,
146- ShiftLeft | ShiftRight => ExprPrecedence :: Shift ,
147- BitAnd => ExprPrecedence :: BitAnd ,
148- BitXor => ExprPrecedence :: BitXor ,
149- BitOr => ExprPrecedence :: BitOr ,
150- Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual => ExprPrecedence :: Compare ,
151- LAnd => ExprPrecedence :: LAnd ,
152- LOr => ExprPrecedence :: LOr ,
83+ Binary ( bin_op) => bin_op. precedence ( ) ,
15384 DotDot | DotDotEq => ExprPrecedence :: Range ,
15485 Assign | AssignOp ( _) => ExprPrecedence :: Assign ,
15586 }
@@ -161,57 +92,25 @@ impl AssocOp {
16192 // NOTE: it is a bug to have an operators that has same precedence but different fixities!
16293 match * self {
16394 Assign | AssignOp ( _) => Fixity :: Right ,
164- As | Multiply | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd
165- | BitXor | BitOr | LAnd | LOr => Fixity :: Left ,
166- Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | DotDot | DotDotEq => {
167- Fixity :: None
168- }
95+ Binary ( binop) => binop. fixity ( ) ,
96+ As => Fixity :: Left ,
97+ DotDot | DotDotEq => Fixity :: None ,
16998 }
17099 }
171100
172101 pub fn is_comparison ( & self ) -> bool {
173102 use AssocOp :: * ;
174103 match * self {
175- Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual => true ,
176- Assign | AssignOp ( _) | As | Multiply | Divide | Modulus | Add | Subtract
177- | ShiftLeft | ShiftRight | BitAnd | BitXor | BitOr | LAnd | LOr | DotDot | DotDotEq => {
178- false
179- }
104+ Binary ( binop) => binop. is_comparison ( ) ,
105+ Assign | AssignOp ( _) | As | DotDot | DotDotEq => false ,
180106 }
181107 }
182108
183109 pub fn is_assign_like ( & self ) -> bool {
184110 use AssocOp :: * ;
185111 match * self {
186112 Assign | AssignOp ( _) => true ,
187- Less | Greater | LessEqual | GreaterEqual | Equal | NotEqual | As | Multiply
188- | Divide | Modulus | Add | Subtract | ShiftLeft | ShiftRight | BitAnd | BitXor
189- | BitOr | LAnd | LOr | DotDot | DotDotEq => false ,
190- }
191- }
192-
193- pub fn to_ast_binop ( & self ) -> Option < BinOpKind > {
194- use AssocOp :: * ;
195- match * self {
196- Less => Some ( BinOpKind :: Lt ) ,
197- Greater => Some ( BinOpKind :: Gt ) ,
198- LessEqual => Some ( BinOpKind :: Le ) ,
199- GreaterEqual => Some ( BinOpKind :: Ge ) ,
200- Equal => Some ( BinOpKind :: Eq ) ,
201- NotEqual => Some ( BinOpKind :: Ne ) ,
202- Multiply => Some ( BinOpKind :: Mul ) ,
203- Divide => Some ( BinOpKind :: Div ) ,
204- Modulus => Some ( BinOpKind :: Rem ) ,
205- Add => Some ( BinOpKind :: Add ) ,
206- Subtract => Some ( BinOpKind :: Sub ) ,
207- ShiftLeft => Some ( BinOpKind :: Shl ) ,
208- ShiftRight => Some ( BinOpKind :: Shr ) ,
209- BitAnd => Some ( BinOpKind :: BitAnd ) ,
210- BitXor => Some ( BinOpKind :: BitXor ) ,
211- BitOr => Some ( BinOpKind :: BitOr ) ,
212- LAnd => Some ( BinOpKind :: And ) ,
213- LOr => Some ( BinOpKind :: Or ) ,
214- Assign | AssignOp ( _) | As | DotDot | DotDotEq => None ,
113+ As | Binary ( _) | DotDot | DotDotEq => false ,
215114 }
216115 }
217116
@@ -221,16 +120,19 @@ impl AssocOp {
221120 /// parentheses while having a high degree of confidence on the correctness of the suggestion.
222121 pub fn can_continue_expr_unambiguously ( & self ) -> bool {
223122 use AssocOp :: * ;
123+ use BinOpKind :: * ;
224124 matches ! (
225125 self ,
226- BitXor | // `{ 42 } ^ 3`
227126 Assign | // `{ 42 } = { 42 }`
228- Divide | // `{ 42 } / 42`
229- Modulus | // `{ 42 } % 2`
230- ShiftRight | // `{ 42 } >> 2`
231- LessEqual | // `{ 42 } <= 3`
232- Greater | // `{ 42 } > 3`
233- GreaterEqual | // `{ 42 } >= 3`
127+ Binary (
128+ BitXor | // `{ 42 } ^ 3`
129+ Div | // `{ 42 } / 42`
130+ Rem | // `{ 42 } % 2`
131+ Shr | // `{ 42 } >> 2`
132+ Le | // `{ 42 } <= 3`
133+ Gt | // `{ 42 } > 3`
134+ Ge // `{ 42 } >= 3`
135+ ) |
234136 AssignOp ( _) | // `{ 42 } +=`
235137 // Equal | // `{ 42 } == { 42 }` Accepting these here would regress incorrect
236138 // NotEqual | // `{ 42 } != { 42 } struct literals parser recovery.
0 commit comments