Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions lib/rdoc/parser/ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ def handle_meta_method_comment(comment, directives, node)
case directive
when 'attr', 'attr_reader', 'attr_writer', 'attr_accessor'
attributes = [param] if param
attributes ||= call_node_name_arguments(node) if is_call_node
attributes ||= call_node_name_arguments(node).compact if is_call_node
rw = directive == 'attr_writer' ? 'W' : directive == 'attr_accessor' ? 'RW' : 'R'
when 'method'
method_name = param if param
Expand Down Expand Up @@ -1232,6 +1232,11 @@ def constant_arguments_names(call_node)
names.all? ? names : nil
end

def call_node_name_arguments(call_node)
names = @scanner.call_node_name_arguments(call_node).compact
names unless names.empty?
end

def symbol_arguments(call_node)
arguments_node = call_node.arguments
return unless arguments_node && arguments_node.arguments.all? { |arg| arg.is_a?(Prism::SymbolNode)}
Expand Down Expand Up @@ -1346,8 +1351,8 @@ def _visit_call_private_constant(call_node)

def _visit_call_attr_reader_writer_accessor(call_node, rw)
return if @scanner.in_proc_block
names = symbol_arguments(call_node)
@scanner.add_attributes(names.map(&:to_s), rw, call_node.location.start_line) if names
return unless names = call_node_name_arguments(call_node)
@scanner.add_attributes(names, rw, call_node.location.start_line)
end

class MethodSignatureVisitor < Prism::Visitor # :nodoc:
Expand Down
52 changes: 40 additions & 12 deletions test/rdoc/parser/ruby_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1580,14 +1580,14 @@ class Foo
# attrs
attr :attr1, :attr2
# readers
attr_reader :reader1, :reader2
attr_reader :reader1, "reader2"
# writers
attr_writer :writer1, :writer2
attr_writer "writer1", :writer2
# accessors
attr_accessor :accessor1, :accessor2
# :stopdoc:
attr :attr3, :attr4
attr_reader :reader3, :reader4
attr_reader :reader3, "reader4"
attr_writer :write3, :writer4
attr_accessor :accessor3, :accessor4
end
Expand All @@ -1614,16 +1614,44 @@ class Foo
assert_equal [@top_level] * 8, [a1, a2, r1, r2, w1, w2, rw1, rw2].map(&:file)
end

def test_undocumentable_attributes
def test_ignored_undocumentable_attributes
util_parser <<~RUBY
class Foo
attr
attr 42, :foo
# attrs
attr :attr1, *ignored1, :attr2, (ignored2), kwarg: :ignored3
# readers
attr_reader ignored3, :reader1, ignored4, :reader2, kw: ignored5
# writers
attr_writer :writer1, *%i[ignored6], :writer2, kwarg: :ignored7
# accessors
attr_accessor ignored8, :accessor1, (:ignored9), :accessor2, kw: :ignored10
# ignored
attr ignored11
attr_reader ignored12
attr_writer ignored13
attr_accessor ignored14
end
RUBY
klass = @store.find_class_named 'Foo'
assert_empty klass.method_list
assert_empty klass.attributes
assert_equal 8, klass.attributes.size
a1, a2, r1, r2, w1, w2, rw1, rw2 = klass.attributes
assert_equal ['attr1', 'attr2'], [a1.name, a2.name]
assert_equal ['reader1', 'reader2'], [r1.name, r2.name]
assert_equal ['writer1', 'writer2'], [w1.name, w2.name]
assert_equal ['accessor1', 'accessor2'], [rw1.name, rw2.name]
assert_equal ['R', 'R'], [a1.rw, a2.rw]
assert_equal ['R', 'R'], [r1.rw, r2.rw]
assert_equal ['W', 'W'], [w1.rw, w2.rw]
assert_equal ['RW', 'RW'], [rw1.rw, rw2.rw]
assert_equal ['attrs', 'attrs'], [a1.comment.text, a2.comment.text]
assert_equal ['readers', 'readers'], [r1.comment.text, r2.comment.text]
assert_equal ['writers', 'writers'], [w1.comment.text, w2.comment.text]
assert_equal ['accessors', 'accessors'], [rw1.comment.text, rw2.comment.text]
assert_equal [3, 3], [a1.line, a2.line]
assert_equal [5, 5], [r1.line, r2.line]
assert_equal [7, 7], [w1.line, w2.line]
assert_equal [9, 9], [rw1.line, rw2.line]
assert_equal [@top_level] * 8, [a1, a2, r1, r2, w1, w2, rw1, rw2].map(&:file)
end

def test_singleton_class_attributes
Expand Down Expand Up @@ -1727,19 +1755,19 @@ class Foo
##
# :attr:
# attrs
add_my_method :attr1, :attr2
add_my_method :attr1, "attr2", (ignored)
##
# :attr_reader:
# readers
add_my_method :reader1, :reader2
add_my_method :reader1, ignored, "reader2"
##
# :attr_writer:
# writers
add_my_method :writer1, :writer2
add_my_method :writer1, :writer2, kwarg: ignored
##
# :attr_accessor:
# accessors
add_my_method :accessor1, :accessor2
add_my_method ignored, :accessor1, :accessor2

# :stopdoc:

Expand Down