rdoc 6.3.4.1 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +195 -0
  3. data/History.rdoc +65 -63
  4. data/LEGAL.rdoc +7 -1
  5. data/LICENSE.rdoc +6 -0
  6. data/README.md +236 -0
  7. data/RI.md +842 -0
  8. data/TODO.rdoc +8 -7
  9. data/doc/markup_reference/markdown.md +659 -0
  10. data/doc/markup_reference/rdoc.rdoc +1169 -0
  11. data/exe/rdoc +0 -1
  12. data/lib/rdoc/{alias.rb → code_object/alias.rb} +4 -18
  13. data/lib/rdoc/{any_method.rb → code_object/any_method.rb} +50 -24
  14. data/lib/rdoc/{attr.rb → code_object/attr.rb} +16 -14
  15. data/lib/rdoc/{class_module.rb → code_object/class_module.rb} +225 -58
  16. data/lib/rdoc/{constant.rb → code_object/constant.rb} +44 -10
  17. data/lib/rdoc/code_object/context/section.rb +182 -0
  18. data/lib/rdoc/{context.rb → code_object/context.rb} +78 -106
  19. data/lib/rdoc/{extend.rb → code_object/extend.rb} +0 -1
  20. data/lib/rdoc/{include.rb → code_object/include.rb} +0 -1
  21. data/lib/rdoc/{method_attr.rb → code_object/method_attr.rb} +46 -48
  22. data/lib/rdoc/{mixin.rb → code_object/mixin.rb} +6 -4
  23. data/lib/rdoc/{normal_class.rb → code_object/normal_class.rb} +2 -3
  24. data/lib/rdoc/{normal_module.rb → code_object/normal_module.rb} +2 -3
  25. data/lib/rdoc/{require.rb → code_object/require.rb} +1 -2
  26. data/lib/rdoc/{single_class.rb → code_object/single_class.rb} +5 -1
  27. data/lib/rdoc/{top_level.rb → code_object/top_level.rb} +60 -63
  28. data/lib/rdoc/code_object.rb +11 -39
  29. data/lib/rdoc/code_objects.rb +1 -2
  30. data/lib/rdoc/comment.rb +202 -99
  31. data/lib/rdoc/cross_reference.rb +75 -62
  32. data/lib/rdoc/encoding.rb +8 -24
  33. data/lib/rdoc/erb_partial.rb +1 -2
  34. data/lib/rdoc/erbio.rb +3 -8
  35. data/lib/rdoc/generator/aliki.rb +200 -0
  36. data/lib/rdoc/generator/darkfish.rb +156 -122
  37. data/lib/rdoc/generator/json_index.rb +8 -24
  38. data/lib/rdoc/generator/markup.rb +70 -34
  39. data/lib/rdoc/generator/pot/message_extractor.rb +7 -7
  40. data/lib/rdoc/generator/pot/po.rb +1 -1
  41. data/lib/rdoc/generator/pot/po_entry.rb +8 -8
  42. data/lib/rdoc/generator/pot.rb +1 -5
  43. data/lib/rdoc/generator/ri.rb +1 -2
  44. data/lib/rdoc/generator/template/aliki/DESIGN.md +536 -0
  45. data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +8 -0
  46. data/lib/rdoc/generator/template/aliki/_footer.rhtml +23 -0
  47. data/lib/rdoc/generator/template/aliki/_head.rhtml +163 -0
  48. data/lib/rdoc/generator/template/aliki/_header.rhtml +56 -0
  49. data/lib/rdoc/generator/template/aliki/_icons.rhtml +208 -0
  50. data/lib/rdoc/generator/template/aliki/_sidebar_ancestors.rhtml +16 -0
  51. data/lib/rdoc/generator/template/aliki/_sidebar_classes.rhtml +15 -0
  52. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +27 -0
  53. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +27 -0
  54. data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +16 -0
  55. data/lib/rdoc/generator/template/aliki/_sidebar_methods.rhtml +41 -0
  56. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +67 -0
  57. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +15 -0
  58. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +21 -0
  59. data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +3 -0
  60. data/lib/rdoc/generator/template/aliki/class.rhtml +230 -0
  61. data/lib/rdoc/generator/template/aliki/css/rdoc.css +2181 -0
  62. data/lib/rdoc/generator/template/aliki/index.rhtml +22 -0
  63. data/lib/rdoc/generator/template/aliki/js/aliki.js +513 -0
  64. data/lib/rdoc/generator/template/aliki/js/bash_highlighter.js +167 -0
  65. data/lib/rdoc/generator/template/aliki/js/c_highlighter.js +299 -0
  66. data/lib/rdoc/generator/template/aliki/js/search_controller.js +129 -0
  67. data/lib/rdoc/generator/template/aliki/js/search_navigation.js +105 -0
  68. data/lib/rdoc/generator/template/aliki/js/search_ranker.js +239 -0
  69. data/lib/rdoc/generator/template/aliki/js/theme-toggle.js +112 -0
  70. data/lib/rdoc/generator/template/aliki/page.rhtml +18 -0
  71. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +14 -0
  72. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +65 -0
  73. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +3 -3
  74. data/lib/rdoc/generator/template/darkfish/_head.rhtml +35 -14
  75. data/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +1 -5
  76. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +11 -9
  77. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +11 -9
  78. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +7 -6
  79. data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +20 -11
  80. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +25 -5
  81. data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +4 -9
  82. data/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +2 -1
  83. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +4 -4
  84. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +28 -7
  85. data/lib/rdoc/generator/template/darkfish/_sidebar_toggle.rhtml +3 -0
  86. data/lib/rdoc/generator/template/darkfish/class.rhtml +138 -90
  87. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +420 -358
  88. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf +0 -0
  89. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf +0 -0
  90. data/lib/rdoc/generator/template/darkfish/index.rhtml +14 -12
  91. data/lib/rdoc/generator/template/darkfish/js/darkfish.js +59 -3
  92. data/lib/rdoc/generator/template/darkfish/js/search.js +15 -5
  93. data/lib/rdoc/generator/template/darkfish/page.rhtml +7 -6
  94. data/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +12 -9
  95. data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +24 -21
  96. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +35 -21
  97. data/lib/rdoc/generator/template/json_index/js/navigation.js +8 -8
  98. data/lib/rdoc/generator/template/json_index/js/searcher.js +48 -6
  99. data/lib/rdoc/generator.rb +6 -5
  100. data/lib/rdoc/i18n/text.rb +3 -3
  101. data/lib/rdoc/i18n.rb +1 -1
  102. data/lib/rdoc/known_classes.rb +5 -4
  103. data/lib/rdoc/markdown/entities.rb +0 -1
  104. data/lib/rdoc/markdown/literals.kpeg +0 -2
  105. data/lib/rdoc/markdown/literals.rb +0 -1
  106. data/lib/rdoc/markdown.kpeg +140 -62
  107. data/lib/rdoc/markdown.rb +1015 -873
  108. data/lib/rdoc/markup/blank_line.rb +25 -24
  109. data/lib/rdoc/markup/block_quote.rb +1 -2
  110. data/lib/rdoc/markup/document.rb +10 -11
  111. data/lib/rdoc/markup/element.rb +21 -0
  112. data/lib/rdoc/markup/formatter.rb +134 -115
  113. data/lib/rdoc/markup/hard_break.rb +30 -28
  114. data/lib/rdoc/markup/heading.rb +163 -72
  115. data/lib/rdoc/markup/include.rb +3 -4
  116. data/lib/rdoc/markup/indented_paragraph.rb +4 -5
  117. data/lib/rdoc/markup/inline_parser.rb +312 -0
  118. data/lib/rdoc/markup/list.rb +6 -7
  119. data/lib/rdoc/markup/list_item.rb +6 -7
  120. data/lib/rdoc/markup/paragraph.rb +2 -3
  121. data/lib/rdoc/markup/parser.rb +29 -19
  122. data/lib/rdoc/markup/pre_process.rb +39 -18
  123. data/lib/rdoc/markup/raw.rb +52 -56
  124. data/lib/rdoc/markup/rule.rb +2 -3
  125. data/lib/rdoc/markup/table.rb +49 -32
  126. data/lib/rdoc/markup/to_ansi.rb +58 -8
  127. data/lib/rdoc/markup/to_bs.rb +47 -38
  128. data/lib/rdoc/markup/to_html.rb +343 -105
  129. data/lib/rdoc/markup/to_html_crossref.rb +143 -58
  130. data/lib/rdoc/markup/to_html_snippet.rb +78 -76
  131. data/lib/rdoc/markup/to_joined_paragraph.rb +3 -9
  132. data/lib/rdoc/markup/to_label.rb +34 -25
  133. data/lib/rdoc/markup/to_markdown.rb +74 -51
  134. data/lib/rdoc/markup/to_rdoc.rb +141 -82
  135. data/lib/rdoc/markup/to_table_of_contents.rb +4 -5
  136. data/lib/rdoc/markup/to_test.rb +10 -3
  137. data/lib/rdoc/markup/to_tt_only.rb +17 -31
  138. data/lib/rdoc/markup/verbatim.rb +5 -6
  139. data/lib/rdoc/markup.rb +59 -707
  140. data/lib/rdoc/options.rb +228 -101
  141. data/lib/rdoc/parser/c.rb +186 -184
  142. data/lib/rdoc/parser/changelog.rb +57 -13
  143. data/lib/rdoc/parser/markdown.rb +0 -2
  144. data/lib/rdoc/parser/rbs.rb +275 -0
  145. data/lib/rdoc/parser/rd.rb +0 -1
  146. data/lib/rdoc/parser/ruby.rb +963 -2024
  147. data/lib/rdoc/parser/ruby_colorizer.rb +253 -0
  148. data/lib/rdoc/parser/simple.rb +6 -23
  149. data/lib/rdoc/parser/text.rb +0 -1
  150. data/lib/rdoc/parser.rb +35 -14
  151. data/lib/rdoc/rbs_helper.rb +186 -0
  152. data/lib/rdoc/rd/block_parser.rb +659 -11
  153. data/lib/rdoc/rd/block_parser.ry +13 -9
  154. data/lib/rdoc/rd/inline.rb +4 -5
  155. data/lib/rdoc/rd/inline_parser.rb +646 -2
  156. data/lib/rdoc/rd.rb +4 -5
  157. data/lib/rdoc/rdoc.rb +234 -90
  158. data/lib/rdoc/ri/driver.rb +172 -172
  159. data/lib/rdoc/ri/paths.rb +3 -3
  160. data/lib/rdoc/{servlet.rb → ri/servlet.rb} +28 -27
  161. data/lib/rdoc/ri/store.rb +0 -1
  162. data/lib/rdoc/ri/task.rb +3 -3
  163. data/lib/rdoc/ri.rb +5 -5
  164. data/lib/rdoc/rubygems_hook.rb +106 -25
  165. data/lib/rdoc/server.rb +460 -0
  166. data/lib/rdoc/stats/normal.rb +1 -1
  167. data/lib/rdoc/stats/quiet.rb +1 -2
  168. data/lib/rdoc/stats/verbose.rb +3 -5
  169. data/lib/rdoc/stats.rb +158 -136
  170. data/lib/rdoc/store.rb +267 -48
  171. data/lib/rdoc/task.rb +54 -28
  172. data/lib/rdoc/text.rb +60 -120
  173. data/lib/rdoc/token_stream.rb +30 -45
  174. data/lib/rdoc/tom_doc.rb +9 -15
  175. data/lib/rdoc/version.rb +3 -1
  176. data/lib/rdoc.rb +90 -52
  177. data/lib/rubygems_plugin.rb +14 -0
  178. data/man/ri.1 +2 -0
  179. data/rdoc-logo.svg +43 -0
  180. data/rdoc.gemspec +25 -200
  181. metadata +120 -53
  182. data/CONTRIBUTING.rdoc +0 -220
  183. data/ExampleMarkdown.md +0 -37
  184. data/ExampleRDoc.rdoc +0 -208
  185. data/Gemfile +0 -12
  186. data/README.rdoc +0 -129
  187. data/RI.rdoc +0 -57
  188. data/Rakefile +0 -101
  189. data/bin/console +0 -7
  190. data/bin/setup +0 -6
  191. data/lib/rdoc/anon_class.rb +0 -11
  192. data/lib/rdoc/context/section.rb +0 -232
  193. data/lib/rdoc/generator/template/darkfish/.document +0 -0
  194. data/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +0 -19
  195. data/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +0 -9
  196. data/lib/rdoc/generator/template/json_index/.document +0 -1
  197. data/lib/rdoc/ghost_method.rb +0 -7
  198. data/lib/rdoc/markup/attr_changer.rb +0 -23
  199. data/lib/rdoc/markup/attr_span.rb +0 -36
  200. data/lib/rdoc/markup/attribute_manager.rb +0 -409
  201. data/lib/rdoc/markup/attributes.rb +0 -71
  202. data/lib/rdoc/markup/regexp_handling.rb +0 -41
  203. data/lib/rdoc/meta_method.rb +0 -7
  204. data/lib/rdoc/parser/ripper_state_lex.rb +0 -590
  205. data/lib/rdoc/parser/ruby_tools.rb +0 -167
