diff options
author | eileencodes <[email protected]> | 2020-09-02 08:56:13 -0400 |
---|---|---|
committer | Jeremy Evans <[email protected]> | 2020-09-02 12:44:33 -0700 |
commit | eada6350332155972f19bad52bd8621f607520a2 (patch) | |
tree | b3319fee4018ff028344d2c5c0424883c049ec07 | |
parent | 54fb8fb62a30c7b60ab6443a62821f6f8bc479c4 (diff) |
Add category to `rb_warn_deprecated`
PR https://github.com/ruby/ruby/pull/3418 added a category to
`rb_warn_deprecated_to_remove` but not to `rb_warn_deprecated`. This
adds the same code to `rb_warn_deprecated` so that those warnings also
get a category.
This change also adds tests for `rb_warn_deprecated` and updates the
tests for `rb_warn_deprecated_to_remove` to have clearer names.
I've fixed the call to `rb_method_entry` as we need to be using the
instance method, not singleton.
Feature: https://bugs.ruby-lang.org/issues/17122
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3505
-rw-r--r-- | error.c | 19 | ||||
-rw-r--r-- | test/ruby/test_exception.rb | 16 |
2 files changed, 31 insertions, 4 deletions
@@ -392,7 +392,22 @@ rb_warn_deprecated(const char *fmt, const char *suggest, ...) rb_str_cat_cstr(mesg, " is deprecated"); if (suggest) rb_str_catf(mesg, "; use %s instead", suggest); rb_str_cat_cstr(mesg, "\n"); - rb_write_warning_str(mesg); + + VALUE warn_args[2]; + warn_args[0] = mesg; + + const rb_method_entry_t * me; + me = rb_method_entry(rb_singleton_class(rb_mWarning), id_warn); + + if (rb_method_entry_arity(me) != 1) { + VALUE kwargs = rb_hash_new(); + rb_hash_aset(kwargs, ID2SYM(rb_intern("category")), ID2SYM(rb_intern("deprecated"))); + warn_args[1] = kwargs; + + rb_funcallv_kw(rb_mWarning, id_warn, 2, warn_args, RB_PASS_KEYWORDS); + } else { + rb_funcall(rb_mWarning, id_warn, 1, mesg); + } } void @@ -411,7 +426,7 @@ rb_warn_deprecated_to_remove(const char *fmt, const char *removal, ...) warn_args[0] = mesg; const rb_method_entry_t * me; - me = rb_method_entry(rb_mWarning, id_warn); + me = rb_method_entry(rb_singleton_class(rb_mWarning), id_warn); if (rb_method_entry_arity(me) != 1) { VALUE kwargs = rb_hash_new(); diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index a89aed8806..120b041830 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -960,13 +960,25 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status| assert_equal(["\n"], capture_warning_warn {warn ""}) end - def test_warn_backwards_compatibility + def test_warn_deprecated_backwards_compatibility_category + warning = capture_warning_warn { Dir.exists?("non-existent") } + + assert_match(/deprecated/, warning[0]) + end + + def test_warn_deprecated_category + warning = capture_warning_warn(category: true) { Dir.exists?("non-existent") } + + assert_equal :deprecated, warning[0][1] + end + + def test_warn_deprecated_to_remove_backwards_compatibility_category warning = capture_warning_warn { Object.new.tainted? } assert_match(/deprecated/, warning[0]) end - def test_warn_category + def test_warn_deprecated_to_remove_category warning = capture_warning_warn(category: true) { Object.new.tainted? } assert_equal :deprecated, warning[0][1] |