[ruby/prism] Fix parsing symbols in strings after labels

https://github.com/ruby/prism/commit/e16531650d
This commit is contained in:
Haldun Bayhantopcu 2023-10-11 23:35:14 +02:00 committed by git
parent 5c8764477f
commit 4387af1b4a
2 changed files with 17 additions and 2 deletions

View File

@ -11381,6 +11381,7 @@ static inline pm_node_t *
parse_strings(pm_parser_t *parser) {
assert(parser->current.type == PM_TOKEN_STRING_BEGIN);
pm_node_t *result = NULL;
bool state_is_arg_labeled = lex_state_p(parser, PM_LEX_STATE_ARG | PM_LEX_STATE_LABELED);
while (match1(parser, PM_TOKEN_STRING_BEGIN)) {
pm_node_t *node = NULL;
@ -11437,7 +11438,7 @@ parse_strings(pm_parser_t *parser) {
expect1(parser, PM_TOKEN_STRING_END, PM_ERR_STRING_LITERAL_TERM);
node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->previous);
} else if (accept1(parser, PM_TOKEN_LABEL_END)) {
} else if (accept1(parser, PM_TOKEN_LABEL_END) && !state_is_arg_labeled) {
node = (pm_node_t *) pm_symbol_node_create_and_unescape(parser, &opening, &content, &parser->previous, PM_UNESCAPE_ALL);
} else {
expect1(parser, PM_TOKEN_STRING_END, PM_ERR_STRING_LITERAL_TERM);
@ -11471,7 +11472,7 @@ parse_strings(pm_parser_t *parser) {
}
}
if (accept1(parser, PM_TOKEN_LABEL_END)) {
if (accept1(parser, PM_TOKEN_LABEL_END) && !state_is_arg_labeled) {
node = (pm_node_t *) pm_interpolated_symbol_node_create(parser, &opening, &parts, &parser->previous);
} else {
expect1(parser, PM_TOKEN_STRING_END, PM_ERR_STRING_INTERPOLATED_TERM);

View File

@ -1404,6 +1404,20 @@ module Prism
]
end
def test_symbol_in_keyword_parameter
source = "def foo(x:'y':); end"
assert_errors expression(source), source, [
["Expected a closing delimiter for the string literal", 14..14],
]
end
def test_symbol_in_hash
source = "{x:'y':}"
assert_errors expression(source), source, [
["Expected a closing delimiter for the string literal", 7..7],
]
end
private
def assert_errors(expected, source, errors, compare_ripper: RUBY_ENGINE == "ruby")