rdoc 2.5.11 → 3.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rdoc might be problematic. Click here for more details.

Files changed (113) hide show
  1. data.tar.gz.sig +0 -0
  2. data/.document +1 -0
  3. data/History.txt +95 -0
  4. data/Manifest.txt +13 -4
  5. data/README.txt +9 -3
  6. data/Rakefile +1 -1
  7. data/lib/rdoc.rb +15 -298
  8. data/lib/rdoc/alias.rb +65 -16
  9. data/lib/rdoc/any_method.rb +27 -150
  10. data/lib/rdoc/attr.rb +36 -115
  11. data/lib/rdoc/class_module.rb +236 -22
  12. data/lib/rdoc/code_object.rb +76 -31
  13. data/lib/rdoc/constant.rb +32 -4
  14. data/lib/rdoc/context.rb +494 -222
  15. data/lib/rdoc/encoding.rb +79 -0
  16. data/lib/rdoc/erbio.rb +37 -0
  17. data/lib/rdoc/gauntlet.rb +9 -5
  18. data/lib/rdoc/generator.rb +33 -1
  19. data/lib/rdoc/generator/darkfish.rb +284 -375
  20. data/lib/rdoc/generator/markup.rb +72 -36
  21. data/lib/rdoc/generator/ri.rb +4 -4
  22. data/lib/rdoc/generator/template/darkfish/classpage.rhtml +267 -274
  23. data/lib/rdoc/generator/template/darkfish/filepage.rhtml +91 -91
  24. data/lib/rdoc/generator/template/darkfish/index.rhtml +45 -45
  25. data/lib/rdoc/generator/template/darkfish/rdoc.css +298 -298
  26. data/lib/rdoc/include.rb +40 -1
  27. data/lib/rdoc/known_classes.rb +1 -0
  28. data/lib/rdoc/markup.rb +467 -2
  29. data/lib/rdoc/markup/attribute_manager.rb +24 -6
  30. data/lib/rdoc/markup/blank_line.rb +11 -3
  31. data/lib/rdoc/markup/document.rb +6 -0
  32. data/lib/rdoc/markup/formatter.rb +10 -0
  33. data/lib/rdoc/markup/formatter_test_case.rb +339 -3
  34. data/lib/rdoc/markup/heading.rb +3 -0
  35. data/lib/rdoc/markup/inline.rb +11 -1
  36. data/lib/rdoc/markup/list.rb +3 -0
  37. data/lib/rdoc/markup/list_item.rb +3 -0
  38. data/lib/rdoc/markup/paragraph.rb +3 -0
  39. data/lib/rdoc/markup/parser.rb +191 -237
  40. data/lib/rdoc/markup/{preprocess.rb → pre_process.rb} +50 -29
  41. data/lib/rdoc/markup/raw.rb +4 -0
  42. data/lib/rdoc/markup/rule.rb +3 -0
  43. data/lib/rdoc/markup/text_formatter_test_case.rb +116 -0
  44. data/lib/rdoc/markup/to_ansi.rb +14 -2
  45. data/lib/rdoc/markup/to_bs.rb +8 -2
  46. data/lib/rdoc/markup/to_html.rb +84 -91
  47. data/lib/rdoc/markup/to_html_crossref.rb +77 -26
  48. data/lib/rdoc/markup/to_rdoc.rb +94 -49
  49. data/lib/rdoc/markup/to_test.rb +9 -1
  50. data/lib/rdoc/markup/verbatim.rb +6 -3
  51. data/lib/rdoc/method_attr.rb +353 -0
  52. data/lib/rdoc/normal_class.rb +11 -2
  53. data/lib/rdoc/normal_module.rb +0 -5
  54. data/lib/rdoc/options.rb +373 -82
  55. data/lib/rdoc/parser.rb +59 -23
  56. data/lib/rdoc/parser/c.rb +224 -86
  57. data/lib/rdoc/parser/ruby.rb +219 -111
  58. data/lib/rdoc/parser/ruby_tools.rb +4 -1
  59. data/lib/rdoc/parser/simple.rb +9 -4
  60. data/lib/rdoc/rdoc.rb +68 -28
  61. data/lib/rdoc/require.rb +21 -0
  62. data/lib/rdoc/ri/driver.rb +20 -10
  63. data/lib/rdoc/ri/paths.rb +2 -2
  64. data/lib/rdoc/ri/store.rb +22 -5
  65. data/lib/rdoc/ruby_lex.rb +11 -12
  66. data/lib/rdoc/ruby_token.rb +2 -2
  67. data/lib/rdoc/single_class.rb +2 -1
  68. data/lib/rdoc/stats.rb +202 -162
  69. data/lib/rdoc/stats/normal.rb +51 -0
  70. data/lib/rdoc/stats/quiet.rb +59 -0
  71. data/lib/rdoc/stats/verbose.rb +45 -0
  72. data/lib/rdoc/text.rb +133 -4
  73. data/lib/rdoc/{tokenstream.rb → token_stream.rb} +0 -2
  74. data/lib/rdoc/top_level.rb +230 -39
  75. data/test/test_attribute_manager.rb +58 -7
  76. data/test/test_rdoc_alias.rb +13 -0
  77. data/test/test_rdoc_any_method.rb +43 -2
  78. data/test/test_rdoc_attr.rb +15 -8
  79. data/test/test_rdoc_class_module.rb +133 -0
  80. data/test/test_rdoc_code_object.rb +62 -5
  81. data/test/test_rdoc_context.rb +72 -26
  82. data/test/test_rdoc_encoding.rb +145 -0
  83. data/test/test_rdoc_generator_darkfish.rb +119 -0
  84. data/test/test_rdoc_generator_ri.rb +22 -2
  85. data/test/test_rdoc_include.rb +79 -0
  86. data/test/test_rdoc_markup_attribute_manager.rb +4 -4
  87. data/test/test_rdoc_markup_parser.rb +134 -95
  88. data/test/test_rdoc_markup_pre_process.rb +7 -2
  89. data/test/test_rdoc_markup_to_ansi.rb +43 -153
  90. data/test/test_rdoc_markup_to_bs.rb +42 -156
  91. data/test/test_rdoc_markup_to_html.rb +130 -58
  92. data/test/test_rdoc_markup_to_html_crossref.rb +10 -10
  93. data/test/test_rdoc_markup_to_rdoc.rb +40 -151
  94. data/test/test_rdoc_method_attr.rb +122 -0
  95. data/test/test_rdoc_normal_class.rb +1 -1
  96. data/test/test_rdoc_normal_module.rb +6 -1
  97. data/test/test_rdoc_options.rb +237 -12
  98. data/test/test_rdoc_parser.rb +3 -22
  99. data/test/test_rdoc_parser_c.rb +203 -2
  100. data/test/test_rdoc_parser_ruby.rb +403 -89
  101. data/test/test_rdoc_parser_simple.rb +25 -1
  102. data/test/test_rdoc_rdoc.rb +44 -32
  103. data/test/test_rdoc_ri_driver.rb +29 -24
  104. data/test/test_rdoc_ri_store.rb +46 -3
  105. data/test/test_rdoc_task.rb +1 -1
  106. data/test/test_rdoc_text.rb +102 -8
  107. data/test/test_rdoc_top_level.rb +13 -4
  108. data/test/xref_data.rb +8 -0
  109. data/test/xref_test_case.rb +6 -0
  110. metadata +29 -19
  111. metadata.gz.sig +0 -0
  112. data/lib/rdoc/parser/perl.rb +0 -165
  113. data/test/test_rdoc_parser_perl.rb +0 -73
