Skip to content

Commit

Permalink
Added experimental warning category
Browse files Browse the repository at this point in the history
[Feature #16420]
  • Loading branch information
nobu committed Dec 20, 2019
1 parent dd7f0c8 commit 07e595f
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 5 deletions.
3 changes: 3 additions & 0 deletions error.c
Expand Up @@ -144,6 +144,9 @@ rb_warning_category_from_name(VALUE category)
if (category == ID2SYM(rb_intern("deprecated"))) {
cat = RB_WARN_CATEGORY_DEPRECATED;
}
else if (category == ID2SYM(rb_intern("experimental"))) {
cat = RB_WARN_CATEGORY_EXPERIMENTAL;
}
else {
rb_raise(rb_eArgError, "unknown category: %"PRIsVALUE, category);
}
Expand Down
1 change: 1 addition & 0 deletions internal.h
Expand Up @@ -1558,6 +1558,7 @@ PRINTF_ARGS(void rb_syserr_enc_warning(int err, rb_encoding *enc, const char *fm
typedef enum {
RB_WARN_CATEGORY_NONE,
RB_WARN_CATEGORY_DEPRECATED,
RB_WARN_CATEGORY_EXPERIMENTAL,
} rb_warning_category_t;
rb_warning_category_t rb_warning_category_from_name(VALUE category);
bool rb_warning_category_enabled_p(rb_warning_category_t category);
Expand Down
3 changes: 2 additions & 1 deletion parse.y
Expand Up @@ -11457,7 +11457,8 @@ new_case3(struct parser_params *p, NODE *val, NODE *pat, const YYLTYPE *loc)
{
NODE *node = NEW_CASE3(val, pat, loc);

rb_warn0L(nd_line(node), "Pattern matching is experimental, and the behavior may change in future versions of Ruby!");
if (rb_warning_category_enabled_p(RB_WARN_CATEGORY_EXPERIMENTAL))
rb_warn0L(nd_line(node), "Pattern matching is experimental, and the behavior may change in future versions of Ruby!");
return node;
}

Expand Down
1 change: 1 addition & 0 deletions test/ruby/test_exception.rb
Expand Up @@ -1266,6 +1266,7 @@ def test_warning_category
assert_raise(TypeError) {Warning[nil]}
assert_raise(ArgumentError) {Warning[:XXXX]}
assert_include([true, false], Warning[:deprecated])
assert_include([true, false], Warning[:experimental])
end

def test_undefined_backtrace
Expand Down
26 changes: 22 additions & 4 deletions test/ruby/test_pattern_matching.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
require 'test/unit'

verbose, $VERBOSE = $VERBOSE, nil # suppress "warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!"
experimental, Warning[:experimental] = Warning[:experimental], false # suppress "warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!"
eval "\n#{<<~'END_of_GUARD'}", binding, __FILE__, __LINE__
class TestPatternMatching < Test::Unit::TestCase
class C
Expand Down Expand Up @@ -92,15 +92,16 @@ def test_basic
end
assert_block do
verbose, $VERBOSE = $VERBOSE, nil # suppress "warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!"
# suppress "warning: Pattern matching is experimental, and the behavior may change in future versions of Ruby!"
experimental, Warning[:experimental] = Warning[:experimental], false
eval(%q{
case true
in a
a
end
})
ensure
$VERBOSE = verbose
Warning[:experimental] = experimental
end
assert_block do
Expand Down Expand Up @@ -1274,6 +1275,23 @@ def test_modifier_in
1 in a:
}, /unexpected/, '[ruby-core:95098]')
end
def assert_experimental_warning(code)
w = Warning[:experimental]
Warning[:experimental] = false
assert_warn('') {eval(code)}
Warning[:experimental] = true
assert_warn(/Pattern matching is experimental/) {eval(code)}
ensure
Warning[:experimental] = w
end
def test_experimental_warning
assert_experimental_warning("case 0; in 0; end")
assert_experimental_warning("0 in 0")
end
end
END_of_GUARD
$VERBOSE = verbose
Warning[:experimental] = experimental

0 comments on commit 07e595f

Please sign in to comment.