summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraycabta <aycabta@gmail.com>2021-06-29 20:01:46 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-07-05 11:34:29 +0900
commitcaa123b50e12c5ea95763d7661adb6096e48df21 (patch)
tree9d52cf3f968289d64dd2eb44f23dde4444de18f3
parent2f3edf28f3a251bac2cf3b47b46b372faac71e8e (diff)
[ruby/rdoc] Support ActiveSupport::Concern.included
ref. https://github.com/rails/rails/blob/168ddaa08a63cd956bb7c3ba10be1a7ae36d4ee2/activerecord/lib/active_record/core.rb#L9-L20 https://github.com/ruby/rdoc/commit/a2d651dade Co-authored-by: Fumiaki MATSUSHIMA <mtsmfm@gmail.com>
-rw-r--r--lib/rdoc/parser/ruby.rb18
-rw-r--r--test/rdoc/test_rdoc_parser_ruby.rb48
2 files changed, 66 insertions, 0 deletions
diff --git a/lib/rdoc/parser/ruby.rb b/lib/rdoc/parser/ruby.rb
index 8d021f3c6d..e546fe2141 100644
--- a/lib/rdoc/parser/ruby.rb
+++ b/lib/rdoc/parser/ruby.rb
@@ -1194,6 +1194,22 @@ class RDoc::Parser::Ruby < RDoc::Parser
end
##
+ # Parses an +included+ with a block feature of ActiveSupport::Concern.
+
+ def parse_included_with_activesupport_concern container, comment # :nodoc:
+ skip_tkspace_without_nl
+ tk = get_tk
+ unless tk[:kind] == :on_lbracket || (tk[:kind] == :on_kw && tk[:text] == 'do')
+ unget_tk tk
+ return nil # should be a block
+ end
+
+ parse_statements container
+
+ container
+ end
+
+ ##
# Parses identifiers that can create new methods or change visibility.
#
# Returns true if the comment was not consumed.
@@ -1893,6 +1909,8 @@ class RDoc::Parser::Ruby < RDoc::Parser
parse_extend_or_include RDoc::Include, container, comment
when "extend" then
parse_extend_or_include RDoc::Extend, container, comment
+ when "included" then
+ parse_included_with_activesupport_concern container, comment
end
else
diff --git a/test/rdoc/test_rdoc_parser_ruby.rb b/test/rdoc/test_rdoc_parser_ruby.rb
index 0c81906090..337cf9ea1a 100644
--- a/test/rdoc/test_rdoc_parser_ruby.rb
+++ b/test/rdoc/test_rdoc_parser_ruby.rb
@@ -4297,4 +4297,52 @@ end
assert_equal 'A::D', a_d.full_name
end
+ def test_parse_included
+ util_parser <<-CLASS
+module A
+ module B
+ extend ActiveSupport::Concern
+ included do
+ ##
+ # :singleton-method:
+ # Hello
+ mattr_accessor :foo
+ end
+ end
+end
+ CLASS
+
+ @parser.scan
+
+ a = @store.find_module_named 'A'
+ assert_equal 'A', a.full_name
+ a_b = a.find_module_named 'B'
+ assert_equal 'A::B', a_b.full_name
+ meth = a_b.method_list.first
+ assert_equal 'foo', meth.name
+ assert_equal 'Hello', meth.comment.text
+ end
+
+ def test_end_that_doesnt_belong_to_class_doesnt_change_visibility
+ util_parser <<-CLASS
+class A
+ private
+
+ begin
+ end
+
+ # Hello
+ def foo() end
+end
+ CLASS
+
+ @parser.scan
+
+ a = @store.find_class_named 'A'
+ assert_equal 'A', a.full_name
+ assert_equal 'foo', a.find_method_named('foo').name
+ meth = a.method_list.first
+ assert_equal 'Hello', meth.comment.text
+ end
+
end