data/lib/rdoc/parser/c.rb CHANGED
@@ -122,6 +122,11 @@ class RDoc::Parser::C < RDoc::Parser
122
122
 
123
123
  include RDoc::Text
124
124
 
125
+ # :stopdoc:
126
+ BOOL_ARG_PATTERN = /\s*+\b([01]|Q?(?:true|false)|TRUE|FALSE)\b\s*/
127
+ TRUE_VALUES = ['1', 'TRUE', 'true', 'Qtrue'].freeze
128
+ # :startdoc:
129
+
125
130
  ##
126
131
  # Maps C variable names to names of Ruby classes or modules
127
132
 
@@ -163,7 +168,7 @@ class RDoc::Parser::C < RDoc::Parser
163
168
  # Prepares for parsing a C file. See RDoc::Parser#initialize for details on
164
169
  # the arguments.
165
170
 
166
- def initialize top_level, file_name, content, options, stats
171
+ def initialize(top_level, content, options, stats)
167
172
  super
168
173
 
169
174
  @known_classes = RDoc::KNOWN_CLASSES.dup
@@ -173,6 +178,8 @@ class RDoc::Parser::C < RDoc::Parser
173
178
  @classes = load_variable_map :c_class_variables
174
179
  @singleton_classes = load_variable_map :c_singleton_class_variables
