Skip to content

Commit 8252e0b

Browse files
committed
Allow rb_path2class in rb_define_class_under. Allows rdoc to find OpenSSL::Digest
1 parent 017e6c9 commit 8252e0b

File tree

3 files changed

+54
-23
lines changed

3 files changed

+54
-23
lines changed

History.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
=== 3.6.1
1+
=== 3.6.1 / 2011-05-15
22

33
* Bug fixes
44
* Fix infinite loop created when re-encountering BasicObject.
55
* RDoc::Context#each_ancestor is now provided for duck-typing.
6+
* rb_path2class() can now be used to discover the parent class in
7+
rb_define_class_under.
68

79
=== 3.6 / 2011-05-13
810

lib/rdoc/parser/c.rb

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -218,13 +218,22 @@ def do_classes
218218
handle_class_module(var_name, "module", class_name, nil, in_module)
219219
end
220220

221-
@content.scan(/([\w\.]+)\s* = \s*rb_define_class_under\s*
222-
\(
223-
\s*(\w+),
224-
\s*"(\w+)",
225-
\s*([\w\*\s\(\)\.\->]+)\s* # for SWIG
226-
\s*\)/mx) do |var_name, in_module, class_name, parent|
227-
handle_class_module(var_name, "class", class_name, parent, in_module)
221+
@content.scan(/([\w\.]+)\s* = # var_name
222+
\s*rb_define_class_under\s*
223+
\(
224+
\s* (\w+), # under
225+
\s* "(\w+)", # class_name
226+
\s*
227+
(?:
228+
([\w\*\s\(\)\.\->]+) | # parent_name
229+
rb_path2class\("([\w:]+)"\) # path
230+
)
231+
\s*
232+
\)
233+
/mx) do |var_name, under, class_name, parent_name, path|
234+
parent = path || parent_name
235+
236+
handle_class_module var_name, 'class', class_name, parent, under
228237
end
229238

230239
@content.scan(/([\w\.]+)\s* = \s*rb_singleton_class\s*
@@ -650,8 +659,8 @@ def handle_class_module(var_name, type, class_name, parent, in_module)
650659
enclosure = @classes[in_module] || @@enclosure_classes[in_module]
651660

652661
if enclosure.nil? and enclosure = @known_classes[in_module] then
653-
type = /^rb_m/ =~ in_module ? "module" : "class"
654-
handle_class_module in_module, type, enclosure, nil, nil
662+
enc_type = /^rb_m/ =~ in_module ? "module" : "class"
663+
handle_class_module in_module, enc_type, enclosure, nil, nil
655664
enclosure = @classes[in_module]
656665
end
657666

@@ -675,17 +684,21 @@ def handle_class_module(var_name, type, class_name, parent, in_module)
675684
end
676685

677686
cm = enclosure.add_class RDoc::NormalClass, class_name, parent_name
678-
679-
@stats.add_class cm
680687
else
681688
cm = enclosure.add_module RDoc::NormalModule, class_name
682-
@stats.add_module cm
683689
end
684690

685691
cm.record_location enclosure.top_level
686692

687693
find_class_comment cm.full_name, cm
688694

695+
case cm
696+
when RDoc::NormalClass
697+
@stats.add_class cm
698+
when RDoc::NormalModule
699+
@stats.add_module cm
700+
end
701+
689702
@classes[var_name] = cm
690703
@@enclosure_classes[var_name] = cm
691704
@known_classes[var_name] = cm.full_name

test/test_rdoc_parser_c.rb

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -236,27 +236,43 @@ def test_do_classes_class
236236
assert_equal "this is the Foo class", klass.comment
237237
end
238238

239-
def test_do_classes_singleton
239+
def test_do_classes_class_under
240240
content = <<-EOF
241-
VALUE cFoo = rb_define_class("Foo", rb_cObject);
242-
VALUE cFooS = rb_singleton_class(cFoo);
241+
/* Document-class: Kernel::Foo
242+
* this is the Foo class under Kernel
243+
*/
244+
VALUE cFoo = rb_define_class_under(rb_mKernel, "Foo", rb_cObject);
243245
EOF
244246

245-
util_get_class content, 'cFooS'
246-
247-
assert_equal 'Foo', @parser.singleton_classes['cFooS']
247+
klass = util_get_class content, 'cFoo'
248+
assert_equal 'Kernel::Foo', klass.full_name
249+
assert_equal "this is the Foo class under Kernel", klass.comment
248250
end
249251

250-
def test_do_classes_class_under
252+
def test_do_classes_class_under_rb_path2class
251253
content = <<-EOF
252254
/* Document-class: Kernel::Foo
253-
* this is the Foo class under Kernel
255+
* this is Kernel::Foo < A::B
254256
*/
255-
VALUE cFoo = rb_define_class_under(rb_mKernel, "Foo", rb_cObject);
257+
VALUE cFoo = rb_define_class_under(rb_mKernel, "Foo", rb_path2class("A::B"));
256258
EOF
257259

258260
klass = util_get_class content, 'cFoo'
259-
assert_equal "this is the Foo class under Kernel", klass.comment
261+
262+
assert_equal 'Kernel::Foo', klass.full_name
263+
assert_equal 'A::B', klass.superclass
264+
assert_equal 'this is Kernel::Foo < A::B', klass.comment
265+
end
266+
267+
def test_do_classes_singleton
268+
content = <<-EOF
269+
VALUE cFoo = rb_define_class("Foo", rb_cObject);
270+
VALUE cFooS = rb_singleton_class(cFoo);
271+
EOF
272+
273+
util_get_class content, 'cFooS'
274+
275+
assert_equal 'Foo', @parser.singleton_classes['cFooS']
260276
end
261277

262278
def test_do_classes_module

0 commit comments

Comments
 (0)