[PRISM] Consolidate handling heredoc terminators
This commit is contained in:
parent
ac0f6716b1
commit
de6e05da49
@ -12824,6 +12824,23 @@ expect3(pm_parser_t *parser, pm_token_type_t type1, pm_token_type_t type2, pm_to
|
|||||||
parser->previous.type = PM_TOKEN_MISSING;
|
parser->previous.type = PM_TOKEN_MISSING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A special expect1 that expects a heredoc terminator and handles popping the
|
||||||
|
* lex mode accordingly.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
expect1_heredoc_term(pm_parser_t *parser, pm_lex_mode_t *lex_mode) {
|
||||||
|
if (match1(parser, PM_TOKEN_HEREDOC_END)) {
|
||||||
|
lex_mode_pop(parser);
|
||||||
|
parser_lex(parser);
|
||||||
|
} else {
|
||||||
|
pm_parser_err_heredoc_term(parser, lex_mode);
|
||||||
|
lex_mode_pop(parser);
|
||||||
|
parser->previous.start = parser->previous.end;
|
||||||
|
parser->previous.type = PM_TOKEN_MISSING;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static pm_node_t *
|
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);
|
parse_expression(pm_parser_t *parser, pm_binding_power_t binding_power, bool accepts_command_call, pm_diagnostic_id_t diag_id);
|
||||||
|
|
||||||
@ -17527,16 +17544,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||||||
if (match2(parser, PM_TOKEN_HEREDOC_END, PM_TOKEN_EOF)) {
|
if (match2(parser, PM_TOKEN_HEREDOC_END, PM_TOKEN_EOF)) {
|
||||||
// If we get here, then we have an empty heredoc. We'll create
|
// If we get here, then we have an empty heredoc. We'll create
|
||||||
// an empty content token and return an empty string node.
|
// an empty content token and return an empty string node.
|
||||||
if (match1(parser, PM_TOKEN_HEREDOC_END)) {
|
expect1_heredoc_term(parser, lex_mode);
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser_lex(parser);
|
|
||||||
} else {
|
|
||||||
pm_parser_err_heredoc_term(parser, lex_mode);
|
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser->previous.start = parser->previous.end;
|
|
||||||
parser->previous.type = PM_TOKEN_MISSING;
|
|
||||||
}
|
|
||||||
|
|
||||||
pm_token_t content = parse_strings_empty_content(parser->previous.start);
|
pm_token_t content = parse_strings_empty_content(parser->previous.start);
|
||||||
|
|
||||||
if (quote == PM_HEREDOC_QUOTE_BACKTICK) {
|
if (quote == PM_HEREDOC_QUOTE_BACKTICK) {
|
||||||
@ -17577,16 +17585,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||||||
}
|
}
|
||||||
|
|
||||||
node = (pm_node_t *) cast;
|
node = (pm_node_t *) cast;
|
||||||
|
expect1_heredoc_term(parser, lex_mode);
|
||||||
if (match1(parser, PM_TOKEN_HEREDOC_END)) {
|
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser_lex(parser);
|
|
||||||
} else {
|
|
||||||
pm_parser_err_heredoc_term(parser, lex_mode);
|
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser->previous.start = parser->previous.end;
|
|
||||||
parser->previous.type = PM_TOKEN_MISSING;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// If we get here, then we have multiple parts in the heredoc,
|
// If we get here, then we have multiple parts in the heredoc,
|
||||||
// so we'll need to create an interpolated string node to hold
|
// so we'll need to create an interpolated string node to hold
|
||||||
@ -17608,34 +17607,18 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
|
|||||||
pm_interpolated_x_string_node_t *cast = pm_interpolated_xstring_node_create(parser, &opening, &opening);
|
pm_interpolated_x_string_node_t *cast = pm_interpolated_xstring_node_create(parser, &opening, &opening);
|
||||||
cast->parts = parts;
|
cast->parts = parts;
|
||||||
|
|
||||||
if (match1(parser, PM_TOKEN_HEREDOC_END)) {
|
expect1_heredoc_term(parser, lex_mode);
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser_lex(parser);
|
|
||||||
} else {
|
|
||||||
pm_parser_err_heredoc_term(parser, lex_mode);
|
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser->previous.start = parser->previous.end;
|
|
||||||
parser->previous.type = PM_TOKEN_MISSING;
|
|
||||||
}
|
|
||||||
|
|
||||||
pm_interpolated_xstring_node_closing_set(cast, &parser->previous);
|
pm_interpolated_xstring_node_closing_set(cast, &parser->previous);
|
||||||
|
|
||||||
cast->base.location = cast->opening_loc;
|
cast->base.location = cast->opening_loc;
|
||||||
node = (pm_node_t *) cast;
|
node = (pm_node_t *) cast;
|
||||||
} else {
|
} else {
|
||||||
pm_interpolated_string_node_t *cast = pm_interpolated_string_node_create(parser, &opening, &parts, &opening);
|
pm_interpolated_string_node_t *cast = pm_interpolated_string_node_create(parser, &opening, &parts, &opening);
|
||||||
pm_node_list_free(&parts);
|
pm_node_list_free(&parts);
|
||||||
|
|
||||||
if (match1(parser, PM_TOKEN_HEREDOC_END)) {
|
expect1_heredoc_term(parser, lex_mode);
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser_lex(parser);
|
|
||||||
} else {
|
|
||||||
pm_parser_err_heredoc_term(parser, lex_mode);
|
|
||||||
lex_mode_pop(parser);
|
|
||||||
parser->previous.start = parser->previous.end;
|
|
||||||
parser->previous.type = PM_TOKEN_MISSING;
|
|
||||||
}
|
|
||||||
|
|
||||||
pm_interpolated_string_node_closing_set(cast, &parser->previous);
|
pm_interpolated_string_node_closing_set(cast, &parser->previous);
|
||||||
|
|
||||||
cast->base.location = cast->opening_loc;
|
cast->base.location = cast->opening_loc;
|
||||||
node = (pm_node_t *) cast;
|
node = (pm_node_t *) cast;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user