aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTSUYUSATO Kitsune <make.just.on@gmail.com>2023-12-02 13:00:11 +0900
committergit <svn-admin@ruby-lang.org>2023-12-06 20:48:11 +0000
commitcbb941f58a236d95d9e95c3f6dbd4510c04351f0 (patch)
tree50a94da1d96ace7d09392e07944a9fc5b8b2e3dc
parenta57186b9d1b0db3a88e5e9082347903b109f7d0e (diff)
downloadruby-cbb941f58a236d95d9e95c3f6dbd4510c04351f0.tar.gz
[ruby/prism] Fix closing loc for string literals
Fix https://github.com/ruby/prism/pull/1974 https://github.com/ruby/prism/commit/453d403593
-rw-r--r--prism/prism.c6
-rw-r--r--test/prism/errors_test.rb16
2 files changed, 17 insertions, 5 deletions
diff --git a/prism/prism.c b/prism/prism.c
index c751729bda..7eeed37ade 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -13580,7 +13580,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current) {
node = (pm_node_t *) pm_symbol_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped);
} else if (match1(parser, PM_TOKEN_EOF)) {
pm_parser_err_token(parser, &opening, PM_ERR_STRING_LITERAL_TERM);
- node = (pm_node_t *) pm_string_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped);
+ node = (pm_node_t *) pm_string_node_create_unescaped(parser, &opening, &content, &parser->current, &unescaped);
} else {
expect1(parser, PM_TOKEN_STRING_END, PM_ERR_STRING_LITERAL_TERM);
node = (pm_node_t *) pm_string_node_create_unescaped(parser, &opening, &content, &parser->previous, &unescaped);
@@ -13621,7 +13621,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current) {
node = (pm_node_t *) pm_interpolated_symbol_node_create(parser, &opening, &parts, &parser->previous);
} 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->previous);
+ node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->current);
} else {
expect1(parser, PM_TOKEN_STRING_END, PM_ERR_STRING_INTERPOLATED_TERM);
node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->previous);
@@ -13644,7 +13644,7 @@ parse_strings(pm_parser_t *parser, pm_node_t *current) {
node = (pm_node_t *) pm_interpolated_symbol_node_create(parser, &opening, &parts, &parser->previous);
} 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->previous);
+ node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->current);
} else {
expect1(parser, PM_TOKEN_STRING_END, PM_ERR_STRING_INTERPOLATED_TERM);
node = (pm_node_t *) pm_interpolated_string_node_create(parser, &opening, &parts, &parser->previous);
diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb
index 58bb2e3218..eaee10e514 100644
--- a/test/prism/errors_test.rb
+++ b/test/prism/errors_test.rb
@@ -146,10 +146,22 @@ module Prism
]
end
- def test_unterminated_string
- assert_errors expression('"hello'), '"hello', [
+ def test_unterminated_interpolated_string
+ expr = expression('"hello')
+ assert_errors expr, '"hello', [
["expected a closing delimiter for the interpolated string", 0..1]
]
+ assert_equal expr.parts[0].unescaped, "hello"
+ assert_equal expr.closing, ""
+ end
+
+ def test_unterminated_string
+ expr = expression("'hello")
+ assert_errors expr, "'hello", [
+ ["expected a closing delimiter for the string literal", 0..1]
+ ]
+ assert_equal expr.unescaped, "hello"
+ assert_equal expr.closing, ""
end
def test_incomplete_instance_var_string