@@ -11,8 +11,8 @@ require 'rdoc/ruby_token'
11
11
  require 'rdoc/ruby_lex'
12
12
 
13
13
  require 'rdoc/code_objects'
14
- require 'rdoc/tokenstream'
15
- require 'rdoc/markup/preprocess'
14
+ require 'rdoc/token_stream'
15
+ require 'rdoc/markup/pre_process'
16
16
  require 'rdoc/parser'
17
17
  require 'rdoc/parser/ruby_tools'
18
18
 
@@ -162,6 +162,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
162
162
 
163
163
  SINGLE = "<<"
164
164
 
165
+ ##
166
+ # Creates a new Ruby parser.
167
+
165
168
  def initialize(top_level, file_name, content, options, stats)
166
169
  super
167
170
 
@@ -209,10 +212,13 @@ class RDoc::Parser::Ruby < RDoc::Parser
209
212
  comment
210
213
  end
211
214
 
215
+ ##
216
+ # Aborts with +msg+
217
+
212
218
  def error(msg)
213
219
  msg = make_message msg
214
- $stderr.puts msg
215
- exit false
220
+
221
+ abort msg
216
222
  end
217
223
 
218
224
  ##
@@ -229,6 +235,10 @@ class RDoc::Parser::Ruby < RDoc::Parser
229
235
  meth
230
236
  end
231
237
 
238
+ ##
239
+ # Looks for a true or false token. Returns false if TkFALSE or TkNIL are
240
+ # found.
241
+
232
242
  def get_bool
233
243
  skip_tkspace
234
244
  tk = get_tk
