[前][次][番号順一覧][スレッド一覧]

ruby-changes:72079

From: Nobuyoshi <ko1@a...>
Date: Tue, 7 Jun 2022 10:42:25 +0900 (JST)
Subject: [ruby-changes:72079] dbfb3b1917 (master): [ruby/rdoc] Allow boolean arguments to `rb_attr` and `rb_define_attr`

https://git.ruby-lang.org/ruby.git/commit/?id=dbfb3b1917

From dbfb3b1917dbe89816ffeea6046d2743c32bf6b6 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Tue, 7 Jun 2022 09:18:35 +0900
Subject: [ruby/rdoc] Allow boolean arguments to `rb_attr` and `rb_define_attr`

Currently only literal `0` and `1` are accepted as `read`/`write`
flags.
This patch allows other boolean arguments, C macros (`FALSE`/`TRUE`),
Ruby `VALUE`s (`Qfalse`/`Qtrue`), and C99 `bool`s (`false`/`true`), as
well.

https://github.com/ruby/rdoc/commit/169dc02e3c
---
 lib/rdoc/parser/c.rb            | 21 ++++++----
 test/rdoc/test_rdoc_parser_c.rb | 89 +++++++++--------------------------------
 2 files changed, 32 insertions(+), 78 deletions(-)

diff --git a/lib/rdoc/parser/c.rb b/lib/rdoc/parser/c.rb
index b1bbf22f16..3f7871b174 100644
--- a/lib/rdoc/parser/c.rb
+++ b/lib/rdoc/parser/c.rb
@@ -122,6 +122,11 @@ class RDoc::Parser::C < RDoc::Parser https://github.com/ruby/ruby/blob/trunk/lib/rdoc/parser/c.rb#L122
 
   include RDoc::Text
 
+  #--
+  BOOL_ARG_PATTERN = /\s*+\b([01]|Q?(?:true|false)|TRUE|FALSE)\b\s*/
+  TRUE_VALUES = ['1', 'TRUE', 'true', 'Qtrue'].freeze
+  #++
+
   ##
   # Maps C variable names to names of Ruby classes or modules
 
@@ -259,18 +264,18 @@ class RDoc::Parser::C < RDoc::Parser https://github.com/ruby/ruby/blob/trunk/lib/rdoc/parser/c.rb#L264
     @content.scan(/rb_attr\s*\(
                    \s*(\w+),
                    \s*([\w"()]+),
-                   \s*([01]),
-                   \s*([01]),
-                   \s*\w+\);/xm) do |var_name, attr_name, read, write|
+                   #{BOOL_ARG_PATTERN},
+                   #{BOOL_ARG_PATTERN},
+                   \s*\w+\);/xmo) do |var_name, attr_name, read, write|
       handle_attr var_name, attr_name, read, write
     end
 
     @content.scan(%r%rb_define_attr\(
                              \s*([\w\.]+),
                              \s*"([^"]+)",
-                             \s*(\d+),
-                             \s*(\d+)\s*\);
-                %xm) do |var_name, attr_name, read, write|
+                             #{BOOL_ARG_PATTERN},
+                             #{BOOL_ARG_PATTERN}\);
+                %xmo) do |var_name, attr_name, read, write|
       handle_attr var_name, attr_name, read, write
     end
   end
@@ -815,8 +820,8 @@ class RDoc::Parser::C < RDoc::Parser https://github.com/ruby/ruby/blob/trunk/lib/rdoc/parser/c.rb#L820
 
   def handle_attr(var_name, attr_name, read, write)
     rw = ''
-    rw += 'R' if '1' == read
-    rw += 'W' if '1' == write
+    rw += 'R' if TRUE_VALUES.include?(read)
+    rw += 'W' if TRUE_VALUES.include?(write)
 
     class_name = @known_classes[var_name]
 
diff --git a/test/rdoc/test_rdoc_parser_c.rb b/test/rdoc/test_rdoc_parser_c.rb
index d3138d23aa..c7312bebba 100644
--- a/test/rdoc/test_rdoc_parser_c.rb
+++ b/test/rdoc/test_rdoc_parser_c.rb
@@ -132,7 +132,7 @@ class TestRDocParserC < RDoc::TestCase https://github.com/ruby/ruby/blob/trunk/test/rdoc/test_rdoc_parser_c.rb#L132
     assert_equal expected, known_classes
   end
 