175
180
 
181
+ @markup = @options.markup
182
+
176
183
  # class_variable => { function => [method, ...] }
177
184
  @methods = Hash.new { |h, f| h[f] = Hash.new { |i, m| i[m] = [] } }
178
185
 
@@ -186,7 +193,7 @@ class RDoc::Parser::C < RDoc::Parser
186
193
 
187
194
  @enclosure_dependencies.extend TSort
188
195
 
189
- def @enclosure_dependencies.tsort_each_node &block
196
+ def @enclosure_dependencies.tsort_each_node(&block)
190
197
  each_key(&block)
191
198
  rescue TSort::Cyclic => e
192
199
  cycle_vars = e.message.scan(/"(.*?)"/).flatten
@@ -204,7 +211,7 @@ class RDoc::Parser::C < RDoc::Parser
204
211
  retry
205
212
  end
206
213
 
207
- def @enclosure_dependencies.tsort_each_child node, &block
214
+ def @enclosure_dependencies.tsort_each_child(node, &block)
208
215
  fetch(node, []).each(&block)
209
216
  end
210
217
  end
@@ -241,9 +248,7 @@ class RDoc::Parser::C < RDoc::Parser
241
248
  # method that reference the same function.
242
249
 
243
250
  def add_alias(var_name, class_obj, old_name, new_name, comment)
244
- al = RDoc::Alias.new '', old_name, new_name, ''
245
- al.singleton = @singleton_classes.key? var_name
246
- al.comment = comment
251
+ al = RDoc::Alias.new old_name, new_name, comment, singleton: @singleton_classes.key?(var_name)
247
252
  al.record_location @top_level
248
253
  class_obj.add_alias al
249
254
  @stats.add_alias al
@@ -257,18 +262,18 @@ class RDoc::Parser::C < RDoc::Parser
257
262
  @content.scan(/rb_attr\s*\(
258
263
  \s*(\w+),
259
264
  \s*([\w"()]+),
260
- \s*([01]),
261
- \s*([01]),
262
- \s*\w+\);/xm) do |var_name, attr_name, read, write|
265
+ #{BOOL_ARG_PATTERN},
266
+ #{BOOL_ARG_PATTERN},
267
+ \s*\w+\);/xmo) do |var_name, attr_name, read, write|
263
268
  handle_attr var_name, attr_name, read, write
264
269
  end
265
270
 
266
271
  @content.scan(%r%rb_define_attr\(
267
272
  \s*([\w\.]+),
268
273
  \s*"([^"]+)",
269
- \s*(\d+),
270
- \s*(\d+)\s*\);
271
- %xm) do |var_name, attr_name, read, write|
274
+ #{BOOL_ARG_PATTERN},
275
+ #{BOOL_ARG_PATTERN}\);
276
+ %xmo) do |var_name, attr_name, read, write|
272
277
  handle_attr var_name, attr_name, read, write