@@ -245,20 +255,24 @@ class RDoc::Parser::Ruby < RDoc::Parser
245
255
 
246
256
  ##
247
257
  # Look for the name of a class of module (optionally with a leading :: or
248
- # with :: separated named) and return the ultimate name and container
258
+ # with :: separated named) and return the ultimate name, the associated
259
+ # container, and the given name (with the ::).
249
260
 
250
261
  def get_class_or_module(container)
251
262
  skip_tkspace
252
263
  name_t = get_tk
264
+ given_name = ''
253
265
 
254
266
  # class ::A -> A is in the top level
255
267
  case name_t
256
268
  when TkCOLON2, TkCOLON3 then # bug
257
269
  name_t = get_tk
258
270
  container = @top_level
271
+ given_name << '::'
259
272
  end
260
273
 
261
274
  skip_tkspace false
275
+ given_name << name_t.name
262
276
 
263
277
  while TkCOLON2 === peek_tk do
264
278
  prev_container = container
@@ -268,9 +282,10 @@ class RDoc::Parser::Ruby < RDoc::Parser
268
282
  end
269
283
  get_tk
270
284
  name_t = get_tk
285
+ given_name << '::' << name_t.name
271
286
  end
272
287
  skip_tkspace false
273
- return [container, name_t]
288
+ return [container, name_t, given_name]
274
289
  end
275
290
 
276
291
  ##
@@ -347,6 +362,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
347
362
  name
348
363
  end
349
364
 
365
+ ##
366
+ # Extracts a name or symbol from the token stream.
367
+
350
368
  def get_symbol_or_name
351
369
  tk = get_tk
352
370
  case tk
@@ -361,7 +379,10 @@ class RDoc::Parser::Ruby < RDoc::Parser
361
379
  text
362
380
  when TkId, TkOp then
363
381
  tk.name
364
- when TkSTRING, TkDSTRING then
382
+ when TkAMPER,
383
+ TkDSTRING,
384
+ TkSTAR,
385
+ TkSTRING then
365
386
  tk.text
366
387
  else
367
388
  raise RDoc::Error, "Name or symbol expected (got #{tk})"
@@ -374,7 +395,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
374
395
  # # :stopdoc:
375
396
  # # Don't display comment from this point forward
376
397
  #
377
- # This routine modifies it's parameter
398
+ # This routine modifies its +comment+ parameter.
378
399
 
379
400
  def look_for_directives_in(context, comment)
380
401
  preprocess = RDoc::Markup::PreProcess.new @file_name, @options.rdoc_include
@@ -382,9 +403,10 @@ class RDoc::Parser::Ruby < RDoc::Parser
382
403
  preprocess.handle comment, context do |directive, param|
383
404
  case directive
384
405
  when 'enddoc' then
385
- throw :enddoc
406
+ context.done_documenting = true
407
+ ''
386
408
  when 'main' then
387
- @options.main_page = param
409
+ @options.main_page = param if @options.respond_to? :main_page
388
410
  ''
389
411
  when 'method', 'singleton-method',
390
412
  'attr', 'attr_accessor', 'attr_reader', 'attr_writer' then
@@ -401,7 +423,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
401
423
  context.stop_doc
402
424
  ''
403
425
  when 'title' then
404
- @options.title = param
426
+ @options.default_title = param if @options.respond_to? :default_title=
405
427
  ''
406
428
  end
407
429
  end
@@ -426,23 +448,28 @@ class RDoc::Parser::Ruby < RDoc::Parser
426
448
 
427
449
  def parse_attr(context, single, tk, comment)
428
450
  args = parse_symbol_arg 1
429
- if args.size > 0
451
+ if args.size > 0 then
430
452
  name = args[0]
431
453
  rw = "R"
432
454
  skip_tkspace false
433
455
  tk = get_tk
456
+
434
457
  if TkCOMMA === tk then
435
458
  rw = "RW" if get_bool
436
459
  else
437
460
  unget_tk tk
438
461
  end
439
- att = RDoc::Attr.new get_tkread, name, rw, comment
462
+
463
+ att = RDoc::Attr.new get_tkread, name, rw, comment, single == SINGLE
464
+ att.record_location @top_level
465
+
440
466
  read_documentation_modifiers att, RDoc::ATTR_MODIFIERS
441
- if att.document_self
442
- context.add_attribute(att)
443
- end
467
+
468
+ context.add_attribute att if att.document_self
469
+
470
+ @stats.add_attribute att
444
471
  else
445
- warn("'attr' ignored - looks like a variable")
472
+ warn "'attr' ignored - looks like a variable"
446
473
  end
447
474
  end
448
475
 
