From 8a21db17b41c35f83778716b4b3d64ea32bff39e Mon Sep 17 00:00:00 2001 From: "Stanislav (Stas) Katkov" Date: Wed, 22 Jul 2026 16:36:43 +0200 Subject: [PATCH 1/3] Parse methods inside ActiveSupport::Concern included blocks --- lib/rdoc/parser/ruby.rb | 6 ++++++ test/rdoc/parser/ruby_test.rb | 16 ++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/rdoc/parser/ruby.rb b/lib/rdoc/parser/ruby.rb index 55bfefae1e..77fb1b8287 100644 --- a/lib/rdoc/parser/ruby.rb +++ b/lib/rdoc/parser/ruby.rb @@ -892,6 +892,12 @@ def visit_call_node(node) _visit_call_include(node) when :extend _visit_call_extend(node) + when :included + if node.block + node.block.body&.accept(self) + else + super + end when :public super _visit_call_public_private_protected(node, :public) diff --git a/test/rdoc/parser/ruby_test.rb b/test/rdoc/parser/ruby_test.rb index 99b99e5065..784aada08f 100644 --- a/test/rdoc/parser/ruby_test.rb +++ b/test/rdoc/parser/ruby_test.rb @@ -757,6 +757,22 @@ def baz1; end assert_equal ['comment foo', 'comment bar'], methods.take(2).map { |m| m.comment.text.strip } end + def test_method_definition_inside_active_support_concern_included_block + util_parser <<~RUBY + module A + extend ActiveSupport::Concern + included do + # Returns the configuration. + def self.configurations; end + end + end + RUBY + + mod = @store.find_module_named 'A' + assert_equal ['A::configurations'], mod.method_list.map(&:full_name) + assert_equal ['Returns the configuration.'], mod.method_list.map { |method| method.comment.text.strip } + end + def test_method_yields_directive util_parser <<~RUBY class Foo From 6ba20415bbc0434bc927f1aa48fb932dc0999eae Mon Sep 17 00:00:00 2001 From: "Stanislav (Stas) Katkov" Date: Wed, 22 Jul 2026 17:28:51 +0200 Subject: [PATCH 2/3] Simplify included block dispatch --- lib/rdoc/parser/ruby.rb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/rdoc/parser/ruby.rb b/lib/rdoc/parser/ruby.rb index 77fb1b8287..4d9402001a 100644 --- a/lib/rdoc/parser/ruby.rb +++ b/lib/rdoc/parser/ruby.rb @@ -893,11 +893,7 @@ def visit_call_node(node) when :extend _visit_call_extend(node) when :included - if node.block - node.block.body&.accept(self) - else - super - end + node.block ? node.block.body&.accept(self) : super when :public super _visit_call_public_private_protected(node, :public) From f848a73d2fae7185c877c315e9c15fae2ba34b62 Mon Sep 17 00:00:00 2001 From: "Stanislav (Stas) Katkov" Date: Wed, 22 Jul 2026 17:29:31 +0200 Subject: [PATCH 3/3] Consolidate concern block test --- test/rdoc/parser/ruby_test.rb | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/test/rdoc/parser/ruby_test.rb b/test/rdoc/parser/ruby_test.rb index 784aada08f..45f4358018 100644 --- a/test/rdoc/parser/ruby_test.rb +++ b/test/rdoc/parser/ruby_test.rb @@ -739,6 +739,9 @@ module A # :method: bar # comment bar add_my_method :bar + + # Returns the configuration. + def self.configurations; end end metaprogramming do @@ -753,24 +756,8 @@ def baz1; end RUBY mod = @store.find_module_named 'A' methods = mod.method_list - assert_equal ['A::foo', 'A#bar', 'A::baz2', 'A#baz3'], methods.map(&:full_name) - assert_equal ['comment foo', 'comment bar'], methods.take(2).map { |m| m.comment.text.strip } - end - - def test_method_definition_inside_active_support_concern_included_block - util_parser <<~RUBY - module A - extend ActiveSupport::Concern - included do - # Returns the configuration. - def self.configurations; end - end - end - RUBY - - mod = @store.find_module_named 'A' - assert_equal ['A::configurations'], mod.method_list.map(&:full_name) - assert_equal ['Returns the configuration.'], mod.method_list.map { |method| method.comment.text.strip } + assert_equal ['A::foo', 'A#bar', 'A::configurations', 'A::baz2', 'A#baz3'], methods.map(&:full_name) + assert_equal ['comment foo', 'comment bar', 'Returns the configuration.'], methods.take(3).map { |m| m.comment.text.strip } end def test_method_yields_directive