273
278
  end
274
279
  end
@@ -293,94 +298,92 @@ class RDoc::Parser::C < RDoc::Parser
293
298
 
294
299
  @content.scan(
295
300
  %r(
301
+ (?<open>\s*\(\s*) {0}
302
+ (?<close>\s*\)\s*) {0}
303
+ (?<name>\s*"(?<class_name>\w+)") {0}
304
+ (?<parent>\s*(?:
305
+ (?<parent_name>[\w\*\s\(\)\.\->]+) |
306
+ rb_path2class\s*\(\s*"(?<path>[\w:]+)"\s*\)
307
+ )) {0}
308
+ (?<under>\w+) {0}
309
+
296
310
  (?<var_name>[\w\.]+)\s* =
297
311
  \s*rb_(?:
298
312
  define_(?:
299
- class(?: # rb_define_class(class_name_1, parent_name_1)
300
- \s*\(
301
- \s*"(?<class_name_1>\w+)",
302
- \s*(?<parent_name_1>\w+)\s*
303
- \)
304
- |
305
- _under\s*\( # rb_define_class_under(class_under, class_name2, parent_name2...)
306
- \s* (?<class_under>\w+),
307
- \s* "(?<class_name_2>\w+)",
308
- \s*
309
- (?:
310
- (?<parent_name_2>[\w\*\s\(\)\.\->]+) |
311
- rb_path2class\("(?<path>[\w:]+)"\)
312
- )
313
+ class(?: # rb_define_class(name, parent_name)
314
+ \(\s*
315
+ \g<name>,
316
+ \g<parent>
313
317
  \s*\)
318
+ |
319
+ _under\g<open> # rb_define_class_under(under, name, parent_name...)
320
+ \g<under>,
321
+ \g<name>,
322
+ \g<parent>
323
+ \g<close>
314
324
  )
315
325
  |
316
- module(?: # rb_define_module(module_name_1)
317
- \s*\(
318
- \s*"(?<module_name_1>\w+)"\s*
319
- \)
326
+ (?<module>)
327
+ module(?: # rb_define_module(name)
328
+ \g<open>
329
+ \g<name>
330
+ \g<close>
320
331
  |
321
- _under\s*\( # rb_define_module_under(module_under, module_name_2)
322
- \s*(?<module_under>\w+),
323
- \s*"(?<module_name_2>\w+)"
324
- \s*\)
332
+ _under\g<open> # rb_define_module_under(under, name)
333
+ \g<under>,
334
+ \g<name>
335
+ \g<close>
325
336
  )
326
337
  )
327
338
  |
328
- struct_define_without_accessor\s*\( # rb_struct_define_without_accessor(class_name_3, parent_name_3, ...)
329
- \s*"(?<class_name_3>\w+)",
330
- \s*(?<parent_name_3>\w+),
331
- \s*\w+, # Allocation function
332
- (?:\s*"\w+",)* # Attributes
333
- \s*NULL
334
- \)
339
+ (?<attributes>(?:\s*"\w+",)*\s*NULL\s*) {0}
340
+ struct_define(?:
341
+ \g<open> # rb_struct_define(name, ...)
342
+ \g<name>,
343
+ |
344
+ _under\g<open> # rb_struct_define_under(under, name, ...)
345
+ \g<under>,
346
+ \g<name>,
347
+ |
348
+ _without_accessor(?:
349
+ \g<open> # rb_struct_define_without_accessor(name, parent_name, ...)
350
+ |
351
+ _under\g<open> # rb_struct_define_without_accessor_under(under, name, parent_name, ...)
352
+ \g<under>,
353
+ )
354
+ \g<name>,
355
+ \g<parent>,
356
+ \s*\w+, # Allocation function
357
+ )
358
+ \g<attributes>
359
+ \g<close>
335
360
  |
336
- singleton_class\s*\( # rb_singleton_class(target_class_name)
337
- \s*(?<target_class_name>\w+)
338
- \)
361
+ singleton_class\g<open> # rb_singleton_class(target_class_name)
362
+ (?<target_class_name>\w+)
363
+ \g<close>
339
364
  )
340
365
  )mx
341
366
  ) do
342
- class_name = $~[:class_name_1]
343
- type = :class
344
- if class_name
345
- # rb_define_class(class_name_1, parent_name_1)
346
- parent_name = $~[:parent_name_1]
347
- #under = nil
348
- else
349
- class_name = $~[:class_name_2]
350
- if class_name
351
- # rb_define_class_under(class_under, class_name2, parent_name2...)
352
- parent_name = $~[:parent_name_2] || $~[:path]
353
- under = $~[:class_under]
354
- else
355
- class_name = $~[:class_name_3]
356
- if class_name
357
- # rb_struct_define_without_accessor(class_name_3, parent_name_3, ...)
358
- parent_name = $~[:parent_name_3]
359
- #under = nil
360
- else
361
- type = :module
362
- class_name = $~[:module_name_1]
363
- #parent_name = nil
364
- if class_name
365
- # rb_define_module(module_name_1)
366
- #under = nil
367
- else
368
- class_name = $~[:module_name_2]
369
- if class_name
370
- # rb_define_module_under(module_under, module_name_1)
371
- under = $~[:module_under]
372
- else
373
- # rb_singleton_class(target_class_name)
374
- target_class_name = $~[:target_class_name]
375
- handle_singleton $~[:var_name], target_class_name
376
- next
377
- end
378
- end
379
- end
380
- end
367
+ if target_class_name = $~[:target_class_name]
368
+ # rb_singleton_class(target_class_name)
369
+ handle_singleton $~[:var_name], target_class_name
370
+ next
381
371
  end
382
372
 
383
- handle_class_module($~[:var_name], type, class_name, parent_name, under)
373
+ var_name = $~[:var_name]
374
+ type = $~[:module] ? :module : :class
375
+ class_name = $~[:class_name]
376
+ parent_name = $~[:parent_name] || $~[:path]
377
+ under = $~[:under]
378
+ attributes = $~[:attributes]
379
+
380
+ handle_class_module(var_name, type, class_name, parent_name, under)
381
+ if attributes and !parent_name # rb_struct_define *not* without_accessor
382
+ true_flag = 'Qtrue'
383
+ attributes.scan(/"\K\w+(?=")/) do |attr_name|
384
+ handle_attr var_name, attr_name, true_flag, true_flag
385
+ end
386
+ end
384
387
  end
385
388
  end
386
389
 
@@ -400,6 +403,7 @@ class RDoc::Parser::C < RDoc::Parser
400
403
  \s*(.*?)\s*\)\s*;
401
404
  %xm) do |type, var_name, const_name, definition|
