Description
First off, the operator precedence of a..b
is extremely low.
struct Range
recently got #[derive(Eq)], so people might want to compare a range to an expression in range notation.
r == 1..10
parses as (r == 1)..10
. Similarly, 1..10 == r
parses as 1..(10 == r)
. Both result in type errors.
I think there's no good reason for ..
to have a precedence lower than comparisons. I'd suggest to put it in-between the comparison operators and the bitwise operators.
But the current implementation gets weirder when we consider the other forms of range notation:
r == 1..
parses as (r == 1)..
, and is a type error (or maybe a RangeFrom<bool>
).
But r == ..1
parses as r == (..1)
, and is a valid range comparison.
In the other direction, ..1 == r
parses as ..(1 == r)
and is potentially a RangeTo<bool>
.
But 1.. == r
is a syntax error (expected one of )
or ,
, found ==
).
This inconsistent with the prefix form.
If we keep the current precedence of ..
(lower than all binops), I think we should disallow r == ..1
. I think this can be implemented easily by using RESTRICTION_NO_DOTS when parsing the RHS of any binop.
Also, we should use RESTRICTION_NO_DOTS when parsing the RHS of prefix-version ..expr
-- currently ..1..2
is a RangeTo<Range<_>>
, while 1..2..3
and 1..2..
both are syntax errors.
If we increase the precedence, we will need to be careful not to allow code like 1 + ..2
. I think any binop with precedence smaller than that of ..
will have to use RESTRICTION_NO_DOTS on the RHS.
I also think the implementation can be simplified quite a bit if the prefix ..
wasn't handled in parse_prefix_expr
(as that's only supposed to be used for operators with high precedence), but at the same level as the binary and postfix version (parse_assign_expr
, or parse_binops
if we change the precedence). This would allow us to get rid of RESTRICTION_NO_DOTS and use the normal operator precedence handling instead.