diff --git a/lib/rdoc/parser/c.rb b/lib/rdoc/parser/c.rb index bff5ae5d27..7e89507779 100644 --- a/lib/rdoc/parser/c.rb +++ b/lib/rdoc/parser/c.rb @@ -1052,10 +1052,13 @@ def handle_method(type, var_name, meth_name, function, param_count, # Registers a singleton class +sclass_var+ as a singleton of +class_var+ def handle_singleton(sclass_var, class_var) - class_name = @known_classes[class_var] - - @known_classes[sclass_var] = class_name - @singleton_classes[sclass_var] = class_name + if (klass = @classes[class_var]) + @classes[sclass_var] = klass + end + if (class_name = @known_classes[class_var]) + @known_classes[sclass_var] = class_name + @singleton_classes[sclass_var] = class_name + end end ## diff --git a/test/rdoc/parser/c_test.rb b/test/rdoc/parser/c_test.rb index d0ea7269ea..6794677008 100644 --- a/test/rdoc/parser/c_test.rb +++ b/test/rdoc/parser/c_test.rb @@ -781,6 +781,40 @@ def test_do_methods_singleton_class assert methods.first.singleton end + def test_do_methods_nested_module_singleton_class + parser = util_parser <<~EOF + VALUE baz(VALUE klass, VALUE year) { + } + void Init_Foo(void) { + VALUE mFoo = rb_define_module("Foo"); + VALUE mBar = rb_define_module_under(mFoo, "Bar"); + VALUE mBarS = rb_singleton_class(mBar); + rb_define_method(mBarS, "baz", baz, 0); + } + EOF + parser.scan + + klass = parser.classes['mBarS'] + assert_equal 'Foo::Bar', klass.full_name + assert_equal 'Foo::Bar', parser.singleton_classes['mBarS'] + methods = klass.method_list + assert_equal 1, methods.length + assert_equal 'baz', methods.first.name + assert methods.first.singleton + end + + def test_do_singleton_class_undocumentable + parser = util_parser <<~EOF + void Func(VALUE v) { + VALUE k = rb_singleton_class(v); + rb_define_method(k, "baz", baz, 0); + } + EOF + parser.scan + assert_empty parser.classes + assert_empty parser.singleton_classes + end + def test_do_missing parser = util_parser @@ -1973,7 +2007,8 @@ def test_scan expected = { @fn => { 'mM' => 'M', - 'cC' => 'C', }} + 'cC' => 'C', + 'sC' => 'C' }} assert_equal expected, @store.c_class_variables expected = {