Skip to content

Support constant visibility #506

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 29, 2017
Merged
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
4 changes: 2 additions & 2 deletions lib/rdoc/constant.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def initialize(name, value, comment)
@value = value

@is_alias_for = nil
@visibility = nil
@visibility = :public

self.comment = comment
end
Expand Down Expand Up @@ -136,7 +136,7 @@ def marshal_load array
initialize array[1], nil, array[5]

@full_name = array[2]
@visibility = array[3]
@visibility = array[3] || :public
@is_alias_for = array[4]
# 5 handled above
# 6 handled below
Expand Down
12 changes: 12 additions & 0 deletions lib/rdoc/context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1079,6 +1079,7 @@ def remove_invisible min_visibility
return if [:private, :nodoc].include? min_visibility
remove_invisible_in @method_list, min_visibility
remove_invisible_in @attributes, min_visibility
remove_invisible_in @constants, min_visibility
end

##
Expand Down Expand Up @@ -1165,6 +1166,17 @@ def set_visibility_for(methods, visibility, singleton = false)
end
end

##
# Given an array +names+ of constants, set the visibility of each constant to
# +visibility+

def set_constant_visibility_for(names, visibility)
names.each do |name|
constant = @constants_hash[name] or next
constant.visibility = visibility
end
end

##
# Sorts sections alphabetically (default) or in TomDoc fashion (none,
# Public, Internal, Deprecated)
Expand Down
20 changes: 20 additions & 0 deletions lib/rdoc/parser/ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
# * aliases
# * private, public, protected
# * private_class_function, public_class_function
# * private_constant, public_constant
# * module_function
# * attr, attr_reader, attr_writer, attr_accessor
# * extra accessors given on the command line
Expand Down Expand Up @@ -1084,6 +1085,9 @@ def parse_identifier container, single, tk, comment # :nodoc:
'public_class_method', 'module_function' then
parse_visibility container, single, tk
return true
when 'private_constant', 'public_constant'
parse_constant_visibility container, single, tk
return true
when 'attr' then
parse_attr container, single, tk, comment
when /^attr_(reader|writer|accessor)$/ then
Expand Down Expand Up @@ -1888,6 +1892,22 @@ def parse_visibility(container, single, tk)
end
end

##
# Parses a Module#private_constant or Module#public_constant call from +tk+.

def parse_constant_visibility(container, single, tk)
args = parse_symbol_arg
case tk.name
when 'private_constant'
vis = :private
when 'public_constant'
vis = :public
else
raise RDoc::Error, 'Unreachable'
end
container.set_constant_visibility_for args, vis
end

##
# Determines the block parameter for +context+

Expand Down
6 changes: 3 additions & 3 deletions test/test_rdoc_constant.rb
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def test_marshal_dump
assert_equal top_level, loaded.file
assert_equal 'Klass::CONST', loaded.full_name
assert_equal 'CONST', loaded.name
assert_nil loaded.visibility
assert_equal :public, loaded.visibility
assert_equal cm, loaded.parent
assert_equal section, loaded.section
end
Expand Down Expand Up @@ -114,7 +114,7 @@ def test_marshal_load
assert_equal top_level, loaded.file
assert_equal 'Klass::CONST', loaded.full_name
assert_equal 'CONST', loaded.name
assert_nil loaded.visibility
assert_equal :public, loaded.visibility
assert_equal cm, loaded.parent
assert_equal section, loaded.section

Expand Down Expand Up @@ -146,7 +146,7 @@ def test_marshal_load_version_0
assert_equal top_level, loaded.file
assert_equal 'Klass::CONST', loaded.full_name
assert_equal 'CONST', loaded.name
assert_nil loaded.visibility
assert_equal :public, loaded.visibility
assert_equal cm, loaded.parent
assert_equal section, loaded.section

Expand Down
14 changes: 14 additions & 0 deletions test/test_rdoc_context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,7 @@ def test_remove_invisible_private

assert_equal [@pub, @prot, @priv], @vis.method_list
assert_equal [@apub, @aprot, @apriv], @vis.attributes
assert_equal [@cpub, @cpriv], @vis.constants
end

def test_remove_invisible_nodoc
Expand All @@ -728,6 +729,7 @@ def test_remove_invisible_nodoc

assert_equal [@pub, @prot, @priv], @vis.method_list
assert_equal [@apub, @aprot, @apriv], @vis.attributes
assert_equal [@cpub, @cpriv], @vis.constants
end

def test_remove_invisible_protected
Expand All @@ -737,6 +739,7 @@ def test_remove_invisible_protected

assert_equal [@pub, @prot], @vis.method_list
assert_equal [@apub, @aprot], @vis.attributes
assert_equal [@cpub], @vis.constants
end

def test_remove_invisible_public
Expand All @@ -746,6 +749,7 @@ def test_remove_invisible_public

assert_equal [@pub], @vis.method_list
assert_equal [@apub], @vis.attributes
assert_equal [@cpub], @vis.constants
end

def test_remove_invisible_public_force
Expand All @@ -755,11 +759,13 @@ def test_remove_invisible_public_force
@prot.force_documentation = true
@apriv.force_documentation = true
@aprot.force_documentation = true
@cpriv.force_documentation = true

@vis.remove_invisible :public

assert_equal [@pub, @prot, @priv], @vis.method_list
assert_equal [@apub, @aprot, @apriv], @vis.attributes
assert_equal [@cpub, @cpriv], @vis.constants
end

def test_remove_invisible_in_protected
Expand Down Expand Up @@ -922,6 +928,9 @@ def util_visibilities
@aprot = RDoc::Attr.new nil, 'prot', 'RW', nil
@apriv = RDoc::Attr.new nil, 'priv', 'RW', nil

@cpub = RDoc::Constant.new 'CONST_PUBLIC', nil, nil
@cpriv = RDoc::Constant.new 'CONST_PRIVATE', nil, nil

@vis = RDoc::NormalClass.new 'Vis'
@vis.add_method @pub
@vis.add_method @prot
Expand All @@ -931,11 +940,16 @@ def util_visibilities
@vis.add_attribute @aprot
@vis.add_attribute @apriv

@vis.add_constant @cpub
@vis.add_constant @cpriv

@prot.visibility = :protected
@priv.visibility = :private

@aprot.visibility = :protected
@apriv.visibility = :private

@cpriv.visibility = :private
end

end
28 changes: 28 additions & 0 deletions test/test_rdoc_parser_ruby.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3537,6 +3537,34 @@ def m4() end
assert_equal 2, public_method_count
end

def test_scan_constant_visibility
util_parser <<-RUBY
class C
CONST_A = 123

CONST_B = 234
private_constant :CONST_B

CONST_C = 345
public_constant :CONST_C
end
RUBY

@parser.scan

c = @store.find_class_named 'C'
const_a, const_b, const_c, const_d = c.constants.sort_by(&:name)

assert_equal 'CONST_A', const_a.name
assert_equal :public, const_a.visibility

assert_equal 'CONST_B', const_b.name
assert_equal :private, const_b.visibility

assert_equal 'CONST_C', const_c.name
assert_equal :public, const_c.visibility
end

def test_singleton_method_via_eigenclass
util_parser <<-RUBY
class C
Expand Down