@@ -452,11 +479,8 @@ class RDoc::Parser::Ruby < RDoc::Parser
452
479
 
453
480
  def parse_attr_accessor(context, single, tk, comment)
454
481
  args = parse_symbol_arg
455
- read = get_tkread
456
482
  rw = "?"
457
483
 
458
- # TODO If nodoc is given, don't document any of them
459
-
460
484
  tmp = RDoc::CodeObject.new
461
485
  read_documentation_modifiers tmp, RDoc::ATTR_MODIFIERS
462
486
  return unless tmp.document_self
@@ -470,17 +494,25 @@ class RDoc::Parser::Ruby < RDoc::Parser
470
494
  end
471
495
 
472
496
  for name in args
473
- att = RDoc::Attr.new get_tkread, name, rw, comment
497
+ att = RDoc::Attr.new get_tkread, name, rw, comment, single == SINGLE
498
+ att.record_location @top_level
499
+
474
500
  context.add_attribute att
501
+ @stats.add_attribute att
475
502
  end
476
503
  end
477
504
 
505
+ ##
506
+ # Parses an +alias+ in +context+ with +comment+
507
+
478
508
  def parse_alias(context, single, tk, comment)
479
509
  skip_tkspace
510
+
480
511
  if TkLPAREN === peek_tk then
481
512
  get_tk
482
513
  skip_tkspace
483
514
  end
515
+
484
516
  new_name = get_symbol_or_name
485
517
 
486
518
  @scanner.instance_eval { @lex_state = EXPR_FNAME }
@@ -497,16 +529,20 @@ class RDoc::Parser::Ruby < RDoc::Parser
497
529
  return
498
530
  end
499
531
 
500
- al = RDoc::Alias.new get_tkread, old_name, new_name, comment
501
- al.singleton = SINGLE == single
502
- read_documentation_modifiers al, RDoc::ATTR_MODIFIERS
532
+ al = RDoc::Alias.new(get_tkread, old_name, new_name, comment,
533
+ single == SINGLE)
534
+ al.record_location @top_level
503
535
 
536
+ read_documentation_modifiers al, RDoc::ATTR_MODIFIERS
504
537
  context.add_alias al if al.document_self
505
538
  @stats.add_alias al
506
539
 
507
540
  al
508
541
  end
509
542
 
543
+ ##
544
+ # Extracts call parameters from the token stream.
545
+
510
546
  def parse_call_parameters(tk)
511
547
  end_token = case tk
512
548
  when TkLPAREN, TkfLPAREN
@@ -531,7 +567,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
531
567
  else
532
568
  break unless @scanner.continue
533
569
  end
534
- when TkCOMMENT
570
+ when TkCOMMENT, TkASSIGN, TkOPASGN
535
571
  unget_tk(tk)
536
572
  break
537
573
  when nil then
@@ -544,28 +580,33 @@ class RDoc::Parser::Ruby < RDoc::Parser
544
580
  res
545
581
  end
546
582
 
583
+ ##
584
+ # Parses a class in +context+ with +comment+
585
+
547
586
  def parse_class(container, single, tk, comment)
548
- container, name_t = get_class_or_module container
587
+ declaration_context = container
588
+ container, name_t, given_name = get_class_or_module container
549
589
 
550
590
  case name_t
551
591
  when TkCONSTANT
552
592
  name = name_t.name
553
- superclass = "Object"
593
+ superclass = '::Object'
554
594
 
555
595
  if TkLT === peek_tk then
556
596
  get_tk
557
597
  skip_tkspace
558
598
  superclass = get_class_specification
559
- superclass = "<unknown>" if superclass.empty?
599
+ superclass = '(unknown)' if superclass.empty?
560
600
  end
561
601
 
562
602
  cls_type = single == SINGLE ? RDoc::SingleClass : RDoc::NormalClass
563
- cls = container.add_class cls_type, name, superclass
603
+ cls = declaration_context.add_class cls_type, given_name, superclass
564
604
 
565
605
  read_documentation_modifiers cls, RDoc::CLASS_MODIFIERS
566
606
  cls.record_location @top_level
567
- cls.comment = comment
607
+ cls.comment = comment if cls.document_self
568
608
 
609
+ @top_level.add_to_classes_or_modules cls
569
610
  @stats.add_class cls
570
611
 
571
612
  parse_statements cls
@@ -582,6 +623,15 @@ class RDoc::Parser::Ruby < RDoc::Parser
582
623
  other.comment = comment
583
624
  end
584
625
 
