ruby-changes:59347
From: Nobuyoshi <ko1@a...>
Date: Sat, 21 Dec 2019 00:07:14 +0900 (JST)
Subject: [ruby-changes:59347] 07e595fdbd (master): Added `experimental` warning category
https://git.ruby-lang.org/ruby.git/commit/?id=07e595fdbd From 07e595fdbd75ed44473073cdf8cd758572d11709 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada <nobu@r...> Date: Fri, 20 Dec 2019 23:48:15 +0900 Subject: Added `experimental` warning category [Feature #16420] diff --git a/error.c b/error.c index e662b4f..a70d021 100644 --- a/error.c +++ b/error.c @@ -144,6 +144,9 @@ rb_warning_category_from_name(VALUE category) https://github.com/ruby/ruby/blob/trunk/error.c#L144 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); } diff --git a/internal.h b/internal.h index 2812b63..baefb36 100644 --- a/internal.h +++ b/internal.h @@ -1558,6 +1558,7 @@ PRINTF_ARGS(void rb_syserr_enc_warning(int err, rb_encoding *enc, const char *fm https://github.com/ruby/ruby/blob/trunk/internal.h#L1558 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); diff --git a/parse.y b/parse.y index 3aaa291..6d9bfc9 100644 --- a/parse.y +++ b/parse.y @@ -11457,7 +11457,8 @@ new_case3(struct parser_params *p, NODE *val, NODE *pat, const YYLTYPE *loc) https://github.com/ruby/ruby/blob/trunk/parse.y#L11457 { 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; } diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index b1f4681..df7a4e7 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -1266,6 +1266,7 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status| https://github.com/ruby/ruby/blob/trunk/test/ruby/test_exception.rb#L1266 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 diff --git a/test/ruby/test_pattern_matching.rb b/test/ruby/test_pattern_matching.rb index 5308ec3..dc72aa0 100644 --- a/test/ruby/test_pattern_matching.rb +++ b/test/ruby/test_pattern_matching.rb @@ -1,7 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/test/ruby/test_pattern_matching.rb#L1 # 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 @@ -92,7 +92,8 @@ class TestPatternMatching < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_pattern_matching.rb#L92 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 @@ -100,7 +101,7 @@ class TestPatternMatching < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_pattern_matching.rb#L101 end }) ensure - $VERBOSE = verbose + Warning[:experimental] = experimental end assert_block do @@ -1274,6 +1275,23 @@ END https://github.com/ruby/ruby/blob/trunk/test/ruby/test_pattern_matching.rb#L1275 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 -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/