Skip to content

Commit acfb829

Browse files
authored
Merge pull request #731 from mame/one-regexp-c-parser
RDoc::Parser::C: Integrate do_classes and do_modules by one regexp match
2 parents 6f98554 + 8286651 commit acfb829

File tree

2 files changed

+98
-134
lines changed

2 files changed

+98
-134
lines changed

lib/rdoc/parser/c.rb

Lines changed: 95 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -324,12 +324,100 @@ def do_boot_defclass
324324
# Scans #content for rb_define_class, boot_defclass, rb_define_class_under
325325
# and rb_singleton_class
326326

327-
def do_classes
328-
do_boot_defclass
329-
do_define_class
330-
do_define_class_under
331-
do_singleton_class
332-
do_struct_define_without_accessor
327+
def do_classes_and_modules
328+
do_boot_defclass if @file_name == "class.c"
329+
330+
@content.scan(
331+
%r(
332+
(?<var_name>[\w\.]+)\s* =
333+
\s*rb_(?:
334+
define_(?:
335+
class(?: # rb_define_class(class_name_1, parent_name_1)
336+
\s*\(
337+
\s*"(?<class_name_1>\w+)",
338+
\s*(?<parent_name_1>\w+)\s*
339+
\)
340+
|
341+
_under\s*\( # rb_define_class_under(class_under, class_name2, parent_name2...)
342+
\s* (?<class_under>\w+),
343+
\s* "(?<class_name_2>\w+)",
344+
\s*
345+
(?:
346+
(?<parent_name_2>[\w\*\s\(\)\.\->]+) |
347+
rb_path2class\("(?<path>[\w:]+)"\)
348+
)
349+
\s*\)
350+
)
351+
|
352+
module(?: # rb_define_module(module_name_1)
353+
\s*\(
354+
\s*"(?<module_name_1>\w+)"\s*
355+
\)
356+
|
357+
_under\s*\( # rb_define_module_under(module_under, module_name_1)
358+
\s*(?<module_under>\w+),
359+
\s*"(?<module_name_2>\w+)"
360+
\s*\)
361+
)
362+
)
363+
|
364+
struct_define_without_accessor\s*\( # rb_struct_define_without_accessor(class_name_3, parent_name_3, ...)
365+
\s*"(?<class_name_3>\w+)",
366+
\s*(?<parent_name_3>\w+),
367+
\s*\w+, # Allocation function
368+
(?:\s*"\w+",)* # Attributes
369+
\s*NULL
370+
\)
371+
|
372+
singleton_class\s*\( # rb_singleton_class(target_class_name)
373+
\s*(?<target_class_name>\w+)
374+
\)
375+
)
376+
)mx
377+
) do
378+
class_name = $~[:class_name_1]
379+
type = :class
380+
if class_name
381+
# rb_define_class(class_name_1, parent_name_1)
382+
parent_name = $~[:parent_name_1]
383+
#under = nil
384+
else
385+
class_name = $~[:class_name_2]
386+
if class_name
387+
# rb_define_class_under(class_under, class_name2, parent_name2...)
388+
parent_name = $~[:parent_name_2] || $~[:path]
389+
under = $~[:class_under]
390+
else
391+
class_name = $~[:class_name_3]
392+
if class_name
393+
# rb_struct_define_without_accessor(class_name_3, parent_name_3, ...)
394+
parent_name = $~[:parent_name_3]
395+
#under = nil
396+
else
397+
type = :module
398+
class_name = $~[:module_name_1]
399+
#parent_name = nil
400+
if class_name
401+
# rb_define_module(module_name_1)
402+
#under = nil
403+
else
404+
class_name = $~[:module_name_2]
405+
if class_name
406+
# rb_define_module_under(module_under, module_name_1)
407+
under = $~[:module_under]
408+
else
409+
# rb_singleton_class(target_class_name)
410+
target_class_name = $~[:target_class_name]
411+
handle_singleton $~[:var_name], target_class_name
412+
next
413+
end
414+
end
415+
end
416+
end
417+
end
418+
419+
handle_class_module($~[:var_name], type, class_name, parent_name, under)
420+
end
333421
end
334422

335423
##
@@ -378,65 +466,6 @@ def do_constants
378466
end
379467
end
380468

