зеркало из https://github.com/github/ruby.git
[ruby/prism] Disallow label in parentheses
https://github.com/ruby/prism/commit/b624e09cc6
This commit is contained in:
Родитель
6a168fbf41
Коммит
768ceceb12
|
@ -272,6 +272,7 @@ errors:
|
|||
- UNEXPECTED_BLOCK_ARGUMENT
|
||||
- UNEXPECTED_INDEX_BLOCK
|
||||
- UNEXPECTED_INDEX_KEYWORDS
|
||||
- UNEXPECTED_LABEL
|
||||
- UNEXPECTED_MULTI_WRITE
|
||||
- UNEXPECTED_RANGE_OPERATOR
|
||||
- UNEXPECTED_SAFE_NAVIGATION
|
||||
|
|
188
prism/prism.c
188
prism/prism.c
|
@ -278,11 +278,6 @@ lex_state_beg_p(pm_parser_t *parser) {
|
|||
return lex_state_p(parser, PM_LEX_STATE_BEG_ANY) || ((parser->lex_state & (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED)) == (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED));
|
||||
}
|
||||
|
||||
static inline bool
|
||||
lex_state_arg_labeled_p(pm_parser_t *parser) {
|
||||
return (parser->lex_state & (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED)) == (PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED);
|
||||
}
|
||||
|
||||
static inline bool
|
||||
lex_state_arg_p(pm_parser_t *parser) {
|
||||
return lex_state_p(parser, PM_LEX_STATE_ARG_ANY);
|
||||
|
@ -13167,15 +13162,15 @@ expect1_heredoc_term(pm_parser_t *parser, pm_lex_mode_t *lex_mode) {
|
|||
}
|
||||
|
||||
static pm_node_t *
|
||||
parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth);
|
||||
parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth);
|
||||
|
||||
/**
|
||||
* This is a wrapper of parse_expression, which also checks whether the
|
||||
* resulting node is a value expression.
|
||||
*/
|
||||
static pm_node_t *
|
||||
parse_value_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
pm_node_t *node = parse_expression(parser, binding_power, accepts_command_call, diag_id, depth);
|
||||
parse_value_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
pm_node_t *node = parse_expression(parser, binding_power, accepts_command_call, accepts_label, diag_id, depth);
|
||||
pm_assert_value_expression(parser, node);
|
||||
return node;
|
||||
}
|
||||
|
@ -13262,11 +13257,11 @@ static pm_node_t *
|
|||
parse_starred_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
if (accept1(parser, PM_TOKEN_USTAR)) {
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *expression = parse_value_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
pm_node_t *expression = parse_value_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_splat_node_create(parser, &operator, expression);
|
||||
}
|
||||
|
||||
return parse_value_expression(parser, binding_power, accepts_command_call, diag_id, depth);
|
||||
return parse_value_expression(parser, binding_power, accepts_command_call, false, diag_id, depth);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -13779,7 +13774,7 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b
|
|||
pm_node_t *name = NULL;
|
||||
|
||||
if (token_begins_expression_p(parser->current.type)) {
|
||||
name = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
name = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
name = parse_target(parser, name, true, true);
|
||||
}
|
||||
|
||||
|
@ -13787,7 +13782,7 @@ parse_targets(pm_parser_t *parser, pm_node_t *first_target, pm_binding_power_t b
|
|||
pm_multi_target_node_targets_append(parser, result, splat);
|
||||
has_rest = true;
|
||||
} else if (token_begins_expression_p(parser->current.type)) {
|
||||
pm_node_t *target = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1));
|
||||
pm_node_t *target = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1));
|
||||
target = parse_target(parser, target, true, false);
|
||||
|
||||
pm_multi_target_node_targets_append(parser, result, target);
|
||||
|
@ -13839,7 +13834,7 @@ parse_statements(pm_parser_t *parser, pm_context_t context, uint16_t depth) {
|
|||
context_push(parser, context);
|
||||
|
||||
while (true) {
|
||||
pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1));
|
||||
pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1));
|
||||
pm_statements_node_body_append(parser, statements, node, true);
|
||||
|
||||
// If we're recovering from a syntax error, then we need to stop parsing
|
||||
|
@ -13978,9 +13973,9 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod
|
|||
// inner hash to share the static literals with the outer
|
||||
// hash.
|
||||
parser->current_hash_keys = literals;
|
||||
value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1));
|
||||
value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1));
|
||||
} else if (token_begins_expression_p(parser->current.type)) {
|
||||
value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1));
|
||||
value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT_HASH, (uint16_t) (depth + 1));
|
||||
} else {
|
||||
pm_parser_scope_forwarding_keywords_check(parser, &operator);
|
||||
}
|
||||
|
@ -14000,7 +13995,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod
|
|||
pm_node_t *value = NULL;
|
||||
|
||||
if (token_begins_expression_p(parser->current.type)) {
|
||||
value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_EXPRESSION_AFTER_LABEL, (uint16_t) (depth + 1));
|
||||
value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_EXPRESSION_AFTER_LABEL, (uint16_t) (depth + 1));
|
||||
} else {
|
||||
if (parser->encoding->isupper_char(label.start, (label.end - 1) - label.start)) {
|
||||
pm_token_t constant = { .type = PM_TOKEN_CONSTANT, .start = label.start, .end = label.end - 1 };
|
||||
|
@ -14030,7 +14025,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod
|
|||
break;
|
||||
}
|
||||
default: {
|
||||
pm_node_t *key = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_KEY, (uint16_t) (depth + 1));
|
||||
pm_node_t *key = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, true, PM_ERR_HASH_KEY, (uint16_t) (depth + 1));
|
||||
|
||||
// Hash keys that are strings are automatically frozen. We will
|
||||
// mark that here.
|
||||
|
@ -14048,7 +14043,7 @@ parse_assocs(pm_parser_t *parser, pm_static_literals_t *literals, pm_node_t *nod
|
|||
operator = parser->previous;
|
||||
}
|
||||
|
||||
pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1));
|
||||
element = (pm_node_t *) pm_assoc_node_create(parser, key, &operator, value);
|
||||
break;
|
||||
}
|
||||
|
@ -14152,7 +14147,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for
|
|||
pm_node_t *expression = NULL;
|
||||
|
||||
if (token_begins_expression_p(parser->current.type)) {
|
||||
expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1));
|
||||
expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1));
|
||||
} else {
|
||||
pm_parser_scope_forwarding_block_check(parser, &operator);
|
||||
}
|
||||
|
@ -14175,7 +14170,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for
|
|||
pm_parser_scope_forwarding_positionals_check(parser, &operator);
|
||||
argument = (pm_node_t *) pm_splat_node_create(parser, &operator, NULL);
|
||||
} else {
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT, (uint16_t) (depth + 1));
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_SPLAT, (uint16_t) (depth + 1));
|
||||
|
||||
if (parsed_bare_hash) {
|
||||
pm_parser_err(parser, operator.start, expression->location.end, PM_ERR_ARGUMENT_SPLAT_AFTER_ASSOC_SPLAT);
|
||||
|
@ -14195,7 +14190,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for
|
|||
// If the token begins an expression then this ... was not actually
|
||||
// argument forwarding but was instead a range.
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_RANGE, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_RANGE, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
argument = (pm_node_t *) pm_range_node_create(parser, NULL, &operator, right);
|
||||
} else {
|
||||
pm_parser_scope_forwarding_all_check(parser, &parser->previous);
|
||||
|
@ -14215,7 +14210,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for
|
|||
/* fallthrough */
|
||||
default: {
|
||||
if (argument == NULL) {
|
||||
argument = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, !parsed_first_argument, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1));
|
||||
argument = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, !parsed_first_argument, true, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
bool contains_keywords = false;
|
||||
|
@ -14241,7 +14236,7 @@ parse_arguments(pm_parser_t *parser, pm_arguments_t *arguments, bool accepts_for
|
|||
pm_hash_key_static_literals_add(parser, &hash_keys, argument);
|
||||
|
||||
// Finish parsing the one we are part way through.
|
||||
pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1));
|
||||
argument = (pm_node_t *) pm_assoc_node_create(parser, argument, &operator, value);
|
||||
|
||||
pm_keyword_hash_node_elements_append(bare_hash, argument);
|
||||
|
@ -14568,7 +14563,7 @@ parse_parameters(
|
|||
uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0;
|
||||
|
||||
if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true);
|
||||
pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_value_expression(parser, binding_power, false, false, PM_ERR_PARAMETER_NO_DEFAULT, (uint16_t) (depth + 1));
|
||||
if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser);
|
||||
|
||||
pm_optional_parameter_node_t *param = pm_optional_parameter_node_create(parser, &name, &operator, value);
|
||||
|
@ -14663,7 +14658,7 @@ parse_parameters(
|
|||
uint32_t reads = parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 ? pm_locals_reads(&parser->current_scope->locals, name_id) : 0;
|
||||
|
||||
if (accepts_blocks_in_defaults) pm_accepts_block_stack_push(parser, true);
|
||||
pm_node_t *value = parse_value_expression(parser, binding_power, false, PM_ERR_PARAMETER_NO_DEFAULT_KW, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_value_expression(parser, binding_power, false, false, PM_ERR_PARAMETER_NO_DEFAULT_KW, (uint16_t) (depth + 1));
|
||||
if (accepts_blocks_in_defaults) pm_accepts_block_stack_pop(parser);
|
||||
|
||||
if (parser->version == PM_OPTIONS_VERSION_CRUBY_3_3 && (pm_locals_reads(&parser->current_scope->locals, name_id) != reads)) {
|
||||
|
@ -14941,7 +14936,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_
|
|||
parser_lex(parser);
|
||||
pm_rescue_node_operator_set(rescue, &parser->previous);
|
||||
|
||||
pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1));
|
||||
pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1));
|
||||
reference = parse_target(parser, reference, false, false);
|
||||
|
||||
pm_rescue_node_reference_set(rescue, reference);
|
||||
|
@ -14971,7 +14966,7 @@ parse_rescues(pm_parser_t *parser, size_t opening_newline_index, const pm_token_
|
|||
if (accept1(parser, PM_TOKEN_EQUAL_GREATER)) {
|
||||
pm_rescue_node_operator_set(rescue, &parser->previous);
|
||||
|
||||
pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1));
|
||||
pm_node_t *reference = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_RESCUE_VARIABLE, (uint16_t) (depth + 1));
|
||||
reference = parse_target(parser, reference, false, false);
|
||||
|
||||
pm_rescue_node_reference_set(rescue, reference);
|
||||
|
@ -15683,7 +15678,7 @@ static inline pm_node_t *
|
|||
parse_predicate(pm_parser_t *parser, pm_binding_power_t binding_power, pm_context_t context, pm_token_t *then_keyword, uint16_t depth) {
|
||||
context_push(parser, PM_CONTEXT_PREDICATE);
|
||||
pm_diagnostic_id_t error_id = context == PM_CONTEXT_IF ? PM_ERR_CONDITIONAL_IF_PREDICATE : PM_ERR_CONDITIONAL_UNLESS_PREDICATE;
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, error_id, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, error_id, (uint16_t) (depth + 1));
|
||||
|
||||
// Predicates are closed by a term, a "then", or a term and then a "then".
|
||||
bool predicate_closed = accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON);
|
||||
|
@ -16495,11 +16490,9 @@ parse_strings_empty_content(const uint8_t *location) {
|
|||
* Parse a set of strings that could be concatenated together.
|
||||
*/
|
||||
static inline pm_node_t *
|
||||
parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) {
|
||||
parse_strings(pm_parser_t *parser, pm_node_t *current, bool accepts_label, uint16_t depth) {
|
||||
assert(parser->current.type == PM_TOKEN_STRING_BEGIN);
|
||||
|
||||
bool concating = false;
|
||||
bool state_is_arg_labeled = lex_state_arg_labeled_p(parser);
|
||||
|
||||
while (match1(parser, PM_TOKEN_STRING_BEGIN)) {
|
||||
pm_node_t *node = NULL;
|
||||
|
@ -16509,6 +16502,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) {
|
|||
const pm_lex_mode_t *lex_mode = parser->lex_modes.current;
|
||||
assert(lex_mode->mode == PM_LEX_STRING);
|
||||
bool lex_interpolation = lex_mode->as.string.interpolation;
|
||||
bool label_allowed = lex_mode->as.string.label_allowed && accepts_label;
|
||||
|
||||
pm_token_t opening = parser->current;
|
||||
parser_lex(parser);
|
||||
|
@ -16575,8 +16569,9 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) {
|
|||
node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->previous);
|
||||
|
||||
pm_node_list_free(&parts);
|
||||
} else if (accept1(parser, PM_TOKEN_LABEL_END) && !state_is_arg_labeled) {
|
||||
} else if (accept1(parser, PM_TOKEN_LABEL_END)) {
|
||||
node = (pm_node_t *) pm_symbol_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped, parse_symbol_encoding(parser, &content, &unescaped, true));
|
||||
if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL);
|
||||
} else if (match1(parser, PM_TOKEN_EOF)) {
|
||||
pm_parser_err_token(parser, &opening, PM_ERR_STRING_LITERAL_EOF);
|
||||
node = (pm_node_t *) pm_string_node_create_unescaped(parser, &opening, &content, &parser->current, &unescaped);
|
||||
|
@ -16615,6 +16610,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) {
|
|||
}
|
||||
} else if (accept1(parser, PM_TOKEN_LABEL_END)) {
|
||||
node = (pm_node_t *) pm_symbol_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped, parse_symbol_encoding(parser, &content, &unescaped, true));
|
||||
if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL);
|
||||
} else {
|
||||
// If we get here, then we have interpolation so we'll need
|
||||
// to create a string or symbol node with interpolation.
|
||||
|
@ -16632,8 +16628,9 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) {
|
|||
}
|
||||
}
|
||||
|
||||
if (accept1(parser, PM_TOKEN_LABEL_END) && !state_is_arg_labeled) {
|
||||
if (accept1(parser, PM_TOKEN_LABEL_END)) {
|
||||
node = (pm_node_t *) pm_interpolated_symbol_node_create(parser, &opening, &parts, &parser->previous);
|
||||
if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL);
|
||||
} else if (match1(parser, PM_TOKEN_EOF)) {
|
||||
pm_parser_err_token(parser, &opening, PM_ERR_STRING_INTERPOLATED_TERM);
|
||||
node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->current);
|
||||
|
@ -16659,6 +16656,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current, uint16_t depth) {
|
|||
|
||||
if (accept1(parser, PM_TOKEN_LABEL_END)) {
|
||||
node = (pm_node_t *) pm_interpolated_symbol_node_create(parser, &opening, &parts, &parser->previous);
|
||||
if (!label_allowed) pm_parser_err_node(parser, node, PM_ERR_UNEXPECTED_LABEL);
|
||||
} else if (match1(parser, PM_TOKEN_EOF)) {
|
||||
pm_parser_err_token(parser, &opening, PM_ERR_STRING_INTERPOLATED_TERM);
|
||||
node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->current);
|
||||
|
@ -17067,7 +17065,7 @@ parse_pattern_hash(pm_parser_t *parser, pm_constant_id_list_t *captures, pm_node
|
|||
pm_node_t *key;
|
||||
|
||||
if (match1(parser, PM_TOKEN_STRING_BEGIN)) {
|
||||
key = parse_strings(parser, NULL, (uint16_t) (depth + 1));
|
||||
key = parse_strings(parser, NULL, true, (uint16_t) (depth + 1));
|
||||
|
||||
if (PM_NODE_TYPE_P(key, PM_INTERPOLATED_SYMBOL_NODE)) {
|
||||
pm_parser_err_node(parser, key, PM_ERR_PATTERN_HASH_KEY_INTERPOLATED);
|
||||
|
@ -17209,7 +17207,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm
|
|||
first_node = parse_pattern_keyword_rest(parser, captures);
|
||||
break;
|
||||
case PM_TOKEN_STRING_BEGIN:
|
||||
first_node = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_HASH_KEY_LABEL, (uint16_t) (depth + 1));
|
||||
first_node = parse_expression(parser, PM_BINDING_POWER_MAX, false, true, PM_ERR_PATTERN_HASH_KEY_LABEL, (uint16_t) (depth + 1));
|
||||
break;
|
||||
default: {
|
||||
PM_PARSER_ERR_TOKEN_FORMAT(parser, parser->current, PM_ERR_PATTERN_HASH_KEY, pm_token_type_human(parser->current.type));
|
||||
|
@ -17245,7 +17243,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm
|
|||
// expression as the right side of the range.
|
||||
switch (parser->current.type) {
|
||||
case PM_CASE_PRIMITIVE: {
|
||||
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_range_node_create(parser, NULL, &operator, right);
|
||||
}
|
||||
default: {
|
||||
|
@ -17256,7 +17254,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm
|
|||
}
|
||||
}
|
||||
case PM_CASE_PRIMITIVE: {
|
||||
pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, diag_id, (uint16_t) (depth + 1));
|
||||
pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_MAX, false, true, diag_id, (uint16_t) (depth + 1));
|
||||
|
||||
// Now that we have a primitive, we need to check if it's part of a range.
|
||||
if (accept2(parser, PM_TOKEN_DOT_DOT, PM_TOKEN_DOT_DOT_DOT)) {
|
||||
|
@ -17267,7 +17265,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm
|
|||
// node. Otherwise, we'll create an endless range.
|
||||
switch (parser->current.type) {
|
||||
case PM_CASE_PRIMITIVE: {
|
||||
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, PM_BINDING_POWER_MAX, false, false, PM_ERR_PATTERN_EXPRESSION_AFTER_RANGE, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_range_node_create(parser, node, &operator, right);
|
||||
}
|
||||
default:
|
||||
|
@ -17332,7 +17330,7 @@ parse_pattern_primitive(pm_parser_t *parser, pm_constant_id_list_t *captures, pm
|
|||
pm_token_t lparen = parser->current;
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_PATTERN_EXPRESSION_AFTER_PIN, (uint16_t) (depth + 1));
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_PATTERN_EXPRESSION_AFTER_PIN, (uint16_t) (depth + 1));
|
||||
parser->pattern_matching_newlines = previous_pattern_matching_newlines;
|
||||
|
||||
accept1(parser, PM_TOKEN_NEWLINE);
|
||||
|
@ -17887,7 +17885,7 @@ parse_regular_expression_errors(pm_parser_t *parser, pm_regular_expression_node_
|
|||
* Parse an expression that begins with the previous node that we just lexed.
|
||||
*/
|
||||
static inline pm_node_t *
|
||||
parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
switch (parser->current.type) {
|
||||
case PM_TOKEN_BRACKET_LEFT_ARRAY: {
|
||||
parser_lex(parser);
|
||||
|
@ -17926,7 +17924,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
if (match3(parser, PM_TOKEN_BRACKET_RIGHT, PM_TOKEN_COMMA, PM_TOKEN_EOF)) {
|
||||
pm_parser_scope_forwarding_positionals_check(parser, &operator);
|
||||
} else {
|
||||
expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
element = (pm_node_t *) pm_splat_node_create(parser, &operator, expression);
|
||||
|
@ -17945,7 +17943,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
pm_static_literals_free(&hash_keys);
|
||||
parsed_bare_hash = true;
|
||||
} else {
|
||||
element = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_ARRAY_EXPRESSION, (uint16_t) (depth + 1));
|
||||
element = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, true, PM_ERR_ARRAY_EXPRESSION, (uint16_t) (depth + 1));
|
||||
|
||||
if (pm_symbol_node_label_p(element) || accept1(parser, PM_TOKEN_EQUAL_GREATER)) {
|
||||
if (parsed_bare_hash) {
|
||||
|
@ -17963,7 +17961,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
operator = not_provided(parser);
|
||||
}
|
||||
|
||||
pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_HASH_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *assoc = (pm_node_t *) pm_assoc_node_create(parser, element, &operator, value);
|
||||
pm_keyword_hash_node_elements_append(hash, assoc);
|
||||
|
||||
|
@ -18013,7 +18011,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
// of statements within the parentheses.
|
||||
pm_accepts_block_stack_push(parser, true);
|
||||
context_push(parser, PM_CONTEXT_PARENS);
|
||||
pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1));
|
||||
pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1));
|
||||
context_pop(parser);
|
||||
|
||||
// Determine if this statement is followed by a terminator. In the
|
||||
|
@ -18093,7 +18091,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
|
||||
// Parse each statement within the parentheses.
|
||||
while (true) {
|
||||
pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1));
|
||||
pm_node_t *node = parse_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_CANNOT_PARSE_EXPRESSION, (uint16_t) (depth + 1));
|
||||
pm_statements_node_body_append(parser, statements, node, true);
|
||||
|
||||
// If we're recovering from a syntax error, then we need to stop
|
||||
|
@ -18185,7 +18183,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
// Characters can be followed by strings in which case they are
|
||||
// automatically concatenated.
|
||||
if (match1(parser, PM_TOKEN_STRING_BEGIN)) {
|
||||
return parse_strings(parser, node, (uint16_t) (depth + 1));
|
||||
return parse_strings(parser, node, false, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
return node;
|
||||
|
@ -18245,7 +18243,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
pm_token_t operator = parser->current;
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *right = parse_expression(parser, pm_binding_powers[operator.type].left, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, pm_binding_powers[operator.type].left, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
|
||||
// Unary .. and ... are special because these are non-associative
|
||||
// operators that can also be unary operators. In this case we need
|
||||
|
@ -18490,7 +18488,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
}
|
||||
|
||||
if (match1(parser, PM_TOKEN_STRING_BEGIN)) {
|
||||
return parse_strings(parser, node, (uint16_t) (depth + 1));
|
||||
return parse_strings(parser, node, false, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
return node;
|
||||
|
@ -18588,7 +18586,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
} else if (!token_begins_expression_p(parser->current.type)) {
|
||||
predicate = NULL;
|
||||
} else {
|
||||
predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CASE_EXPRESSION_AFTER_CASE, (uint16_t) (depth + 1));
|
||||
predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CASE_EXPRESSION_AFTER_CASE, (uint16_t) (depth + 1));
|
||||
while (accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON));
|
||||
}
|
||||
|
||||
|
@ -18625,14 +18623,14 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
do {
|
||||
if (accept1(parser, PM_TOKEN_USTAR)) {
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
|
||||
pm_splat_node_t *splat_node = pm_splat_node_create(parser, &operator, expression);
|
||||
pm_when_node_conditions_append(when_node, (pm_node_t *) splat_node);
|
||||
|
||||
if (PM_NODE_TYPE_P(expression, PM_MISSING_NODE)) break;
|
||||
} else {
|
||||
pm_node_t *condition = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_CASE_EXPRESSION_AFTER_WHEN, (uint16_t) (depth + 1));
|
||||
pm_node_t *condition = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_CASE_EXPRESSION_AFTER_WHEN, (uint16_t) (depth + 1));
|
||||
pm_when_node_conditions_append(when_node, condition);
|
||||
|
||||
// If we found a missing node, then this is a syntax
|
||||
|
@ -18713,11 +18711,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
// `unless` statements.
|
||||
if (accept1(parser, PM_TOKEN_KEYWORD_IF_MODIFIER)) {
|
||||
pm_token_t keyword = parser->previous;
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1));
|
||||
pattern = (pm_node_t *) pm_if_node_modifier_create(parser, pattern, &keyword, predicate);
|
||||
} else if (accept1(parser, PM_TOKEN_KEYWORD_UNLESS_MODIFIER)) {
|
||||
pm_token_t keyword = parser->previous;
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1));
|
||||
pattern = (pm_node_t *) pm_unless_node_modifier_create(parser, pattern, &keyword, predicate);
|
||||
}
|
||||
|
||||
|
@ -18939,7 +18937,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
|
||||
if (accept1(parser, PM_TOKEN_LESS_LESS)) {
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS, (uint16_t) (depth + 1));
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_EXPECT_EXPRESSION_AFTER_LESS_LESS, (uint16_t) (depth + 1));
|
||||
|
||||
pm_parser_scope_push(parser, true);
|
||||
accept2(parser, PM_TOKEN_NEWLINE, PM_TOKEN_SEMICOLON);
|
||||
|
@ -18972,7 +18970,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
return (pm_node_t *) pm_singleton_class_node_create(parser, &locals, &class_keyword, &operator, expression, statements, &parser->previous);
|
||||
}
|
||||
|
||||
pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_CLASS_NAME, (uint16_t) (depth + 1));
|
||||
pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_CLASS_NAME, (uint16_t) (depth + 1));
|
||||
pm_token_t name = parser->previous;
|
||||
if (name.type != PM_TOKEN_CONSTANT) {
|
||||
pm_parser_err_token(parser, &name, PM_ERR_CLASS_NAME);
|
||||
|
@ -18988,7 +18986,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser->command_start = true;
|
||||
parser_lex(parser);
|
||||
|
||||
superclass = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CLASS_SUPERCLASS, (uint16_t) (depth + 1));
|
||||
superclass = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CLASS_SUPERCLASS, (uint16_t) (depth + 1));
|
||||
} else {
|
||||
inheritance_operator = not_provided(parser);
|
||||
superclass = NULL;
|
||||
|
@ -19157,7 +19155,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser_lex(parser);
|
||||
|
||||
pm_token_t lparen = parser->previous;
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, PM_ERR_DEF_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_node_t *expression = parse_value_expression(parser, PM_BINDING_POWER_STATEMENT, true, false, PM_ERR_DEF_RECEIVER, (uint16_t) (depth + 1));
|
||||
|
||||
accept1(parser, PM_TOKEN_NEWLINE);
|
||||
expect1(parser, PM_TOKEN_PARENTHESIS_RIGHT, PM_ERR_EXPECT_RPAREN);
|
||||
|
@ -19244,13 +19242,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
pm_do_loop_stack_push(parser, false);
|
||||
statements = (pm_node_t *) pm_statements_node_create(parser);
|
||||
|
||||
pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_DEFINED + 1, binding_power < PM_BINDING_POWER_COMPOSITION, PM_ERR_DEF_ENDLESS, (uint16_t) (depth + 1));
|
||||
pm_node_t *statement = parse_expression(parser, PM_BINDING_POWER_DEFINED + 1, binding_power < PM_BINDING_POWER_COMPOSITION, false, PM_ERR_DEF_ENDLESS, (uint16_t) (depth + 1));
|
||||
|
||||
if (accept1(parser, PM_TOKEN_KEYWORD_RESCUE_MODIFIER)) {
|
||||
context_push(parser, PM_CONTEXT_RESCUE_MODIFIER);
|
||||
|
||||
pm_token_t rescue_keyword = parser->previous;
|
||||
pm_node_t *value = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_expression(parser, binding_power, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
context_pop(parser);
|
||||
|
||||
statement = (pm_node_t *) pm_rescue_modifier_node_create(parser, statement, &rescue_keyword, value);
|
||||
|
@ -19335,7 +19333,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
|
||||
if (accept1(parser, PM_TOKEN_PARENTHESIS_LEFT)) {
|
||||
lparen = parser->previous;
|
||||
expression = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1));
|
||||
expression = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1));
|
||||
|
||||
if (parser->recovering) {
|
||||
rparen = not_provided(parser);
|
||||
|
@ -19347,7 +19345,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
} else {
|
||||
lparen = not_provided(parser);
|
||||
rparen = not_provided(parser);
|
||||
expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1));
|
||||
expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_DEFINED_EXPRESSION, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
context_pop(parser);
|
||||
|
@ -19396,12 +19394,12 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
pm_node_t *name = NULL;
|
||||
|
||||
if (token_begins_expression_p(parser->current.type)) {
|
||||
name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
index = (pm_node_t *) pm_splat_node_create(parser, &star_operator, name);
|
||||
} else if (token_begins_expression_p(parser->current.type)) {
|
||||
index = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1));
|
||||
index = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_COMMA, (uint16_t) (depth + 1));
|
||||
} else {
|
||||
pm_parser_err_token(parser, &for_keyword, PM_ERR_FOR_INDEX);
|
||||
index = (pm_node_t *) pm_missing_node_create(parser, for_keyword.start, for_keyword.end);
|
||||
|
@ -19420,7 +19418,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
expect1(parser, PM_TOKEN_KEYWORD_IN, PM_ERR_FOR_IN);
|
||||
pm_token_t in_keyword = parser->previous;
|
||||
|
||||
pm_node_t *collection = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_FOR_COLLECTION, (uint16_t) (depth + 1));
|
||||
pm_node_t *collection = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_FOR_COLLECTION, (uint16_t) (depth + 1));
|
||||
pm_do_loop_stack_pop(parser);
|
||||
|
||||
pm_token_t do_keyword;
|
||||
|
@ -19497,7 +19495,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
if (accept1(parser, PM_TOKEN_PARENTHESIS_RIGHT)) {
|
||||
arguments.closing_loc = PM_LOCATION_TOKEN_VALUE(&parser->previous);
|
||||
} else {
|
||||
receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
|
||||
receiver = parse_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
|
||||
|
||||
if (!parser->recovering) {
|
||||
accept1(parser, PM_TOKEN_NEWLINE);
|
||||
|
@ -19506,7 +19504,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
}
|
||||
}
|
||||
} else {
|
||||
receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
|
||||
receiver = parse_expression(parser, PM_BINDING_POWER_NOT, true, false, PM_ERR_NOT_EXPRESSION, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
return (pm_node_t *) pm_call_node_not_create(parser, receiver, &message, &arguments);
|
||||
|
@ -19525,7 +19523,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser_lex(parser);
|
||||
pm_token_t module_keyword = parser->previous;
|
||||
|
||||
pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_MODULE_NAME, (uint16_t) (depth + 1));
|
||||
pm_node_t *constant_path = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_MODULE_NAME, (uint16_t) (depth + 1));
|
||||
pm_token_t name;
|
||||
|
||||
// If we can recover from a syntax error that occurred while parsing
|
||||
|
@ -19618,7 +19616,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
|
||||
parser_lex(parser);
|
||||
pm_token_t keyword = parser->previous;
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1));
|
||||
|
||||
pm_do_loop_stack_pop(parser);
|
||||
context_pop(parser);
|
||||
|
@ -19646,7 +19644,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
|
||||
parser_lex(parser);
|
||||
pm_token_t keyword = parser->previous;
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, PM_BINDING_POWER_COMPOSITION, true, false, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1));
|
||||
|
||||
pm_do_loop_stack_pop(parser);
|
||||
context_pop(parser);
|
||||
|
@ -20224,7 +20222,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
pm_node_t *name = NULL;
|
||||
|
||||
if (token_begins_expression_p(parser->current.type)) {
|
||||
name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
name = parse_expression(parser, PM_BINDING_POWER_INDEX, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_STAR, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
pm_node_t *splat = (pm_node_t *) pm_splat_node_create(parser, &operator, name);
|
||||
|
@ -20243,7 +20241,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser_lex(parser);
|
||||
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, binding_power < PM_BINDING_POWER_MATCH, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, binding_power < PM_BINDING_POWER_MATCH, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "!");
|
||||
|
||||
pm_conditional_predicate(parser, receiver, PM_CONDITIONAL_PREDICATE_TYPE_NOT);
|
||||
|
@ -20256,7 +20254,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser_lex(parser);
|
||||
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "~");
|
||||
|
||||
return (pm_node_t *) node;
|
||||
|
@ -20268,7 +20266,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser_lex(parser);
|
||||
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "-@");
|
||||
|
||||
return (pm_node_t *) node;
|
||||
|
@ -20277,11 +20275,11 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser_lex(parser);
|
||||
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *node = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_node_t *node = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
|
||||
if (accept1(parser, PM_TOKEN_STAR_STAR)) {
|
||||
pm_token_t exponent_operator = parser->previous;
|
||||
pm_node_t *exponent = parse_expression(parser, pm_binding_powers[exponent_operator.type].right, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1));
|
||||
pm_node_t *exponent = parse_expression(parser, pm_binding_powers[exponent_operator.type].right, false, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1));
|
||||
node = (pm_node_t *) pm_call_node_binary_create(parser, node, &exponent_operator, exponent, 0);
|
||||
node = (pm_node_t *) pm_call_node_unary_create(parser, &operator, node, "-@");
|
||||
} else {
|
||||
|
@ -20392,13 +20390,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
parser_lex(parser);
|
||||
|
||||
pm_token_t operator = parser->previous;
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_node_t *receiver = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
|
||||
pm_call_node_t *node = pm_call_node_unary_create(parser, &operator, receiver, "+@");
|
||||
|
||||
return (pm_node_t *) node;
|
||||
}
|
||||
case PM_TOKEN_STRING_BEGIN:
|
||||
return parse_strings(parser, NULL, (uint16_t) (depth + 1));
|
||||
return parse_strings(parser, NULL, accepts_label, (uint16_t) (depth + 1));
|
||||
case PM_TOKEN_SYMBOL_BEGIN: {
|
||||
pm_lex_mode_t lex_mode = *parser->lex_modes.current;
|
||||
parser_lex(parser);
|
||||
|
@ -20447,7 +20445,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||
*/
|
||||
static pm_node_t *
|
||||
parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_power, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
pm_node_t *value = parse_value_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, diag_id, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_value_expression(parser, binding_power, previous_binding_power == PM_BINDING_POWER_ASSIGNMENT ? accepts_command_call : previous_binding_power < PM_BINDING_POWER_MATCH, false, diag_id, (uint16_t) (depth + 1));
|
||||
|
||||
// Contradicting binding powers, the right-hand-side value of the assignment
|
||||
// allows the `rescue` modifier.
|
||||
|
@ -20457,7 +20455,7 @@ parse_assignment_value(pm_parser_t *parser, pm_binding_power_t previous_binding_
|
|||
pm_token_t rescue = parser->current;
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *right = parse_expression(parser, binding_power, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, binding_power, false, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
context_pop(parser);
|
||||
|
||||
return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right);
|
||||
|
@ -20563,7 +20561,7 @@ parse_assignment_values(pm_parser_t *parser, pm_binding_power_t previous_binding
|
|||
}
|
||||
}
|
||||
|
||||
pm_node_t *right = parse_expression(parser, binding_power, accepts_command_call_inner, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, binding_power, accepts_command_call_inner, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
context_pop(parser);
|
||||
|
||||
return (pm_node_t *) pm_rescue_modifier_node_create(parser, value, &rescue, right);
|
||||
|
@ -21138,14 +21136,14 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
case PM_TOKEN_KEYWORD_AND: {
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_AND, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_AND, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_and_node_create(parser, node, &token, right);
|
||||
}
|
||||
case PM_TOKEN_KEYWORD_OR:
|
||||
case PM_TOKEN_PIPE_PIPE: {
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_OR, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
pm_node_t *right = parse_expression(parser, binding_power, parser->previous.type == PM_TOKEN_KEYWORD_OR, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_or_node_create(parser, node, &token, right);
|
||||
}
|
||||
case PM_TOKEN_EQUAL_TILDE: {
|
||||
|
@ -21157,7 +21155,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
//
|
||||
// In this case, `foo` should be a method call and not a local yet.
|
||||
parser_lex(parser);
|
||||
pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
|
||||
// By default, we're going to create a call node and then return it.
|
||||
pm_call_node_t *call = pm_call_node_binary_create(parser, node, &token, argument, 0);
|
||||
|
@ -21236,7 +21234,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
case PM_TOKEN_STAR:
|
||||
case PM_TOKEN_STAR_STAR: {
|
||||
parser_lex(parser);
|
||||
pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, 0);
|
||||
}
|
||||
case PM_TOKEN_GREATER:
|
||||
|
@ -21248,7 +21246,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
}
|
||||
|
||||
parser_lex(parser);
|
||||
pm_node_t *argument = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, PM_CALL_NODE_FLAGS_COMPARISON);
|
||||
}
|
||||
case PM_TOKEN_AMPERSAND_DOT:
|
||||
|
@ -21301,7 +21299,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
|
||||
pm_node_t *right = NULL;
|
||||
if (token_begins_expression_p(parser->current.type)) {
|
||||
right = parse_expression(parser, binding_power, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
right = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||
}
|
||||
|
||||
return (pm_node_t *) pm_range_node_create(parser, node, &token, right);
|
||||
|
@ -21310,14 +21308,14 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
pm_token_t keyword = parser->current;
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_IF_PREDICATE, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_if_node_modifier_create(parser, node, &keyword, predicate);
|
||||
}
|
||||
case PM_TOKEN_KEYWORD_UNLESS_MODIFIER: {
|
||||
pm_token_t keyword = parser->current;
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_UNLESS_PREDICATE, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_unless_node_modifier_create(parser, node, &keyword, predicate);
|
||||
}
|
||||
case PM_TOKEN_KEYWORD_UNTIL_MODIFIER: {
|
||||
|
@ -21325,7 +21323,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
pm_statements_node_t *statements = pm_statements_node_create(parser);
|
||||
pm_statements_node_body_append(parser, statements, node, true);
|
||||
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_UNTIL_PREDICATE, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_until_node_modifier_create(parser, &token, predicate, statements, PM_NODE_TYPE_P(node, PM_BEGIN_NODE) ? PM_LOOP_FLAGS_BEGIN_MODIFIER : 0);
|
||||
}
|
||||
case PM_TOKEN_KEYWORD_WHILE_MODIFIER: {
|
||||
|
@ -21333,7 +21331,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
pm_statements_node_t *statements = pm_statements_node_create(parser);
|
||||
pm_statements_node_body_append(parser, statements, node, true);
|
||||
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1));
|
||||
pm_node_t *predicate = parse_value_expression(parser, binding_power, true, false, PM_ERR_CONDITIONAL_WHILE_PREDICATE, (uint16_t) (depth + 1));
|
||||
return (pm_node_t *) pm_while_node_modifier_create(parser, &token, predicate, statements, PM_NODE_TYPE_P(node, PM_BEGIN_NODE) ? PM_LOOP_FLAGS_BEGIN_MODIFIER : 0);
|
||||
}
|
||||
case PM_TOKEN_QUESTION_MARK: {
|
||||
|
@ -21344,7 +21342,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
pm_token_t qmark = parser->current;
|
||||
parser_lex(parser);
|
||||
|
||||
pm_node_t *true_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_TRUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *true_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_TERNARY_EXPRESSION_TRUE, (uint16_t) (depth + 1));
|
||||
|
||||
if (parser->recovering) {
|
||||
// If parsing the true expression of this ternary resulted in a syntax
|
||||
|
@ -21367,7 +21365,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
expect1(parser, PM_TOKEN_COLON, PM_ERR_TERNARY_COLON);
|
||||
|
||||
pm_token_t colon = parser->previous;
|
||||
pm_node_t *false_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, PM_ERR_TERNARY_EXPRESSION_FALSE, (uint16_t) (depth + 1));
|
||||
pm_node_t *false_expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, false, false, PM_ERR_TERNARY_EXPRESSION_FALSE, (uint16_t) (depth + 1));
|
||||
|
||||
context_pop(parser);
|
||||
pop_block_exits(parser, previous_block_exits);
|
||||
|
@ -21450,7 +21448,7 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
parser_lex(parser);
|
||||
accept1(parser, PM_TOKEN_NEWLINE);
|
||||
|
||||
pm_node_t *value = parse_expression(parser, binding_power, true, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
pm_node_t *value = parse_expression(parser, binding_power, true, false, PM_ERR_RESCUE_MODIFIER_VALUE, (uint16_t) (depth + 1));
|
||||
context_pop(parser);
|
||||
|
||||
return (pm_node_t *) pm_rescue_modifier_node_create(parser, node, &token, value);
|
||||
|
@ -21555,13 +21553,13 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||
* determine if they need to perform additional cleanup.
|
||||
*/
|
||||
static pm_node_t *
|
||||
parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, bool accepts_label, pm_diagnostic_id_t diag_id, uint16_t depth) {
|
||||
if (PRISM_UNLIKELY(depth >= PRISM_DEPTH_MAXIMUM)) {
|
||||
pm_parser_err_current(parser, PM_ERR_NESTING_TOO_DEEP);
|
||||
return (pm_node_t *) pm_missing_node_create(parser, parser->current.start, parser->current.end);
|
||||
}
|
||||
|
||||
pm_node_t *node = parse_expression_prefix(parser, binding_power, accepts_command_call, diag_id, depth);
|
||||
pm_node_t *node = parse_expression_prefix(parser, binding_power, accepts_command_call, accepts_label, diag_id, depth);
|
||||
|
||||
switch (PM_NODE_TYPE(node)) {
|
||||
case PM_MISSING_NODE:
|
||||
|
|
|
@ -347,12 +347,13 @@ static const pm_diagnostic_data_t diagnostic_messages[PM_DIAGNOSTIC_ID_MAX] = {
|
|||
[PM_ERR_TERNARY_COLON] = { "expected a `:` after the true expression of a ternary operator", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_TERNARY_EXPRESSION_FALSE] = { "expected an expression after `:` in the ternary operator", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_TERNARY_EXPRESSION_TRUE] = { "expected an expression after `?` in the ternary operator", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNDEF_ARGUMENT] = { "invalid argument being passed to `undef`; expected a bare word, constant, or symbol argument", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNARY_RECEIVER] = { "unexpected %s, expected a receiver for unary `%c`", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNARY_DISALLOWED] = { "unexpected %s; unary calls are not allowed in this context", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNDEF_ARGUMENT] = { "invalid argument being passed to `undef`; expected a bare word, constant, or symbol argument", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNEXPECTED_BLOCK_ARGUMENT] = { "block argument should not be given", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNEXPECTED_INDEX_BLOCK] = { "unexpected block arg given in index assignment; blocks are not allowed in index assignment expressions", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNEXPECTED_INDEX_KEYWORDS] = { "unexpected keyword arg given in index assignment; keywords are not allowed in index assignment expressions", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNEXPECTED_LABEL] = { "unexpected label", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNEXPECTED_MULTI_WRITE] = { "unexpected multiple assignment; multiple assignment is not allowed in this context", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNEXPECTED_RANGE_OPERATOR] = { "unexpected range operator; .. and ... are non-associative and cannot be chained", PM_ERROR_LEVEL_SYNTAX },
|
||||
[PM_ERR_UNEXPECTED_SAFE_NAVIGATION] = { "&. inside multiple assignment destination", PM_ERROR_LEVEL_SYNTAX },
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
("a":)
|
||||
^~~~ unexpected label
|
||||
|
|
@ -1,3 +1,3 @@
|
|||
{x:'y':}
|
||||
^~ unexpected label terminator, expected a string literal terminator
|
||||
^~~~ unexpected label
|
||||
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
def foo(x:'y':); end
|
||||
^~ unexpected label terminator, expected a string literal terminator
|
||||
^~~~ unexpected label
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче