[ruby/prism] Join range checks into the main parse_expression switch
https://github.com/ruby/prism/commit/ed4523464b
This commit is contained in:
parent
8794836bf2
commit
8f707e8030
@ -16768,7 +16768,6 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||||||
static pm_node_t *
|
static pm_node_t *
|
||||||
parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, pm_diagnostic_id_t diag_id) {
|
parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, pm_diagnostic_id_t diag_id) {
|
||||||
pm_token_t recovery = parser->previous;
|
pm_token_t recovery = parser->previous;
|
||||||
bool is_udot = parser->current.type == PM_TOKEN_UDOT_DOT || parser->current.type == PM_TOKEN_UDOT_DOT_DOT;
|
|
||||||
pm_node_t *node = parse_expression_prefix(parser, binding_power);
|
pm_node_t *node = parse_expression_prefix(parser, binding_power);
|
||||||
|
|
||||||
switch (PM_NODE_TYPE(node)) {
|
switch (PM_NODE_TYPE(node)) {
|
||||||
@ -16788,18 +16787,20 @@ parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, pm_diagn
|
|||||||
if (pm_binding_powers[parser->current.type].left > PM_BINDING_POWER_MODIFIER_RESCUE) {
|
if (pm_binding_powers[parser->current.type].left > PM_BINDING_POWER_MODIFIER_RESCUE) {
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
case PM_RANGE_NODE:
|
||||||
|
// Range operators are non-associative, so that it does not
|
||||||
|
// associate with other range operators (i.e. `..1..` should be
|
||||||
|
// rejected.) For this reason, we check such a case for unary ranges
|
||||||
|
// here, and if so, it returns the node immediately,
|
||||||
|
if ((((pm_range_node_t *) node)->left == NULL) && pm_binding_powers[parser->current.type].left >= PM_BINDING_POWER_RANGE) {
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Range operators are non-associative, so that it does not associate with
|
|
||||||
// other range operators (i.e. `..1..` should be rejected.)
|
|
||||||
// For this reason, we check such a case for unary ranges here, and if so,
|
|
||||||
// it returns the node immediately,
|
|
||||||
if (is_udot && pm_binding_powers[parser->current.type].left >= PM_BINDING_POWER_RANGE) {
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Otherwise we'll look and see if the next token can be parsed as an infix
|
// Otherwise we'll look and see if the next token can be parsed as an infix
|
||||||
// operator. If it can, then we'll parse it using parse_expression_infix.
|
// operator. If it can, then we'll parse it using parse_expression_infix.
|
||||||
pm_binding_powers_t current_binding_powers;
|
pm_binding_powers_t current_binding_powers;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user