626
+ # notify :nodoc: all if not a constant-named class/module
627
+ # (and remove any comment)
628
+ unless name =~ /\A(::)?[A-Z]/
629
+ other.document_self = nil
630
+ other.document_children = false
631
+ other.clear_comment
632
+ end
633
+
634
+ @top_level.add_to_classes_or_modules other
585
635
  @stats.add_class other
586
636
 
587
637
  read_documentation_modifiers other, RDoc::CLASS_MODIFIERS
@@ -593,9 +643,15 @@ class RDoc::Parser::Ruby < RDoc::Parser
593
643
  end
594
644
  end
595
645
 
646
+ ##
647
+ # Parses a constant in +context+ with +comment+
648
+
596
649
  def parse_constant(container, tk, comment)
597
650
  name = tk.name
598
651
  skip_tkspace false
652
+
653
+ return unless name =~ /^\w+$/
654
+
599
655
  eq_tk = get_tk
600
656
 
601
657
  unless TkASSIGN === eq_tk then
@@ -619,9 +675,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
619
675
  loop do
620
676
  case tk
621
677
  when TkSEMICOLON then
622
- break
623
- when TkLPAREN, TkfLPAREN, TkLBRACE, TkLBRACK, TkDO, TkIF, TkUNLESS,
624
- TkCASE then
678
+ break if nest <= 0
679
+ when TkLPAREN, TkfLPAREN, TkLBRACE, TkfLBRACE, TkLBRACK, TkfLBRACK,
680
+ TkDO, TkIF, TkUNLESS, TkCASE, TkDEF, TkBEGIN then
625
681
  nest += 1
626
682
  when TkRPAREN, TkRBRACE, TkRBRACK, TkEND then
627
683
  nest -= 1
@@ -658,10 +714,11 @@ class RDoc::Parser::Ruby < RDoc::Parser
658
714
  tk = get_tk
659
715
  end
660
716
 
661
- res = get_tkread.tr("\n", " ").strip
717
+ res = get_tkread.gsub(/^[ \t]+/, '').strip
662
718
  res = "" if res == ";"
663
719
 
664
720
  con = RDoc::Constant.new name, res, comment
721
+ con.record_location @top_level
665
722
  read_documentation_modifiers con, RDoc::CONSTANT_MODIFIERS
666
723
 
667
724
  @stats.add_constant con
@@ -683,6 +740,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
683
740
  name = $1 unless $1.empty?
684
741
 
685
742
  meth = RDoc::GhostMethod.new get_tkread, name
743
+ meth.record_location @top_level
686
744
  meth.singleton = singleton
687
745
 
688
746
  meth.start_collecting_tokens
@@ -713,13 +771,19 @@ class RDoc::Parser::Ruby < RDoc::Parser
713
771
 
714
772
  name = $3 unless $3.empty?
715
773
 
774
+ # TODO authorize 'singleton-attr...'?
716
775
  att = RDoc::Attr.new get_tkread, name, rw, comment
776
+ att.record_location @top_level
777
+
717
778
  container.add_attribute att
718
779
 
719
- @stats.add_method att
780
+ @stats.add_attribute att
720
781
  end
721
782
  end
722
783
 
784
+ ##
785
+ # Parses an +include+ in +context+ with +comment+
786
+
723
787
  def parse_include(context, comment)
724
788
  loop do
725
789
  skip_tkspace_comment
@@ -763,7 +827,6 @@ class RDoc::Parser::Ruby < RDoc::Parser
763
827
 
764
828
  def parse_meta_attr(context, single, tk, comment)
765
829
  args = parse_symbol_arg
766
- read = get_tkread
767
830
  rw = "?"
768
831
 
769
832
  # If nodoc is given, don't document any of them
@@ -782,12 +845,19 @@ class RDoc::Parser::Ruby < RDoc::Parser
782
845
  end
783
846
 
784
847
  if name then
785
- att = RDoc::Attr.new get_tkread, name, rw, comment
848
+ att = RDoc::Attr.new get_tkread, name, rw, comment, single == SINGLE
849
+ att.record_location @top_level
850
+
786
851
  context.add_attribute att
852
+ @stats.add_attribute att
787
853
  else
788
854
  args.each do |attr_name|
789
- att = RDoc::Attr.new get_tkread, attr_name, rw, comment
855
+ att = RDoc::Attr.new(get_tkread, attr_name, rw, comment,
856
+ single == SINGLE)
857
+ att.record_location @top_level
858
+
790
859
  context.add_attribute att
860
+ @stats.add_attribute att
791
861
  end
792
862
  end
793
863
  end
@@ -828,6 +898,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
828
898
  end
829
899
 
830
900
  meth = RDoc::MetaMethod.new get_tkread, name
901
+ meth.record_location @top_level
831
902
  meth.singleton = singleton
832
903
 
