diff options
| author | Kevin Newton <kddnewton@gmail.com> | 2024-03-27 13:40:38 -0400 |
|---|---|---|
| committer | Kevin Newton <kddnewton@gmail.com> | 2024-03-27 14:19:58 -0400 |
| commit | ab2ee308aa5f26bd28b6d9de4dc3a24483ff333a (patch) | |
| tree | 42662e637e29086e16886e9786c98848b9058f73 | |
| parent | eb995a64108d18fb809f02fa90e085f843ae4309 (diff) | |
[PRISM] Match style for invalid encoding error
| -rw-r--r-- | prism_compile.c | 25 | ||||
| -rw-r--r-- | test/.excludes-prism/TestParse.rb | 1 | ||||
| -rw-r--r-- | test/ruby/test_parse.rb | 10 |
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 |