381-
##
382-
# Scans #content for rb_define_class
383-
384-
def do_define_class
385-
# The '.' lets us handle SWIG-generated files
386-
@content.scan(/([\w\.]+)\s* = \s*rb_define_class\s*
387-
\(
388-
\s*"(\w+)",
389-
\s*(\w+)\s*
390-
\)/mx) do |var_name, class_name, parent|
391-
handle_class_module(var_name, :class, class_name, parent, nil)
392-
end
393-
end
394-
395-
##
396-
# Scans #content for rb_define_class_under
397-
398-
def do_define_class_under
399-
@content.scan(/([\w\.]+)\s* = # var_name
400-
\s*rb_define_class_under\s*
401-
\(
402-
\s* (\w+), # under
403-
\s* "(\w+)", # class_name
404-
\s*
405-
(?:
406-
([\w\*\s\(\)\.\->]+) | # parent_name
407-
rb_path2class\("([\w:]+)"\) # path
408-
)
409-
\s*
410-
\)
411-
/mx) do |var_name, under, class_name, parent_name, path|
412-
parent = path || parent_name
413-
414-
handle_class_module var_name, :class, class_name, parent, under
415-
end
416-
end
417-
418-
##
419-
# Scans #content for rb_define_module
420-
421-
def do_define_module
422-
@content.scan(/(\w+)\s* = \s*rb_define_module\s*\(\s*"(\w+)"\s*\)/mx) do
423-
|var_name, class_name|
424-
handle_class_module(var_name, :module, class_name, nil, nil)
425-
end
426-
end
427-
428-
##
429-
# Scans #content for rb_define_module_under
430-
431-
def do_define_module_under
432-
@content.scan(/(\w+)\s* = \s*rb_define_module_under\s*
433-
\(
434-
\s*(\w+),
435-
\s*"(\w+)"
436-
\s*\)/mx) do |var_name, in_module, class_name|
437-
handle_class_module(var_name, :module, class_name, nil, in_module)
438-
end
439-
end
440469

441470
##
442471
# Scans #content for rb_include_module
@@ -518,42 +547,6 @@ def do_missing
518547
end
519548
end
520549

521-
##
522-
# Scans #content for rb_define_module and rb_define_module_under
523-
524-
def do_modules
525-
do_define_module
526-
do_define_module_under
527-
end
528-
529-
##
530-
# Scans #content for rb_singleton_class
531-
532-
def do_singleton_class
533-
@content.scan(/([\w\.]+)\s* = \s*rb_singleton_class\s*
534-
\(
535-
\s*(\w+)
536-
\s*\)/mx) do |sclass_var, class_var|
537-
handle_singleton sclass_var, class_var
538-
end
539-
end
540-
541-
##
542-
# Scans #content for struct_define_without_accessor
543-
544-
def do_struct_define_without_accessor
545-
@content.scan(/([\w\.]+)\s* = \s*rb_struct_define_without_accessor\s*
546-
\(
547-
\s*"(\w+)", # Class name
548-
\s*(\w+), # Parent class
549-
\s*\w+, # Allocation function
550-
(\s*"\w+",)* # Attributes
551-
\s*NULL
552-
\)/mx) do |var_name, class_name, parent|
553-
handle_class_module(var_name, :class, class_name, parent, nil)
554-
end
555-
end
556-
557550
##
558551
# Finds the comment for an alias on +class_name+ from +new_name+ to
559552
# +old_name+
@@ -1247,8 +1240,7 @@ def remove_commented_out_lines
12471240
def scan
12481241
remove_commented_out_lines
12491242

1250-
do_modules
1251-
do_classes
1243+
do_classes_and_modules
12521244
do_missing
12531245

12541246
do_constants

test/rdoc/test_rdoc_parser_c.rb

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -304,32 +304,6 @@ def test_do_aliases_singleton
304304
assert_equal 'This should show up as an alias', methods.last.comment.text
305305
end
306306

307-
def test_do_classes_boot_class
308-
content = <<-EOF
309-
/* Document-class: Foo
310-
* this is the Foo boot class
311-
*/
312-
VALUE cFoo = boot_defclass("Foo", rb_cObject);
313-
EOF
314-
315-
klass = util_get_class content, 'cFoo'
316-
assert_equal "this is the Foo boot class", klass.comment.text
317-
assert_equal 'Object', klass.superclass
318-
end
319-
320-
def test_do_classes_boot_class_nil
321-
content = <<-EOF
322-
/* Document-class: Foo
323-
* this is the Foo boot class
324-
*/
325-
VALUE cFoo = boot_defclass("Foo", 0);
326-
EOF
327-
328-
klass = util_get_class content, 'cFoo'
329-
assert_equal "this is the Foo boot class", klass.comment.text
330-
assert_nil klass.superclass
331-
end
332-
333307
def test_do_aliases_missing_class
334308
content = <<-EOF
335309
void Init_Blah(void) {
@@ -511,7 +485,7 @@ def test_do_constants
511485

512486
@parser = util_parser content
513487

514-
@parser.do_classes
488+
@parser.do_classes_and_modules
515489
@parser.do_constants
516490

517491
klass = @parser.classes['cFoo']
@@ -581,8 +555,7 @@ def test_do_constants_curses
581555

582556
@parser = util_parser content
583557

584-
@parser.do_modules
585-
@parser.do_classes
558+
@parser.do_classes_and_modules
586559
@parser.do_constants
587560

588561
klass = @parser.classes['mCurses']
@@ -608,8 +581,7 @@ def test_do_constants_file
608581

609582
@parser = util_parser content
610583

611-
@parser.do_modules
612-
@parser.do_classes
584+
@parser.do_classes_and_modules
613585
@parser.do_constants
614586

615587
klass = @parser.classes['rb_mFConst']

0 commit comments

Comments
 (0)