-  def test_do_attr_rb_attr
+  def assert_do_attr(flags)
     content = <<-EOF
 void Init_Blah(void) {
   cBlah = rb_define_class("Blah", rb_cObject);
@@ -140,17 +140,17 @@ void Init_Blah(void) { https://github.com/ruby/ruby/blob/trunk/test/rdoc/test_rdoc_parser_c.rb#L140
   /*
    * This is an accessor
    */
-  rb_attr(cBlah, rb_intern("accessor"), 1, 1, Qfalse);
+  #{yield "cBlah", "accessor", flags[1], flags[1]};
 
   /*
    * This is a reader
    */
-  rb_attr(cBlah, rb_intern("reader"), 1, 0, Qfalse);
+  #{yield "cBlah", "reader", flags[1], flags[0]};
 
   /*
    * This is a writer
    */
-  rb_attr(cBlah, rb_intern("writer"), 0, 1, Qfalse);
+  #{yield "cBlah", "writer", flags[0], flags[1]};
 }
     EOF
 
@@ -176,72 +176,21 @@ void Init_Blah(void) { https://github.com/ruby/ruby/blob/trunk/test/rdoc/test_rdoc_parser_c.rb#L176
     assert_equal 'This is a writer', writer.comment.text
   end
 
-  def test_do_attr_rb_attr_2
-    content = <<-EOF
-void Init_Blah(void) {
-  cBlah = rb_define_class("Blah", rb_cObject);
-
-  /*
-   * This is an accessor
-   */
-  rb_attr(cBlah, rb_intern_const("accessor"), 1, 1, Qfalse);
-
-  /*
-   * This is a reader
-   */
-  rb_attr(cBlah, rb_intern_const("reader"), 1, 0, Qfalse);
-
-  /*
-   * This is a writer
-   */
-  rb_attr(cBlah, rb_intern_const("writer"), 0, 1, Qfalse);
-}
-    EOF
-
-    klass = util_get_class content, 'cBlah'
-
-    attrs = klass.attributes
-    assert_equal 3, attrs.length, attrs.inspect
-
-    accessor = attrs.shift
-    assert_equal 'accessor',            accessor.name
-    assert_equal 'RW',                  accessor.rw
-    assert_equal 'This is an accessor', accessor.comment.text
-    assert_equal @top_level,            accessor.file
-
-    reader = attrs.shift
-    assert_equal 'reader',           reader.name
-    assert_equal 'R',                reader.rw
-    assert_equal 'This is a reader', reader.comment.text
-
-    writer = attrs.shift
-    assert_equal 'writer',           writer.name
-    assert_equal 'W',                writer.rw
-    assert_equal 'This is a writer', writer.comment.text
-  end
-
-  def test_do_attr_rb_define_attr
-    content = <<-EOF
-void Init_Blah(void) {
-  cBlah = rb_define_class("Blah", rb_cObject);
-
-  /*
-   * This is an accessor
-   */
-  rb_define_attr(cBlah, "accessor", 1, 1);
-}
-    EOF
-
-    klass = util_get_class content, 'cBlah'
-
-    attrs = klass.attributes
-    assert_equal 1, attrs.length, attrs.inspect
-
-    accessor = attrs.shift
-    assert_equal 'accessor',            accessor.name
-    assert_equal 'RW',                  accessor.rw
-    assert_equal 'This is an accessor', accessor.comment.text
-    assert_equal @top_level,            accessor.file
+  {
+    num: %w[0 1],
+    macro: %w[FALSE TRUE],
+    ruby: %w[Qfalse Qtrue],
+    bool: %w[false true],
+  }.each_pair do |name, values|
+    define_method("test_do_attr:rb_attr:intern:#{name}") do
+      assert_do_attr(values) {|c, name, r, w| %[rb_attr(#{c}, rb_intern("#{name}"), #{r}, #{w}, Qfalse)]}
+    end
+    define_method("test_do_attr:rb_attr:intern_const:#{name}") do
+      assert_do_attr(values) {|c, name, r, w| %[rb_attr(#{c}, rb_intern_const("#{name}"), #{r}, #{w}, Qfalse)]}
+    end
+    define_method("test_do_attr:rb_define_attr:#{name}") do
+      assert_do_attr(values) {|c, name, r, w| %[rb_define_attr(#{c}, "#{name}", #{r}, #{w})]}
+    end
   end
 
   def test_do_aliases
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]