402
405
  var_name = "rb_cObject" if !var_name or var_name == "rb_mKernel"
406
+ type = "const" if type == "global_const"
403
407
  handle_constants type, var_name, const_name, definition
404
408
  end
405
409
 
@@ -435,11 +439,11 @@ class RDoc::Parser::C < RDoc::Parser
435
439
  # Scans #content for rb_include_module
436
440
 
437
441
  def do_includes
438
- @content.scan(/rb_include_module\s*\(\s*(\w+?),\s*(\w+?)\s*\)/) do |c,m|
442
+ @content.scan(/rb_include_module\s*\(\s*(\w+?),\s*(\w+?)\s*\)/) do |c, m|
439
443
  next unless cls = @classes[c]
440
444
  m = @known_classes[m] || m
441
445
 
442
- comment = RDoc::Comment.new '', @top_level, :c
446
+ comment = new_comment '', @top_level, :c
443
447
  incl = cls.add_include RDoc::Include.new(m, comment)
444
448
  incl.record_location @top_level
445
449
  end
@@ -515,13 +519,13 @@ class RDoc::Parser::C < RDoc::Parser
515
519
  # Finds the comment for an alias on +class_name+ from +new_name+ to
516
520
  # +old_name+
517
521
 
518
- def find_alias_comment class_name, new_name, old_name
522
+ def find_alias_comment(class_name, new_name, old_name)
519
523
  content =~ %r%((?>/\*.*?\*/\s+))
520
524
  rb_define_alias\(\s*#{Regexp.escape class_name}\s*,
521
525
  \s*"#{Regexp.escape new_name}"\s*,
522
526
  \s*"#{Regexp.escape old_name}"\s*\);%xm
523
527
 
524
- RDoc::Comment.new($1 || '', @top_level, :c)
528
+ new_comment($1 || '', @top_level, :c)
525
529
  end
526
530
 
527
531
  ##
@@ -533,7 +537,7 @@ class RDoc::Parser::C < RDoc::Parser
533
537
  # +read+ and +write+ are the read/write flags ('1' or '0'). Either both or
534
538
  # neither must be provided.
535
539
 
536
- def find_attr_comment var_name, attr_name, read = nil, write = nil
540
+ def find_attr_comment(var_name, attr_name, read = nil, write = nil)
537
541
  attr_name = Regexp.escape attr_name
538
542
 
539
543
  rw = if read and write then
@@ -560,29 +564,28 @@ class RDoc::Parser::C < RDoc::Parser
560
564
  ''
561
565
  end
562
566
 
563
- RDoc::Comment.new comment, @top_level, :c
567
+ new_comment comment, @top_level, :c
564
568
  end
565
569
 
566
570
  ##
567
571
  # Generate a Ruby-method table
568
572
 
569
- def gen_body_table file_content
573
+ def gen_body_table(file_content)
570
574
  table = {}
571
575
  file_content.scan(%r{
572
576
  ((?>/\*.*?\*/\s*)?)
573
- ((?:(?:\w+)\s+)?
574
- (?:intern\s+)?VALUE\s+(\w+)
575
- \s*(?:\([^)]*\))(?:[^\);]|$))
577
+ ((?:\w+\s+){0,2} VALUE\s+(\w+)
578
+ \s*(?:\([^\)]*\))(?:[^\);]|$))
576
579
  | ((?>/\*.*?\*/\s*))^\s*(\#\s*define\s+(\w+)\s+(\w+))
577
580
  | ^\s*\#\s*define\s+(\w+)\s+(\w+)
578
581
  }xm) do
579
582
  case
580
- when $1
581
- table[$3] = [:func_def, $1, $2, $~.offset(2)] if !table[$3] || table[$3][0] != :func_def
582
- when $4
583
- table[$6] = [:macro_def, $4, $5, $~.offset(5), $7] if !table[$6] || table[$6][0] == :macro_alias
584
- when $8
585
- table[$8] ||= [:macro_alias, $9]
583
+ when name = $3
584
+ table[name] = [:func_def, $1, $2, $~.offset(2)] if !(t = table[name]) || t[0] != :func_def
585
+ when name = $6
586
+ table[name] = [:macro_def, $4, $5, $~.offset(5), $7] if !(t = table[name]) || t[0] == :macro_alias
587
+ when name = $8
588
+ table[name] ||= [:macro_alias, $9]
586
589
  end
587
590
  end
588
591
  table
@@ -591,7 +594,7 @@ class RDoc::Parser::C < RDoc::Parser
591
594
  ##
592
595
  # Find the C code corresponding to a Ruby method
593
596
 
594
- def find_body class_name, meth_name, meth_obj, file_content, quiet = false
597
+ def find_body(class_name, meth_name, meth_obj, file_content, quiet = false)
595
598
  if file_content
596
599
  @body_table ||= {}
597
600
  @body_table[file_content] ||= gen_body_table file_content
@@ -600,12 +603,10 @@ class RDoc::Parser::C < RDoc::Parser
600
603
 
