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
@@ -23,7 +23,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
23
23
  # Continued function listings are joined together as a single entry.
24
24
  # Continued descriptions are joined to make a single paragraph.
25
25
 
26
- def continue_entry_body entry_body, continuation
26
+ def continue_entry_body(entry_body, continuation)
27
27
  return unless last = entry_body.last
28
28
 
29
29
  if last =~ /\)\s*\z/ and continuation =~ /\A\(/ then
@@ -41,7 +41,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
41
41
  ##
42
42
  # Creates an RDoc::Markup::Document given the +groups+ of ChangeLog entries.
43
43
 
44
- def create_document groups
44
+ def create_document(groups)
45
45
  doc = RDoc::Markup::Document.new
46
46
  doc.omit_headings_below = 2
47
47
  doc.file = @top_level
@@ -63,7 +63,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
63
63
  # Returns a list of ChangeLog entries an RDoc::Markup nodes for the given
64
64
  # +entries+.
65
65
 
66
- def create_entries entries
66
+ def create_entries(entries)
67
67
  out = []
68
68
 
69
69
  entries.each do |entry, items|
@@ -80,7 +80,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
80
80
  # Returns an RDoc::Markup::List containing the given +items+ in the
81
81
  # ChangeLog
82
82
 
83
- def create_items items
83
+ def create_items(items)
84
84
  list = RDoc::Markup::List.new :NOTE
85
85
 
86
86
  items.each do |item|
@@ -100,7 +100,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
100
100
  ##
101
101
  # Groups +entries+ by date.
102
102
 
103
- def group_entries entries
103
+ def group_entries(entries)
104
104
  @time_cache ||= {}
105
105
  entries.group_by do |title, _|
106
106
  begin
@@ -193,7 +193,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
193
193
 
194
194
  entries << [entry_name, entry_body] if entry_name
195
195
 
196
- entries.reject! do |(entry,_)|
196
+ entries.reject! do |(entry, _)|
197
197
  entry == nil
198
198
  end
199
199
 
@@ -210,18 +210,29 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
210
210
  grouped_entries = group_entries entries
211
211
 
212
212
  doc = create_document grouped_entries
213
-
214
- @top_level.comment = doc
213
+ comment = RDoc::Comment.new(@content)
214
+ comment.document = doc
215
+ @top_level.comment = comment
215
216
 
216
217
  @top_level
217
218
  end
218
219
 
220
+ ##
221
+ # The extension for Git commit log
222
+
219
223
  module Git
224
+ ##
225
+ # Parses auxiliary info. Currently `base-url` to expand
226
+ # references is effective.
227
+
220
228
  def parse_info(info)
221
229
  /^\s*base-url\s*=\s*(.*\S)/ =~ info
222
230
  @base_url = $1
223
231
  end
224
232
 
233
+ ##
234
+ # Parses the entries in the Git commit logs
235
+
225
236
  def parse_entries
226
237
  entries = []
227
238
 
@@ -244,7 +255,12 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
244
255
  entries
245
256
  end
246
257
 
247
- def create_entries entries
258
+ ##
259
+ # Returns a list of ChangeLog entries as
260
+ # RDoc::Parser::ChangeLog::Git::LogEntry list for the given
261
+ # +entries+.
262
+
263
+ def create_entries(entries)
248
264
  # git log entries have no strictly itemized style like the old
249
265
  # style, just assume Markdown.
250
266
  entries.map do |commit, entry|
@@ -258,6 +274,27 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
258
274
  def initialize(base, commit, author, email, date, contents)
259
275
  case contents
260
276
  when String
277
+ if base&.match(%r[\A([^:/]+:/+[^/]+/)[^/]+/[^/]+/])
278
+ repo, host = $&, $1
279
+ contents = contents.dup
280
+ # base: https://github.com/ruby/ruby/
281
+ # Fix #15791 -> Fix [#15791](https://github.com/ruby/ruby/pull/15791)
282
+ # GH-15791 -> [GH-15791](https://github.com/ruby/ruby/pull/15791)
283
+ # (#15791) -> ([#15791](https://github.com/ruby/ruby/pull/15791))
284
+ contents.gsub!(/\b(?:(?i:fix(?:e[sd])?) +)\K\#(\d+\b)|\bGH-(\d+)\b|\(\K\#(\d+)(?=\))/) do
285
+ "[#{$&}](#{repo}pull/#{$1 || $2 || $3})"
286
+ end
287
+ # repo#PR, repo@HASH
288
+ # ruby/ruby#15791 -> [ruby/ruby#15791](https://github.com/ruby/ruby/pull/15791)
289
+ # ruby/ruby@a8a989b6 -> [ruby/ruby@a8a989b6](https://github.com/ruby/ruby/commit/a8a989b6)
290
+ # ref in branckets is not extended
291
+ # [ruby/net-imap#543][ruby/ruby#15791] -> [ruby/net-imap#543][ruby/ruby#15791]
292
+ contents.gsub!(%r[(?<![-\w#/@]|\]\[)([-\w]+/[-\w]+)(?:@(\h{8,40})|\#(\d+))(?![-\w#/@]|\]\[)]) do
293
+ path = defined?($2) ? "commit/#{$2}" : "pull/#{$3}"
294
+ "[#{$&}](#{host}#{$1}/#{path})"
295
+ end
296
+ end
297
+
261
298
  contents = RDoc::Markdown.parse(contents).parts.each do |body|
262
299
  case body
263
300
  when RDoc::Markup::Heading
@@ -277,13 +314,21 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
277
314
  end
278
315
 
279
316
  def aref
317
+ commit
318
+ end
319
+
320
+ def legacy_aref
280
321
  "label-#{commit}"
281
322
  end
282
323
 
283
- def label context = nil
324
+ def label(context = nil)
284
325
  aref
285
326
  end
286
327
 
328
+ def legacy_label(context = nil)
329
+ legacy_aref
330
+ end
331
+
287
332
  def text
288
333
  case base
289
334
  when nil
@@ -295,7 +340,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
295
340
  end + " {#{author}}[mailto:#{email}]"
296
341
  end
297
342
 
298
- def accept visitor
343
+ def accept(visitor)
299
344
  visitor.accept_heading self
300
345
  begin
301
346
  if visitor.respond_to?(:code_object=)
@@ -312,7 +357,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
312
357
  end
313
358
  end
314
359
 
315
- def pretty_print q # :nodoc:
360
+ def pretty_print(q) # :nodoc:
316
361
  q.group(2, '[log_entry: ', ']') do
317
362
  q.text commit
318
363
  q.text ','
@@ -332,4 +377,3 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
332
377
  end
333
378
  end
334
379
  end
335
-
@@ -20,5 +20,3 @@ class RDoc::Parser::Markdown < RDoc::Parser
20
20
  end
21
21
 
22
22
  end
23
-
24
-
@@ -0,0 +1,275 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rbs'
4
+
5
+ ##
6
+ # Parse RBS signature files as first-class RDoc input.
7
+
8
+ class RDoc::Parser::RBS < RDoc::Parser
9
+ RBS_FILE_EXTENSION = /\.rbs$/
10
+
11
+ parse_files_matching RBS_FILE_EXTENSION
12
+
13
+ def scan
14
+ _, _, decls = ::RBS::Parser.parse_signature(@content)
15
+ decls.each do |decl|
16
+ parse_decl decl, @top_level
17
+ end
18
+ @top_level
19
+ end
20
+
21
+ private
22
+
23
+ def record_object_location(object, location)
24
+ object.line = location.start_line if location
25
+
26
+ if RDoc::ClassModule === object
27
+ @top_level.add_to_classes_or_modules object unless
28
+ @top_level.classes_or_modules.include? object
29
+ end
30
+
31
+ object.record_location @top_level
32
+ object
33
+ end
34
+
35
+ def rdoc_comment_for(decl)
36
+ rbs_comment = decl.comment if decl.respond_to?(:comment)
37
+ return unless rbs_comment
38
+
39
+ # TODO: Run RBS comments through RDoc's directive preprocessor so
40
+ # directives like :nodoc: affect the documented object.
41
+ comment = RDoc::Comment.new rbs_comment.string, @top_level
42
+ comment.format = 'markdown'
43
+ comment
44
+ end
45
+
46
+ def local_module_name(type_name, context)
47
+ name = type_name.to_s
48
+ return name if name.start_with?('::')
49
+
50
+ namespace_names = context == @top_level ? [] : context.full_name.split('::')
51
+
52
+ namespace_names.length.downto(1) do |length|
53
+ qualified_name = namespace_names.take(length).join('::')
54
+ if module_name = @top_level.find_module_named("#{qualified_name}::#{name}")
55
+ return module_name.full_name
56
+ end
57
+ end
58
+
59
+ name
60
+ end
61
+
62
+ def merge_documentation(object, comment, type_signature_lines)
63
+ if comment
64
+ object.comment = if object.comment.empty?
65
+ comment
66
+ else
67
+ merge_comments object, comment
68
+ end
69
+ end
70
+
71
+ # TODO: Track RBS-owned documentation overlays so incremental reparsing can
72
+ # replace stale comments and signatures from the previous RBS parse.
73
+ object.type_signature_lines ||= type_signature_lines
74
+ end
75
+
76
+ def merge_comments(object, comment)
77
+ document = RDoc::Markup::Document.new
78
+ document.concat object.parse(object.comment).parts
79
+ document << RDoc::Markup::Rule.new(1)
80
+ document.concat comment.parse.parts
81
+
82
+ # Keep this text separator in sync with the Rule node above.
83
+ merged_comment = RDoc::Comment.new "#{object.comment}\n---\n#{comment}", comment.location
84
+ merged_comment.format = 'markdown'
85
+ merged_comment.document = document
86
+ merged_comment
87
+ end
88
+
89
+ def attr_rw_matches?(existing_rw, new_rw)
90
+ existing_rw.each_char.any? { |rw| new_rw.include? rw }
91
+ end
92
+
93
+ def merge_attribute_methods(context, name, rw, singleton, comment, type_signature_lines)
94
+ method_names = []
95
+ method_names << name if rw.include?('R')
96
+ method_names << "#{name}=" if rw.include?('W')
97
+
98
+ methods = method_names.map { |method_name| context.find_method(method_name, singleton) }
99
+ methods.compact.each do |method|
100
+ merge_documentation method, comment, type_signature_lines
101
+ end
102
+
103
+ methods.any?
104
+ end
105
+
106
+ def rdoc_method_name(decl)
107
+ rbs_constructor_decl?(decl) ? 'new' : decl.name.to_s
108
+ end
109
+
110
+ def rdoc_method_singleton?(decl)
111
+ # TODO: RBS `self?` methods are :singleton_instance and should add both a
112
+ # singleton method and a private instance method.
113
+ rbs_constructor_decl?(decl) || decl.singleton?
114
+ end
115
+
116
+ def rdoc_method_visibility(decl)
117
+ rbs_constructor_decl?(decl) ? :public : decl.visibility
118
+ end
119
+
120
+ def rbs_constructor_decl?(decl)
121
+ decl.kind == :instance && decl.name == :initialize
122
+ end
123
+
124
+ def parse_attr_decl(decl, context)
125
+ rw = case decl
126
+ when ::RBS::AST::Members::AttrReader
127
+ 'R'
128
+ when ::RBS::AST::Members::AttrWriter
129
+ 'W'
130
+ when ::RBS::AST::Members::AttrAccessor
131
+ 'RW'
132
+ end
133
+
134
+ comment = rdoc_comment_for decl
135
+ type_signature_lines = [decl.type.to_s]
136
+ name = decl.name.to_s
137
+ singleton = decl.kind == :singleton
138
+ if attribute = context.find_attribute(name, singleton)
139
+ merge_documentation attribute, comment, type_signature_lines if
140
+ attr_rw_matches? attribute.rw, rw
141
+ return
142
+ end
143
+
144
+ if merge_attribute_methods(context, name, rw, singleton, comment, type_signature_lines)
145
+ return
146
+ end
147
+
148
+ attribute = RDoc::Attr.new(
149
+ name,
150
+ rw,
151
+ comment,
152
+ singleton: singleton
153
+ )
154
+ record_object_location attribute, decl.location
155
+ attribute.type_signature_lines = type_signature_lines
156
+ context.add_attribute attribute
157
+ attribute.visibility = decl.visibility if decl.visibility
158
+ end
159
+
160
+ def parse_class_decl(decl, context)
161
+ owner, name = context.find_or_create_constant_owner_for_path decl.name
162
+ superclass = decl.super_class&.name&.to_s || '::Object'
163
+ klass = owner.add_class RDoc::NormalClass, name, superclass
164
+ record_object_location klass, decl.location
165
+ comment = rdoc_comment_for decl
166
+ klass.add_comment comment, @top_level if comment
167
+
168
+ decl.members.each { |member| parse_decl member, klass }
169
+ end
170
+
171
+ def parse_constant_decl(decl, context)
172
+ constant = RDoc::Constant.new decl.name.to_s, decl.type.to_s,
173
+ rdoc_comment_for(decl)
174
+ record_object_location constant, decl.location
175
+ context.add_constant constant
176
+ end
177
+
178
+ def parse_decl(decl, context)
179
+ case decl
180
+ when ::RBS::AST::Declarations::Class
181
+ parse_class_decl decl, context
182
+ when ::RBS::AST::Declarations::Module, ::RBS::AST::Declarations::Interface
183
+ parse_module_decl decl, context
184
+ when ::RBS::AST::Declarations::ClassAlias,
185
+ ::RBS::AST::Declarations::ModuleAlias
186
+ # TODO: Add RBS class and module aliases to the RDoc store.
187
+ nil
188
+ else
189
+ parse_member_decl decl, context
190
+ end
191
+ end
192
+
193
+ def parse_extend_decl(decl, context)
194
+ extend_decl = RDoc::Extend.new local_module_name(decl.name, context),
195
+ rdoc_comment_for(decl)
196
+ record_object_location extend_decl, decl.location
197
+ context.add_extend extend_decl
198
+ end
199
+
200
+ def parse_include_decl(decl, context)
201
+ include_decl = RDoc::Include.new local_module_name(decl.name, context),
202
+ rdoc_comment_for(decl)
203
+ record_object_location include_decl, decl.location
204
+ context.add_include include_decl
205
+ end
206
+
207
+ def parse_member_decl(decl, context)
208
+ case decl
209
+ when ::RBS::AST::Declarations::Constant
210
+ parse_constant_decl decl, context
211
+ when ::RBS::AST::Members::MethodDefinition
212
+ parse_method_decl decl, context
213
+ when ::RBS::AST::Members::Alias
214
+ parse_method_alias_decl decl, context
215
+ when ::RBS::AST::Members::AttrReader,
216
+ ::RBS::AST::Members::AttrWriter,
217
+ ::RBS::AST::Members::AttrAccessor
218
+ parse_attr_decl decl, context
219
+ when ::RBS::AST::Members::Include
220
+ parse_include_decl decl, context
221
+ when ::RBS::AST::Members::Extend
222
+ parse_extend_decl decl, context
223
+ when ::RBS::AST::Members::Private,
224
+ ::RBS::AST::Members::Public
225
+ # TODO: Track standalone RBS visibility members.
226
+ nil
227
+ end
228
+ end
229
+
230
+ def parse_method_alias_decl(decl, context)
231
+ alias_def = RDoc::Alias.new(
232
+ decl.old_name.to_s,
233
+ decl.new_name.to_s,
234
+ rdoc_comment_for(decl),
235
+ singleton: decl.kind == :singleton
236
+ )
237
+ record_object_location alias_def, decl.location
238
+ context.add_alias alias_def
239
+ end
240
+
241
+ def parse_method_decl(decl, context)
242
+ comment = rdoc_comment_for decl
243
+ type_signature_lines = decl.overloads.map { |overload| overload.method_type.to_s }
244
+ method_name = rdoc_method_name(decl)
245
+ singleton = rdoc_method_singleton?(decl)
246
+ visibility = rdoc_method_visibility(decl)
247
+
248
+ if method = context.find_method(method_name, singleton)
249
+ merge_documentation method, comment, type_signature_lines
250
+ return
251
+ end
252
+
253
+ method = RDoc::AnyMethod.new method_name, singleton: singleton
254
+ record_object_location method, decl.location
255
+ method.type_signature_lines = type_signature_lines
256
+
257
+ if loc = decl.location
258
+ method.start_collecting_tokens :ruby
259
+ method.add_token line_no: loc.start_line, char_no: 1, text: loc.source
260
+ end
261
+
262
+ method.comment = comment if comment
263
+ context.add_method method
264
+ method.visibility = visibility if visibility
265
+ end
266
+
267
+ def parse_module_decl(decl, context)
268
+ mod = context.add_module RDoc::NormalModule, decl.name.to_s
269
+ record_object_location mod, decl.location
270
+ comment = rdoc_comment_for decl
271
+ mod.add_comment comment, @top_level if comment
272
+
273
+ decl.members.each { |member| parse_decl member, mod }
274
+ end
275
+ end
@@ -20,4 +20,3 @@ class RDoc::Parser::RD < RDoc::Parser
20
20
  end
21
21
 
22
22
  end
23
-