833
904
  remove_token_listener self
@@ -885,7 +956,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
885
956
  token_listener self do
886
957
  @scanner.instance_eval do @lex_state = EXPR_FNAME end
887
958
 
888
- skip_tkspace false
959
+ skip_tkspace
889
960
  name_t = get_tk
890
961
  back_tk = skip_tkspace
891
962
  meth = nil
@@ -925,11 +996,17 @@ class RDoc::Parser::Ruby < RDoc::Parser
925
996
 
926
997
  container.record_location @top_level
927
998
  end
928
- when TkIDENTIFIER, TkIVAR then
999
+ when TkIDENTIFIER, TkIVAR, TkGVAR then
929
1000
  dummy = RDoc::Context.new
930
1001
  dummy.parent = container
931
1002
  skip_method dummy
932
1003
  return
1004
+ when TkTRUE, TkFALSE, TkNIL then
1005
+ klass_name = "#{name_t.name.capitalize}Class"
1006
+ container = RDoc::TopLevel.find_class_named klass_name
1007
+ container ||= @top_level.add_class RDoc::NormalClass, klass_name
1008
+
1009
+ name = name_t2.name
933
1010
  else
934
1011
  warn "unexpected method name token #{name_t.inspect}"
935
1012
  # break
@@ -962,6 +1039,8 @@ class RDoc::Parser::Ruby < RDoc::Parser
962
1039
  end
963
1040
  end
964
1041
 
1042
+ meth.record_location @top_level
1043
+
965
1044
  meth.start_collecting_tokens
966
1045
  indent = TkSPACE.new nil, 1, 1
967
1046
  indent.set_text " " * column
@@ -1004,6 +1083,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
1004
1083
  @stats.add_method meth
1005
1084
  end
1006
1085
 
1086
+ ##
1087
+ # Extracts +yield+ parameters from +method+
1088
+
1007
1089
  def parse_method_or_yield_parameters(method = nil,
1008
1090
  modifiers = RDoc::METHOD_MODIFIERS)
1009
1091
  skip_tkspace false
@@ -1027,14 +1109,16 @@ class RDoc::Parser::Ruby < RDoc::Parser
1027
1109
  loop do
1028
1110
  case tk
1029
1111
  when TkSEMICOLON then
1030
- break
1031
- when TkLBRACE then
1112
+ break if nest == 0
1113
+ when TkLBRACE, TkfLBRACE then
1032
1114
  nest += 1
1033
1115
  when TkRBRACE then
1034
- # we might have a.each {|i| yield i }
1035
- unget_tk(tk) if nest.zero?
1036
1116
  nest -= 1
1037
- break if nest <= 0
1117
+ if nest <= 0
1118
+ # we might have a.each { |i| yield i }
1119
+ unget_tk(tk) if nest < 0
1120
+ break
1121
+ end
1038
1122
  when TkLPAREN, TkfLPAREN then
1039
1123
  nest += 1
1040
1124
  when end_token then
@@ -1044,6 +1128,8 @@ class RDoc::Parser::Ruby < RDoc::Parser
1044
1128
  else
1045
1129
  break unless @scanner.continue
1046
1130
  end
1131
+ when TkRPAREN then
1132
+ nest -= 1
1047
1133
  when method && method.block_params.nil? && TkCOMMENT then
1048
1134
  unget_tk tk
1049
1135
  read_documentation_modifiers method, modifiers
@@ -1081,8 +1167,11 @@ class RDoc::Parser::Ruby < RDoc::Parser
1081
1167
  end
1082
1168
  end
1083
1169
 
1170
+ ##
1171
+ # Parses an RDoc::NormalModule in +container+ with +comment+
1172
+
1084
1173
  def parse_module(container, single, tk, comment)
1085
- container, name_t = get_class_or_module container
1174
+ container, name_t, = get_class_or_module container
1086
1175
 
1087
1176
  name = name_t.name
1088
1177
 
@@ -1090,12 +1179,16 @@ class RDoc::Parser::Ruby < RDoc::Parser
1090
1179
  mod.record_location @top_level
1091
1180
 
1092
1181
  read_documentation_modifiers mod, RDoc::CLASS_MODIFIERS
1182
+ mod.comment = comment if mod.document_self
1093
1183
  parse_statements(mod)
1094
- mod.comment = comment
1095
1184
 
1185
+ @top_level.add_to_classes_or_modules mod
1096
1186
  @stats.add_module mod
1097
1187
  end
1098
1188
 
1189
+ ##
1190
+ # Parses an RDoc::Require in +context+ containing +comment+
1191
+
1099
1192
  def parse_require(context, comment)