601
604
  case type
602
605
  when :func_def
603
- comment = RDoc::Comment.new args[0], @top_level, :c
606
+ comment = new_comment args[0], @top_level, :c
604
607
  body = args[1]
605
608
  offset, = args[2]
606
609
 
607
- comment.remove_private if comment
608
-
609
610
  # try to find the whole body
610
611
  body = $& if /#{Regexp.escape body}[^(]*?\{.*?^\}/m =~ file_content
611
612
 
@@ -618,11 +619,10 @@ class RDoc::Parser::C < RDoc::Parser
618
619
  override_comment = find_override_comment class_name, meth_obj
619
620
  comment = override_comment if override_comment
620
621
 
621
- comment.normalize
622
622
  find_modifiers comment, meth_obj if comment
623
623
 
624
624
  #meth_obj.params = params
625
- meth_obj.start_collecting_tokens
625
+ meth_obj.start_collecting_tokens(:c)
626
626
  tk = { :line_no => 1, :char_no => 1, :text => body }
627
627
  meth_obj.add_token tk
628
628
  meth_obj.comment = comment
@@ -630,16 +630,15 @@ class RDoc::Parser::C < RDoc::Parser
630
630
 
631
631
  body
632
632
  when :macro_def
633
- comment = RDoc::Comment.new args[0], @top_level, :c
633
+ comment = new_comment args[0], @top_level, :c
634
634
  body = args[1]
635
635
  offset, = args[2]
636
636
 
637
637
  find_body class_name, args[3], meth_obj, file_content, true
638
638
 
639
- comment.normalize
640
639
  find_modifiers comment, meth_obj
641
640
 
642
- meth_obj.start_collecting_tokens
641
+ meth_obj.start_collecting_tokens(:c)
643
642
  tk = { :line_no => 1, :char_no => 1, :text => body }
644
643
  meth_obj.add_token tk
645
644
  meth_obj.comment = comment
@@ -660,7 +659,6 @@ class RDoc::Parser::C < RDoc::Parser
660
659
  comment = find_override_comment class_name, meth_obj
661
660
 
662
661
  if comment then
663
- comment.normalize
664
662
  find_modifiers comment, meth_obj
665
663
  meth_obj.comment = comment
666
664
 
@@ -675,15 +673,17 @@ class RDoc::Parser::C < RDoc::Parser
675
673
  ##
676
674
  # Finds a RDoc::NormalClass or RDoc::NormalModule for +raw_name+
677
675
 
678
- def find_class(raw_name, name)
676
+ def find_class(raw_name, name, base_name = nil)
679
677
  unless @classes[raw_name]
680
678
  if raw_name =~ /^rb_m/
681
679
  container = @top_level.add_module RDoc::NormalModule, name
682
680
  else
683
681
  container = @top_level.add_class RDoc::NormalClass, name
684
682
  end
683
+ container.name = base_name if base_name
685
684
 
686
685
  container.record_location @top_level
686
+ @top_level.add_to_classes_or_modules container
687
687
  @classes[raw_name] = container
688
688
  end
689
689
  @classes[raw_name]
@@ -715,14 +715,14 @@ class RDoc::Parser::C < RDoc::Parser
715
715
  # */
716
716
  # VALUE cFoo = rb_define_class("Foo", rb_cObject);
717
717
 
718
- def find_class_comment class_name, class_mod
718
+ def find_class_comment(class_name, class_mod)
719
719
  comment = nil
720
720
 
721
721
  if @content =~ %r%
722
722
  ((?>/\*.*?\*/\s+))
723
723
  (static\s+)?
724
724
  void\s+
