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.
- data.tar.gz.sig +0 -0
- data/.document +1 -0
- data/History.txt +95 -0
- data/Manifest.txt +13 -4
- data/README.txt +9 -3
- data/Rakefile +1 -1
- data/lib/rdoc.rb +15 -298
- data/lib/rdoc/alias.rb +65 -16
- data/lib/rdoc/any_method.rb +27 -150
- data/lib/rdoc/attr.rb +36 -115
- data/lib/rdoc/class_module.rb +236 -22
- data/lib/rdoc/code_object.rb +76 -31
- data/lib/rdoc/constant.rb +32 -4
- data/lib/rdoc/context.rb +494 -222
- data/lib/rdoc/encoding.rb +79 -0
- data/lib/rdoc/erbio.rb +37 -0
- data/lib/rdoc/gauntlet.rb +9 -5
- data/lib/rdoc/generator.rb +33 -1
- data/lib/rdoc/generator/darkfish.rb +284 -375
- data/lib/rdoc/generator/markup.rb +72 -36
- data/lib/rdoc/generator/ri.rb +4 -4
- data/lib/rdoc/generator/template/darkfish/classpage.rhtml +267 -274
- data/lib/rdoc/generator/template/darkfish/filepage.rhtml +91 -91
- data/lib/rdoc/generator/template/darkfish/index.rhtml +45 -45
- data/lib/rdoc/generator/template/darkfish/rdoc.css +298 -298
- data/lib/rdoc/include.rb +40 -1
- data/lib/rdoc/known_classes.rb +1 -0
- data/lib/rdoc/markup.rb +467 -2
- data/lib/rdoc/markup/attribute_manager.rb +24 -6
- data/lib/rdoc/markup/blank_line.rb +11 -3
- data/lib/rdoc/markup/document.rb +6 -0
- data/lib/rdoc/markup/formatter.rb +10 -0
- data/lib/rdoc/markup/formatter_test_case.rb +339 -3
- data/lib/rdoc/markup/heading.rb +3 -0
- data/lib/rdoc/markup/inline.rb +11 -1
- data/lib/rdoc/markup/list.rb +3 -0
- data/lib/rdoc/markup/list_item.rb +3 -0
- data/lib/rdoc/markup/paragraph.rb +3 -0
- data/lib/rdoc/markup/parser.rb +191 -237
- data/lib/rdoc/markup/{preprocess.rb → pre_process.rb} +50 -29
- data/lib/rdoc/markup/raw.rb +4 -0
- data/lib/rdoc/markup/rule.rb +3 -0
- data/lib/rdoc/markup/text_formatter_test_case.rb +116 -0
- data/lib/rdoc/markup/to_ansi.rb +14 -2
- data/lib/rdoc/markup/to_bs.rb +8 -2
- data/lib/rdoc/markup/to_html.rb +84 -91
- data/lib/rdoc/markup/to_html_crossref.rb +77 -26
- data/lib/rdoc/markup/to_rdoc.rb +94 -49
- data/lib/rdoc/markup/to_test.rb +9 -1
- data/lib/rdoc/markup/verbatim.rb +6 -3
- data/lib/rdoc/method_attr.rb +353 -0
- data/lib/rdoc/normal_class.rb +11 -2
- data/lib/rdoc/normal_module.rb +0 -5
- data/lib/rdoc/options.rb +373 -82
- data/lib/rdoc/parser.rb +59 -23
- data/lib/rdoc/parser/c.rb +224 -86
- data/lib/rdoc/parser/ruby.rb +219 -111
- data/lib/rdoc/parser/ruby_tools.rb +4 -1
- data/lib/rdoc/parser/simple.rb +9 -4
- data/lib/rdoc/rdoc.rb +68 -28
- data/lib/rdoc/require.rb +21 -0
- data/lib/rdoc/ri/driver.rb +20 -10
- data/lib/rdoc/ri/paths.rb +2 -2
- data/lib/rdoc/ri/store.rb +22 -5
- data/lib/rdoc/ruby_lex.rb +11 -12
- data/lib/rdoc/ruby_token.rb +2 -2
- data/lib/rdoc/single_class.rb +2 -1
- data/lib/rdoc/stats.rb +202 -162
- data/lib/rdoc/stats/normal.rb +51 -0
- data/lib/rdoc/stats/quiet.rb +59 -0
- data/lib/rdoc/stats/verbose.rb +45 -0
- data/lib/rdoc/text.rb +133 -4
- data/lib/rdoc/{tokenstream.rb → token_stream.rb} +0 -2
- data/lib/rdoc/top_level.rb +230 -39
- data/test/test_attribute_manager.rb +58 -7
- data/test/test_rdoc_alias.rb +13 -0
- data/test/test_rdoc_any_method.rb +43 -2
- data/test/test_rdoc_attr.rb +15 -8
- data/test/test_rdoc_class_module.rb +133 -0
- data/test/test_rdoc_code_object.rb +62 -5
- data/test/test_rdoc_context.rb +72 -26
- data/test/test_rdoc_encoding.rb +145 -0
- data/test/test_rdoc_generator_darkfish.rb +119 -0
- data/test/test_rdoc_generator_ri.rb +22 -2
- data/test/test_rdoc_include.rb +79 -0
- data/test/test_rdoc_markup_attribute_manager.rb +4 -4
- data/test/test_rdoc_markup_parser.rb +134 -95
- data/test/test_rdoc_markup_pre_process.rb +7 -2
- data/test/test_rdoc_markup_to_ansi.rb +43 -153
- data/test/test_rdoc_markup_to_bs.rb +42 -156
- data/test/test_rdoc_markup_to_html.rb +130 -58
- data/test/test_rdoc_markup_to_html_crossref.rb +10 -10
- data/test/test_rdoc_markup_to_rdoc.rb +40 -151
- data/test/test_rdoc_method_attr.rb +122 -0
- data/test/test_rdoc_normal_class.rb +1 -1
- data/test/test_rdoc_normal_module.rb +6 -1
- data/test/test_rdoc_options.rb +237 -12
- data/test/test_rdoc_parser.rb +3 -22
- data/test/test_rdoc_parser_c.rb +203 -2
- data/test/test_rdoc_parser_ruby.rb +403 -89
- data/test/test_rdoc_parser_simple.rb +25 -1
- data/test/test_rdoc_rdoc.rb +44 -32
- data/test/test_rdoc_ri_driver.rb +29 -24
- data/test/test_rdoc_ri_store.rb +46 -3
- data/test/test_rdoc_task.rb +1 -1
- data/test/test_rdoc_text.rb +102 -8
- data/test/test_rdoc_top_level.rb +13 -4
- data/test/xref_data.rb +8 -0
- data/test/xref_test_case.rb +6 -0
- metadata +29 -19
- metadata.gz.sig +0 -0
- data/lib/rdoc/parser/perl.rb +0 -165
- data/test/test_rdoc_parser_perl.rb +0 -73
data/lib/rdoc/parser/ruby.rb
CHANGED
@@ -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/
|
15
|
-
require 'rdoc/markup/
|
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
|
-
|
215
|
-
|
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
|
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
|
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
|
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
|
-
|
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.
|
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
|
-
|
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
|
-
|
442
|
-
|
443
|
-
|
467
|
+
|
468
|
+
context.add_attribute att if att.document_self
|
469
|
+
|
470
|
+
@stats.add_attribute att
|
444
471
|
else
|
445
|
-
warn
|
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
|
501
|
-
|
502
|
-
|
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
|
-
|
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 =
|
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 =
|
599
|
+
superclass = '(unknown)' if superclass.empty?
|
560
600
|
end
|
561
601
|
|
562
602
|
cls_type = single == SINGLE ? RDoc::SingleClass : RDoc::NormalClass
|
563
|
-
cls =
|
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,
|
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.
|
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.
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
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.
|
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
|
1543
|
+
def read_directive allowed
|
1430
1544
|
tk = get_tk
|
1431
|
-
result = nil
|
1432
1545
|
|
1433
1546
|
if TkCOMMENT === tk then
|
1434
|
-
|
1435
|
-
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
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
|
-
|
1448
|
-
|
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
|
-
|
1465
|
-
|
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
|
-
|
1564
|
+
return unless directive
|
1470
1565
|
|
1471
|
-
|
1472
|
-
|
1473
|
-
|
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
|
1478
|
-
comment.sub!(/^#--\n
|
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
|
-
|
1486
|
-
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
1490
|
-
|
1491
|
-
|
1492
|
-
|
1493
|
-
|
1494
|
-
|
1495
|
-
|
1496
|
-
|
1497
|
-
|
1498
|
-
|
1499
|
-
|
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
|
-
|
1605
|
+
$stderr.puts <<-EOF
|
1503
1606
|
|
1504
1607
|
#{self.class} failure around line #{@scanner.line_no} of
|
1505
1608
|
#{@file_name}
|
1506
1609
|
|
1507
|
-
|
1610
|
+
EOF
|
1508
1611
|
|
1509
|
-
|
1510
|
-
|
1511
|
-
|
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
|