1100
1193
  skip_tkspace_comment
1101
1194
  tk = get_tk
@@ -1108,7 +1201,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
1108
1201
  name = tk.text if TkSTRING === tk
1109
1202
 
1110
1203
  if name then
1111
- context.add_require RDoc::Require.new(name, comment)
1204
+ @top_level.add_require RDoc::Require.new(name, comment)
1112
1205
  else
1113
1206
  unget_tk tk
1114
1207
  end
@@ -1209,7 +1302,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
1209
1302
  # We can't solve the general case, but we can handle most occurrences by
1210
1303
  # ignoring a do at the end of a line.
1211
1304
 
1212
- when TkUNTIL, TkWHILE then
1305
+ when TkUNTIL, TkWHILE then
1213
1306
  nest += 1
1214
1307
  skip_optional_do_after_expression
1215
1308
 
@@ -1278,9 +1371,14 @@ class RDoc::Parser::Ruby < RDoc::Parser
1278
1371
  end
1279
1372
  end
1280
1373
 
1374
+ ##
1375
+ # Parse up to +no+ symbol arguments
1376
+
1281
1377
  def parse_symbol_arg(no = nil)
1282
1378
  args = []
1379
+
1283
1380
  skip_tkspace_comment
1381
+
1284
1382
  case tk = get_tk
1285
1383
  when TkLPAREN
1286
1384
  loop do
@@ -1323,28 +1421,40 @@ class RDoc::Parser::Ruby < RDoc::Parser
1323
1421
  end
1324
1422
  end
1325
1423
  end
1424
+
1326
1425
  args
1327
1426
  end
1328
1427
 
1428
+ ##
1429
+ # Returns symbol text from the next token
1430
+
1329
1431
  def parse_symbol_in_arg
1330
1432
  case tk = get_tk
1331
1433
  when TkSYMBOL
1332
1434
  tk.text.sub(/^:/, '')
1333
1435
  when TkSTRING
1334
1436
  eval @read[-1]
1437
+ when TkDSTRING, TkIDENTIFIER then
1438
+ nil # ignore
1335
1439
  else
1336
1440
  warn("Expected symbol or string, got #{tk.inspect}") if $DEBUG_RDOC
1337
1441
  nil
1338
1442
  end
1339
1443
  end
1340
1444
 
1445
+ ##
1446
+ # Parses statements at the toplevel in +container+
1447
+
1341
1448
  def parse_top_level_statements(container)
1342
1449
  comment = collect_first_comment
1343
1450
  look_for_directives_in(container, comment)
1344
- container.comment = comment unless comment.empty?
1451
+ container.comment = comment if container.document_self unless comment.empty?
1345
1452
  parse_statements container, NORMAL, nil, comment
1346
1453
  end
1347
1454
 
1455
+ ##
1456
+ # Determines the visibility in +container+ from +tk+
1457
+
1348
1458
  def parse_visibility(container, single, tk)
1349
1459
  singleton = (single == SINGLE)
1350
1460
 
@@ -1386,7 +1496,8 @@ class RDoc::Parser::Ruby < RDoc::Parser
1386
1496
 
1387
1497
  container.methods_matching args do |m|
1388
1498
  s_m = m.dup
1389
- s_m.singleton = true if RDoc::AnyMethod === s_m
1499
+ s_m.record_location @top_level
1500
+ s_m.singleton = true
1390
1501
  s_m.visibility = :public
1391
1502
  module_functions << s_m
1392
1503
  end
@@ -1406,6 +1517,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
1406
1517
  end
1407
1518
  end
1408
1519
 
1520
+ ##
1521
+ # Determines the block parameter for +context+
1522
+
1409
1523
  def parse_yield(context, single, tk, method)
1410
1524
  return if method.block_params
1411
1525
 
@@ -1426,93 +1540,81 @@ class RDoc::Parser::Ruby < RDoc::Parser
1426
1540
  #
1427
1541
  # We return the directive name and any parameters as a two element array
1428
1542
 
1429
- def read_directive(allowed)
1543
+ def read_directive allowed
1430
1544
  tk = get_tk
1431
- result = nil
1432
1545
 
1433
1546
  if TkCOMMENT === tk then
1434
- if tk.text =~ /\s*:?(\w+):\s*(.*)/ then
1435
- directive = $1.downcase
1436
- if allowed.include? directive then
1437
- result = [directive, $2]
1438
- end
1439
- end
1547
+ return unless tk.text =~ /\s*:?(\w+):\s*(.*)/
1548
+
1549
+ directive = $1.downcase
1550
+
1551
+ return [directive, $2] if allowed.include? directive
1440
1552
  else
