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/