@@ -213,11 +213,11 @@ impl<'a> Parser<'a> {
213
213
}
214
214
}
215
215
216
+ // Look for JS' `===` and `!==` and recover
216
217
if ( op. node == AssocOp :: Equal || op. node == AssocOp :: NotEqual )
217
218
&& self . token . kind == token:: Eq
218
219
&& self . prev_token . span . hi ( ) == self . token . span . lo ( )
219
220
{
220
- // Look for JS' `===` and `!==` and recover 😇
221
221
let sp = op. span . to ( self . token . span ) ;
222
222
let sugg = match op. node {
223
223
AssocOp :: Equal => "==" ,
@@ -235,6 +235,38 @@ impl<'a> Parser<'a> {
235
235
self . bump ( ) ;
236
236
}
237
237
238
+ // Look for PHP's `<>` and recover
239
+ if op. node == AssocOp :: Less
240
+ && self . token . kind == token:: Gt
241
+ && self . prev_token . span . hi ( ) == self . token . span . lo ( )
242
+ {
243
+ let sp = op. span . to ( self . token . span ) ;
244
+ self . struct_span_err ( sp, "invalid comparison operator `<>`" )
245
+ . span_suggestion_short (
246
+ sp,
247
+ "`<>` is not a valid comparison operator, use `!=`" ,
248
+ "!=" . to_string ( ) ,
249
+ Applicability :: MachineApplicable ,
250
+ )
251
+ . emit ( ) ;
252
+ self . bump ( ) ;
253
+ }
254
+
255
+ // Look for C++'s `<=>` and recover
256
+ if op. node == AssocOp :: LessEqual
257
+ && self . token . kind == token:: Gt
258
+ && self . prev_token . span . hi ( ) == self . token . span . lo ( )
259
+ {
260
+ let sp = op. span . to ( self . token . span ) ;
261
+ self . struct_span_err ( sp, "invalid comparison operator `<=>`" )
262
+ . span_label (
263
+ sp,
264
+ "`<=>` is not a valid comparison operator, use `std::cmp::Ordering`" ,
265
+ )
266
+ . emit ( ) ;
267
+ self . bump ( ) ;
268
+ }
269
+
238
270
let op = op. node ;
239
271
// Special cases:
240
272
if op == AssocOp :: As {
0 commit comments