1441
1553
  unget_tk tk
1442
1554
  end
1443
-
1444
- result
1445
1555
  end
1446
1556
 
1447
- def read_documentation_modifiers(context, allow)
1448
- dir = read_directive(allow)
1449
-
1450
- case dir[0]
1451
- when "notnew", "not_new", "not-new" then
1452
- context.dont_rename_initialize = true
1453
-
1454
- when "nodoc" then
1455
- context.document_self = false
1456
- if dir[1].downcase == "all"
1457
- context.document_children = false
1458
- end
1459
-
1460
- when "doc" then
1461
- context.document_self = true
1462
- context.force_documentation = true
1557
+ ##
1558
+ # Handles the directive for +context+ if the directive is listed in +allow+.
1559
+ # This method is called for directives following a definition.
1463
1560
 
1464
- when "yield", "yields" then
1465
- unless context.params.nil?
1466
- context.params.sub!(/(,|)\s*&\w+/,'') # remove parameter &proc
1467
- end
1561
+ def read_documentation_modifiers(context, allow)
1562
+ directive, value = read_directive allow
1468
1563
 
1469
- context.block_params = dir[1]
1564
+ return unless directive
1470
1565
 
1471
- when "arg", "args" then
1472
- context.params = dir[1]
1473
- end if dir
1566
+ case directive
1567
+ when 'notnew', 'not_new', 'not-new' then
1568
+ context.dont_rename_initialize = true
1569
+ else
1570
+ RDoc::Parser.process_directive context, directive, value
1571
+ end
1474
1572
  end
1475
1573
 
1574
+ ##
1575
+ # Removes private comments from +comment+
1576
+
1476
1577
  def remove_private_comments(comment)
1477
- comment.gsub!(/^#--\n.*?^#\+\+/m, '')
1478
- comment.sub!(/^#--\n.*/m, '')
1578
+ comment.gsub!(/^#--\n.*?^#\+\+\n?/m, '')
1579
+ comment.sub!(/^#--\n.*\n?/m, '')
1479
1580
  end
1480
1581
 
1582
+ ##
1583
+ # Scans this ruby file for ruby constructs
1584
+
1481
1585
  def scan
1482
1586
  reset
1483
1587
 
1484
1588
  catch :eof do
1485
- catch :enddoc do
1486
- begin
1487
- parse_top_level_statements @top_level
1488
- rescue StandardError => e
1489
- bytes = ''
1490
-
1491
- 20.times do @scanner.ungetc end
1492
- count = 0
1493
- 60.times do |i|
1494
- count = i
1495
- byte = @scanner.getc
1496
- break unless byte
1497
- bytes << byte
1498
- end
1499
- count -= 20
1500
- count.times do @scanner.ungetc end
1589
+ begin
1590
+ parse_top_level_statements @top_level
1591
+ rescue StandardError => e
1592
+ bytes = ''
1593
+
1594
+ 20.times do @scanner.ungetc end
1595
+ count = 0
1596
+ 60.times do |i|
1597
+ count = i
1598
+ byte = @scanner.getc
1599
+ break unless byte
1600
+ bytes << byte
1601
+ end
1602
+ count -= 20
1603
+ count.times do @scanner.ungetc end
1501
1604
 
1502
- $stderr.puts <<-EOF
1605
+ $stderr.puts <<-EOF
1503
1606
 
1504
1607
  #{self.class} failure around line #{@scanner.line_no} of
1505
1608
  #{@file_name}
1506
1609
 
1507
- EOF
1610
+ EOF
1508
1611
 
1509
- unless bytes.empty? then
1510
- $stderr.puts
1511
- $stderr.puts bytes.inspect
1512
- end
1513
-
1514
- raise e
1612
+ unless bytes.empty? then
1613
+ $stderr.puts
1614
+ $stderr.puts bytes.inspect
1515
1615
  end
1616
+
1617
+ raise e
1516
1618
  end
1517
1619
  end
1518
1620
 
@@ -1577,6 +1679,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
1577
1679
  unget_tk(tk) unless TkIN === tk
1578
1680
  end
1579
1681
 
1682
+ ##
1683
+ # Skips the next method in +container+
1684
+
1580
1685
  def skip_method container
1581
1686
  meth = RDoc::AnyMethod.new "", "anon"
1582
1687
  parse_method_parameters meth
@@ -1594,6 +1699,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
1594
1699
  end
1595
1700
  end
1596
1701
 
1702
+ ##
1703
+ # Prints +msg+ to +$stderr+ unless we're being quiet
1704
+
1597
1705
  def warn(msg)
1598
1706
  return if @options.quiet
1599
1707
  msg = make_message msg