Skip to content

Commit fa630f0

Browse files
committed
Fix rb_define_method(singleton_class_of_module, ...) not to change nested module name
Always track class and singleton class stored to a variable to `@classes`. Otherwise, `find_class var_name, class_name` called from `handle_method` will add a new class to `@toplevel`.
1 parent b0e21ef commit fa630f0

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

lib/rdoc/parser/c.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1054,6 +1054,7 @@ def handle_method(type, var_name, meth_name, function, param_count,
10541054
def handle_singleton(sclass_var, class_var)
10551055
class_name = @known_classes[class_var]
10561056

1057+
@classes[sclass_var] = @classes[class_var]
10571058
@known_classes[sclass_var] = class_name
10581059
@singleton_classes[sclass_var] = class_name
10591060
end

test/rdoc/parser/c_test.rb

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,29 @@ def test_do_methods_singleton_class
781781
assert methods.first.singleton
782782
end
783783

784+
785+
def test_do_methods_nested_module_singleton_class
786+
parser = util_parser <<~EOF
787+
VALUE baz(VALUE klass, VALUE year) {
788+
}
789+
void Init_Foo(void) {
790+
VALUE mFoo = rb_define_module("Foo");
791+
VALUE mBar = rb_define_module_under(mFoo, "Bar");
792+
VALUE mBarS = rb_singleton_class(mBar);
793+
rb_define_method(mBarS, "baz", baz, 0);
794+
}
795+
EOF
796+
parser.scan
797+
798+
klass = parser.classes['mBarS']
799+
assert_equal 'Foo::Bar', klass.full_name
800+
assert_equal 'Foo::Bar', parser.singleton_classes['mBarS']
801+
methods = klass.method_list
802+
assert_equal 1, methods.length
803+
assert_equal 'baz', methods.first.name
804+
assert methods.first.singleton
805+
end
806+
784807
def test_do_missing
785808
parser = util_parser
786809

@@ -1973,7 +1996,8 @@ def test_scan
19731996
expected = {
19741997
@fn => {
19751998
'mM' => 'M',
1976-
'cC' => 'C', }}
1999+
'cC' => 'C',
2000+
'sC' => 'C' }}
19772001
assert_equal expected, @store.c_class_variables
19782002

19792003
expected = {

0 commit comments

Comments
 (0)