725
- Init_#{class_name}\s*(?:_\(\s*)?\(\s*(?:void\s*)?\)%xmi then
725
+ Init(?:VM)?_(?i:#{class_name})\s*(?:_\(\s*)?\(\s*(?:void\s*)?\)%xm then
726
726
  comment = $1.sub(%r%Document-(?:class|module):\s+#{class_name}%, '')
727
727
  elsif @content =~ %r%Document-(?:class|module):\s+#{class_name}\s*?
728
728
  (?:<\s+[:,\w]+)?\n((?>.*?\*/))%xm then
@@ -737,8 +737,7 @@ class RDoc::Parser::C < RDoc::Parser
737
737
  comment = ''
738
738
  end
739
739
 
740
- comment = RDoc::Comment.new comment, @top_level, :c
741
- comment.normalize
740
+ comment = new_comment comment, @top_level, :c
742
741
 
743
742
  look_for_directives_in class_mod, comment
744
743
 
@@ -748,20 +747,34 @@ class RDoc::Parser::C < RDoc::Parser
748
747
  ##
749
748
  # Generate a const table
750
749
 
751
- def gen_const_table file_content
750
+ def gen_const_table(file_content)
752
751
  table = {}
753
752
  @content.scan(%r{
754
- ((?>^\s*/\*.*?\*/\s+))
755
- rb_define_(\w+)\((?:\s*(?:\w+),)?\s*
756
- "(\w+)"\s*,
753
+ (?<doc>(?>^\s*/\*.*?\*/\s+))
754
+ rb_define_(?<type>\w+)\(\s*(?:\w+),\s*
755
+ "(?<name>\w+)"\s*,
757
756
  .*?\)\s*;
757
+ | (?<doc>(?>^\s*/\*.*?\*/\s+))
758
+ rb_define_global_(?<type>const)\(\s*
759
+ "(?<name>\w+)"\s*,
760
+ .*?\)\s*;
761
+ | (?<doc>(?>^\s*/\*.*?\*/\s+))
762
+ rb_file_(?<type>const)\(\s*
763
+ "(?<name>\w+)"\s*,
764
+ .*?\)\s*;
765
+ | (?<doc>(?>^\s*/\*.*?\*/\s+))
766
+ rb_curses_define_(?<type>const)\(\s*
767
+ (?<name>\w+)
768
+ \s*\)\s*;
758
769
  | Document-(?:const|global|variable):\s
759
- ((?:\w+::)*\w+)
760
- \s*?\n((?>.*?\*/))
770
+ (?<name>(?:\w+::)*\w+)
771
+ \s*?\n(?<doc>(?>.*?\*/))
761
772
  }mxi) do
762
- case
763
- when $1 then table[[$2, $3]] = $1
764
- when $4 then table[$4] = "/*\n" + $5
773
+ name, doc, type = $~.values_at(:name, :doc, :type)
774
+ if type
775
+ table[[type, name]] = doc
776
+ else
777
+ table[name] = "/*\n" + doc
765
778
  end
766
779
  end
767
780
  table
@@ -782,38 +795,35 @@ class RDoc::Parser::C < RDoc::Parser
782
795
  table[const_name] ||
783
796
  ''
784
797
 
785
- RDoc::Comment.new comment, @top_level, :c
798
+ new_comment comment, @top_level, :c
786
799
  end
787
800
 
788
801
  ##
789
802
  # Handles modifiers in +comment+ and updates +meth_obj+ as appropriate.
790
803
 
791
- def find_modifiers comment, meth_obj
792
- comment.normalize
793
- comment.extract_call_seq meth_obj
794
-
804
+ def find_modifiers(comment, meth_obj)
795
805
  look_for_directives_in meth_obj, comment
796
806
  end
797
807
 
798
808
  ##
799
809
  # Finds a <tt>Document-method</tt> override for +meth_obj+ on +class_name+
800
810
 
801
- def find_override_comment class_name, meth_obj
811
+ def find_override_comment(class_name, meth_obj)
802
812
  name = Regexp.escape meth_obj.name
803
813
  prefix = Regexp.escape meth_obj.name_prefix
804
814
 
805
815
  comment = if @content =~ %r%Document-method:
806
816
  \s+#{class_name}#{prefix}#{name}
807
817
  \s*?\n((?>.*?\*/))%xm then
808
- "/*#{$1}"
818
+ "/*\n#{$1}"
809
819
  elsif @content =~ %r%Document-method:
810
820
  \s#{name}\s*?\n((?>.*?\*/))%xm then
811
- "/*#{$1}"
821
+ "/*\n#{$1}"
812
822
  end
813
823
 
814
824
  return unless comment
815
825
 
816
- RDoc::Comment.new comment, @top_level, :c
826
+ new_comment comment, @top_level, :c
817
827
  end
818
828
 
819
829
  ##
@@ -822,8 +832,8 @@ class RDoc::Parser::C < RDoc::Parser
822
832
 
823
833
  def handle_attr(var_name, attr_name, read, write)
824
834
  rw = ''
825
- rw += 'R' if '1' == read
826
- rw += 'W' if '1' == write
835
+ rw += 'R' if TRUE_VALUES.include?(read)
836
+ rw += 'W' if TRUE_VALUES.include?(write)
827
837
 
828
838
  class_name = @known_classes[var_name]
829
839
 
@@ -838,7 +848,7 @@ class RDoc::Parser::C < RDoc::Parser
838
848
 
839
849
  name = attr_name.gsub(/rb_intern(?:_const)?\("([^"]+)"\)/, '\1')
840
850
 
841
- attr = RDoc::Attr.new '', name, rw, comment
851
+ attr = RDoc::Attr.new name, rw, comment
842
852
 
843
853
  attr.record_location @top_level
844
854
  class_obj.add_attribute attr
@@ -889,6 +899,7 @@ class RDoc::Parser::C < RDoc::Parser
889
899
  end
890
900
 
891
901
  cm.record_location enclosure.top_level
902
+ enclosure.top_level.add_to_classes_or_modules cm
892
903
 
893
904
  find_class_comment cm.full_name, cm
894
905
 
@@ -919,7 +930,7 @@ class RDoc::Parser::C < RDoc::Parser
919
930
 
920
931
  return unless class_name
921
932
 
922
- class_obj = find_class var_name, class_name
933
+ class_obj = find_class var_name, class_name, class_name[/::\K[^:]+\z/]
923
934
 
924
935
  unless class_obj then
925
936
  @options.warn 'Enclosing class or module %p is not known' % [const_name]
@@ -933,21 +944,20 @@ class RDoc::Parser::C < RDoc::Parser
933
944
  # "/* definition: comment */" form. The literal ':' and '\' characters
934
945
  # can be escaped with a backslash.
935
946
  if type.downcase == 'const' then
936
- no_match, new_definition, new_comment = comment.text.split(/(\A.*):/)
947
+ if /\A(.+?)?:(?!\S)/ =~ comment.text
948
+ new_definition, new_comment = $1, $'
937
949
 
938
- if no_match and no_match.empty? then
939
- if new_definition.empty? then # Default to literal C definition
950
+ if !new_definition # Default to literal C definition
940
951
  new_definition = definition
941
952
  else
942
- new_definition = new_definition.gsub("\:", ":")
943
- new_definition = new_definition.gsub("\\", '\\')
953
+ new_definition = new_definition.gsub(/\\([\\:])/, '\1')
944
954
  end
945
955
 
946
956
  new_definition.sub!(/\A(\s+)/, '')
947
957
 
948
958
  new_comment = "#{$1}#{new_comment.lstrip}"
949
959
 
950
- new_comment = RDoc::Comment.new new_comment, @top_level, :c
960
+ new_comment = self.new_comment(new_comment, @top_level, :c)
951
961
 
952
962
  con = RDoc::Constant.new const_name, new_definition, new_comment
953
963
  else
@@ -996,10 +1006,9 @@ class RDoc::Parser::C < RDoc::Parser
996
1006
  type = 'method' # force public
997
1007
  end
998
1008
 
999
- meth_obj = RDoc::AnyMethod.new '', meth_name
1009
+ singleton = singleton || %w[singleton_method module_function].include?(type)
1010
+ meth_obj = RDoc::AnyMethod.new meth_name, singleton: singleton
1000
1011
  meth_obj.c_function = function
1001
- meth_obj.singleton =
1002
- singleton || %w[singleton_method module_function].include?(type)
1003
1012
 
1004
1013
  p_count = Integer(param_count) rescue -1
1005
1014
 
@@ -1007,7 +1016,7 @@ class RDoc::Parser::C < RDoc::Parser
1007
1016
  file_name = File.join @file_dir, source_file
1008
1017
 
1009
1018
  if File.exist? file_name then
1010
- file_content = File.read file_name
1019
+ file_content = RDoc::Encoding.read_file file_name, @options.encoding
1011
1020
  else
1012
1021
  @options.warn "unknown source #{source_file} for #{meth_name} in #{@file_name}"
1013
1022
  end
@@ -1023,12 +1032,18 @@ class RDoc::Parser::C < RDoc::Parser
1023
1032
  elsif p_count == -1 then # argc, argv
1024
1033
  rb_scan_args body
1025
1034
  else
1026
- "(#{(1..p_count).map { |i| "p#{i}" }.join ', '})"
1035
+ args = (1..p_count).map { |i| "p#{i}" }
1036
+ "(#{args.join ', '})"
1027
1037
  end
1028
1038
 
1029
1039
 
1030
1040
  meth_obj.record_location @top_level
1041
+
1042
+ if meth_obj.section_title
1043
+ class_obj.temporary_section = class_obj.add_section(meth_obj.section_title)
1044
+ end
1031
1045
  class_obj.add_method meth_obj
1046
+
1032
1047
  @stats.add_method meth_obj
1033
1048
  meth_obj.visibility = :private if 'private_method' == type
1034
1049
  end
@@ -1038,27 +1053,13 @@ class RDoc::Parser::C < RDoc::Parser
1038
1053
  ##
1039
1054
  # Registers a singleton class +sclass_var+ as a singleton of +class_var+
1040
1055
 
1041
- def handle_singleton sclass_var, class_var
1042
- class_name = @known_classes[class_var]
1043
-
1044
- @known_classes[sclass_var] = class_name
1045
- @singleton_classes[sclass_var] = class_name
1046
- end
1047
-
1048
- ##
1049
- # Normalizes tabs in +body+
1050
-
1051
- def handle_tab_width(body)
1052
- if /\t/ =~ body
1053
- tab_width = @options.tab_width
1054
- body.split(/\n/).map do |line|
1055
- 1 while line.gsub!(/\t+/) do
1056
- ' ' * (tab_width * $&.length - $`.length % tab_width)
1057
- end && $~
1058
- line
1059
- end.join "\n"
1060
- else
1061
- body
1056
+ def handle_singleton(sclass_var, class_var)
1057
+ if (klass = @classes[class_var])
1058
+ @classes[sclass_var] = klass
1059
+ end
1060
+ if (class_name = @known_classes[class_var])
1061
+ @known_classes[sclass_var] = class_name
1062
+ @singleton_classes[sclass_var] = class_name
1062
1063
  end
1063
1064
  end
1064
1065
 
@@ -1066,7 +1067,7 @@ class RDoc::Parser::C < RDoc::Parser
1066
1067
  # Loads the variable map with the given +name+ from the RDoc::Store, if
1067
1068
  # present.
1068
1069
 
1069
- def load_variable_map map_name
1070
+ def load_variable_map(map_name)
1070
1071
  return {} unless files = @store.cache[map_name]
1071
1072
  return {} unless name_map = files[@file_name]
1072
1073
 
@@ -1090,23 +1091,16 @@ class RDoc::Parser::C < RDoc::Parser
1090
1091
  # Look for directives in a normal comment block:
1091
1092
  #
1092
1093
  # /*
1093
- # * :title: My Awesome Project
1094
+ # * :nodoc:
1094
1095
  # */
1095
1096
  #
1096
1097
  # This method modifies the +comment+
1097
1098
 
1098
- def look_for_directives_in context, comment
1099
- @preprocess.handle comment, context do |directive, param|
1100
- case directive
1101
- when 'main' then
1102
- @options.main_page = param
1103
- ''
1104
- when 'title' then
1105
- @options.default_title = param if @options.respond_to? :default_title=
1106
- ''
1107
- end
1108
- end
1109
-
1099
+ def look_for_directives_in(context, comment)
1100
+ comment.text, format = @preprocess.run_pre_processes(comment.text, context, comment.line || 1, :c)
1101
+ comment.format = format if format
1102
+ @preprocess.run_post_processes(comment, context)
1103
+ comment.normalized = true
1110
1104
  comment
1111
1105
  end
1112
1106
 
@@ -1114,7 +1108,7 @@ class RDoc::Parser::C < RDoc::Parser
1114
1108
  # Extracts parameters from the +method_body+ and returns a method
1115
1109
  # parameter string. Follows 1.9.3dev's scan-arg-spec, see README.EXT
1116
1110
 
1117
- def rb_scan_args method_body
1111
+ def rb_scan_args(method_body)
1118
1112
  method_body =~ /rb_scan_args\((.*?)\)/m
1119
1113
  return '(*args)' unless $1
1120
1114
 
@@ -1222,4 +1216,12 @@ class RDoc::Parser::C < RDoc::Parser
1222
1216
  @top_level
1223
1217
  end
1224
1218
 
1219
+ ##
1220
+ # Creates a RDoc::Comment instance.
1221
+
1222
+ def new_comment(text = nil, location = nil, language = nil)
1223
+ RDoc::Comment.new(text, location, language).tap do |comment|
1224
+ comment.format = @markup
1225
+ end
1226
+ end
1225
1227
  end