summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-27 13:40:38 -0400
committerKevin Newton <kddnewton@gmail.com>2024-03-27 14:19:58 -0400
commitab2ee308aa5f26bd28b6d9de4dc3a24483ff333a (patch)
tree42662e637e29086e16886e9786c98848b9058f73
parenteb995a64108d18fb809f02fa90e085f843ae4309 (diff)
[PRISM] Match style for invalid encoding error
-rw-r--r--prism_compile.c25
-rw-r--r--test/.excludes-prism/TestParse.rb1
-rw-r--r--test/ruby/test_parse.rb10
3 files changed, 32 insertions, 4 deletions
diff --git a/prism_compile.c b/prism_compile.c
index 1027a2c062..848a5d4ecd 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -8385,7 +8385,30 @@ pm_parse_process_error(const pm_parse_result_t *result)
// over as the only argument that gets raised. This is to allow priority
// messages that should be handled before anything else.
if (error->level == PM_ERROR_LEVEL_ARGUMENT) {
- return rb_exc_new(rb_eArgError, error->message, strlen(error->message));
+ int32_t line_number = (int32_t) pm_location_line_number(parser, &error->location);
+
+ pm_buffer_append_format(
+ &buffer,
+ "%.*s:%" PRIi32 ": %s",
+ (int) pm_string_length(filepath),
+ pm_string_source(filepath),
+ line_number,
+ error->message
+ );
+
+ if (pm_parse_process_error_utf8_p(parser, &error->location)) {
+ pm_buffer_append_byte(&buffer, '\n');
+
+ pm_list_node_t *list_node = (pm_list_node_t *) error;
+ pm_list_t error_list = { .size = 1, .head = list_node, .tail = list_node };
+
+ pm_parser_errors_format(parser, &error_list, &buffer, rb_stderr_tty_p(), false);
+ }
+
+ VALUE arg_error = rb_exc_new(rb_eArgError, pm_buffer_value(&buffer), pm_buffer_length(&buffer));
+ pm_buffer_free(&buffer);
+
+ return arg_error;
}
// It is implicitly assumed that the error messages will be encodeable
diff --git a/test/.excludes-prism/TestParse.rb b/test/.excludes-prism/TestParse.rb
index 87694ac15a..d832970d76 100644
--- a/test/.excludes-prism/TestParse.rb
+++ b/test/.excludes-prism/TestParse.rb
@@ -1,5 +1,4 @@
exclude(:test_assign_in_conditional, "missing warning")
-exclude(:test_magic_comment, "incorrect encoding")
exclude(:test_shareable_constant_value_nested, "ractor support")
exclude(:test_shareable_constant_value_nonliteral, "ractor support")
exclude(:test_shareable_constant_value_simple, "ractor support")
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 62498170fd..e365c39def 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -803,14 +803,20 @@ x = __ENCODING__
# coding: foo
END
end
- assert_include(e.message, "# coding: foo\n ^~~")
+
+ message = e.message.gsub(/\033\[.*?m/, "")
+ assert_include(message, "# coding: foo\n")
+ assert_include(message, " ^")
e = assert_raise(ArgumentError) do
eval <<-END, nil, __FILE__, __LINE__+1
# coding = foo
END
end
- assert_include(e.message, "# coding = foo\n ^~~")
+
+ message = e.message.gsub(/\033\[.*?m/, "")
+ assert_include(message, "# coding = foo\n")
+ assert_include(message, " ^")
end
def test_utf8_bom