[ruby/rdoc] Fix prism_ruby superclass resolve order
(https://github.com/ruby/rdoc/pull/1267) RDoc::Parser::PrismRuby wrongly resolves superclass of `class Cipher < Cipher; end` that exist in openssl. Superclass resolve should be done before adding class. https://github.com/ruby/rdoc/commit/57a4615a92
This commit is contained in:
parent
fb73be1f2a
commit
23018c2fb4
@ -642,14 +642,16 @@ class RDoc::Parser::PrismRuby < RDoc::Parser
|
|||||||
|
|
||||||
owner, name = find_or_create_constant_owner_name(module_name)
|
owner, name = find_or_create_constant_owner_name(module_name)
|
||||||
if is_class
|
if is_class
|
||||||
mod = owner.classes_hash[name] || owner.add_class(RDoc::NormalClass, name, superclass_name || '::Object')
|
|
||||||
|
|
||||||
# RDoc::NormalClass resolves superclass name despite of the lack of module nesting information.
|
# RDoc::NormalClass resolves superclass name despite of the lack of module nesting information.
|
||||||
# We need to fix it when RDoc::NormalClass resolved to a wrong constant name
|
# We need to fix it when RDoc::NormalClass resolved to a wrong constant name
|
||||||
if superclass_name
|
if superclass_name
|
||||||
superclass_full_path = resolve_constant_path(superclass_name)
|
superclass_full_path = resolve_constant_path(superclass_name)
|
||||||
superclass = @store.find_class_or_module(superclass_full_path) if superclass_full_path
|
superclass = @store.find_class_or_module(superclass_full_path) if superclass_full_path
|
||||||
superclass_full_path ||= superclass_name
|
superclass_full_path ||= superclass_name
|
||||||
|
end
|
||||||
|
# add_class should be done after resolving superclass
|
||||||
|
mod = owner.classes_hash[name] || owner.add_class(RDoc::NormalClass, name, superclass_name || '::Object')
|
||||||
|
if superclass_name
|
||||||
if superclass
|
if superclass
|
||||||
mod.superclass = superclass
|
mod.superclass = superclass
|
||||||
elsif mod.superclass.is_a?(String) && mod.superclass != superclass_full_path
|
elsif mod.superclass.is_a?(String) && mod.superclass != superclass_full_path
|
||||||
|
@ -201,6 +201,25 @@ module RDocParserPrismTestCases
|
|||||||
assert_equal ['A::B', 'A::B', 'A::A::B', 'A::B'], classes.drop(1).map(&:superclass).map(&:full_name)
|
assert_equal ['A::B', 'A::B', 'A::A::B', 'A::B'], classes.drop(1).map(&:superclass).map(&:full_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_pseudo_recursive_superclass
|
||||||
|
util_parser <<~RUBY
|
||||||
|
module Foo
|
||||||
|
class Bar
|
||||||
|
class Foo < Bar; end
|
||||||
|
# This class definition is used in OpenSSL::Cipher::Cipher
|
||||||
|
class Bar < Bar; end
|
||||||
|
class Baz < Bar; end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
RUBY
|
||||||
|
foo_klass = @store.find_class_named 'Foo::Bar::Foo'
|
||||||
|
bar_klass = @store.find_class_named 'Foo::Bar::Bar'
|
||||||
|
baz_klass = @store.find_class_named 'Foo::Bar::Baz'
|
||||||
|
assert_equal 'Foo::Bar', foo_klass.superclass.full_name
|
||||||
|
assert_equal 'Foo::Bar', bar_klass.superclass.full_name
|
||||||
|
assert_equal 'Foo::Bar::Bar', baz_klass.superclass.full_name
|
||||||
|
end
|
||||||
|
|
||||||
def test_class_module_nodoc
|
def test_class_module_nodoc
|
||||||
util_parser <<~RUBY
|
util_parser <<~RUBY
|
||||||
class Foo # :nodoc:
|
class Foo # :nodoc:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user