rdoc 7.2.0 → 8.1.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 (150) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +4 -7
  3. data/LICENSE.rdoc +4 -0
  4. data/README.md +43 -2
  5. data/RI.md +75 -75
  6. data/doc/markup_reference/markdown.md +104 -3
  7. data/exe/rdoc +2 -2
  8. data/lib/rdoc/code_object/alias.rb +70 -74
  9. data/lib/rdoc/code_object/any_method.rb +305 -298
  10. data/lib/rdoc/code_object/attr.rb +150 -143
  11. data/lib/rdoc/code_object/class_module.rb +801 -765
  12. data/lib/rdoc/code_object/constant.rb +178 -150
  13. data/lib/rdoc/code_object/context/section.rb +133 -160
  14. data/lib/rdoc/code_object/context.rb +925 -952
  15. data/lib/rdoc/code_object/extend.rb +7 -5
  16. data/lib/rdoc/code_object/include.rb +7 -5
  17. data/lib/rdoc/code_object/method_attr.rb +325 -324
  18. data/lib/rdoc/code_object/mixin.rb +97 -95
  19. data/lib/rdoc/code_object/normal_class.rb +77 -78
  20. data/lib/rdoc/code_object/normal_module.rb +61 -59
  21. data/lib/rdoc/code_object/require.rb +23 -39
  22. data/lib/rdoc/code_object/single_class.rb +21 -19
  23. data/lib/rdoc/code_object/top_level.rb +212 -213
  24. data/lib/rdoc/code_object.rb +305 -305
  25. data/lib/rdoc/comment.rb +274 -337
  26. data/lib/rdoc/cross_reference.rb +194 -212
  27. data/lib/rdoc/encoding.rb +105 -103
  28. data/lib/rdoc/erb_partial.rb +13 -11
  29. data/lib/rdoc/erbio.rb +29 -27
  30. data/lib/rdoc/generator/aliki.rb +165 -140
  31. data/lib/rdoc/generator/darkfish.rb +647 -631
  32. data/lib/rdoc/generator/json_index.rb +233 -229
  33. data/lib/rdoc/generator/markup.rb +165 -122
  34. data/lib/rdoc/generator/pot/message_extractor.rb +57 -51
  35. data/lib/rdoc/generator/pot/po.rb +52 -51
  36. data/lib/rdoc/generator/pot/po_entry.rb +138 -132
  37. data/lib/rdoc/generator/pot.rb +85 -81
  38. data/lib/rdoc/generator/ri.rb +23 -19
  39. data/lib/rdoc/generator/template/aliki/DESIGN.md +538 -0
  40. data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +1 -1
  41. data/lib/rdoc/generator/template/aliki/_footer.rhtml +1 -1
  42. data/lib/rdoc/generator/template/aliki/_head.rhtml +11 -11
  43. data/lib/rdoc/generator/template/aliki/_header.rhtml +29 -44
  44. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +8 -6
  45. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +8 -6
  46. data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +1 -1
  47. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +2 -2
  48. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +4 -4
  49. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +1 -1
  50. data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +1 -1
  51. data/lib/rdoc/generator/template/aliki/class.rhtml +56 -46
  52. data/lib/rdoc/generator/template/aliki/css/rdoc.css +538 -283
  53. data/lib/rdoc/generator/template/aliki/index.rhtml +1 -1
  54. data/lib/rdoc/generator/template/aliki/js/aliki.js +80 -102
  55. data/lib/rdoc/generator/template/aliki/page.rhtml +1 -1
  56. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
  57. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +2 -2
  58. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +1 -1
  59. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -6
  60. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -6
  61. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +1 -1
  62. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +1 -1
  63. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +1 -1
  64. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +5 -5
  65. data/lib/rdoc/generator/template/darkfish/class.rhtml +18 -21
  66. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +0 -1
  67. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +3 -3
  68. data/lib/rdoc/generator.rb +48 -46
  69. data/lib/rdoc/i18n/locale.rb +99 -95
  70. data/lib/rdoc/i18n/text.rb +109 -105
  71. data/lib/rdoc/i18n.rb +7 -5
  72. data/lib/rdoc/markdown/byte_runtime.rb +80 -0
  73. data/lib/rdoc/markdown.kpeg +30 -21
  74. data/lib/rdoc/markdown.rb +329 -151
  75. data/lib/rdoc/markup/block_quote.rb +12 -8
  76. data/lib/rdoc/markup/document.rb +127 -123
  77. data/lib/rdoc/markup/formatter.rb +215 -221
  78. data/lib/rdoc/markup/heading.rb +1 -4
  79. data/lib/rdoc/markup/include.rb +33 -29
  80. data/lib/rdoc/markup/indented_paragraph.rb +37 -33
  81. data/lib/rdoc/markup/inline_parser.rb +281 -277
  82. data/lib/rdoc/markup/list.rb +80 -88
  83. data/lib/rdoc/markup/list_item.rb +73 -85
  84. data/lib/rdoc/markup/paragraph.rb +23 -19
  85. data/lib/rdoc/markup/parser.rb +501 -497
  86. data/lib/rdoc/markup/pre_process.rb +284 -305
  87. data/lib/rdoc/markup/raw.rb +2 -2
  88. data/lib/rdoc/markup/rule.rb +16 -12
  89. data/lib/rdoc/markup/to_ansi.rb +143 -139
  90. data/lib/rdoc/markup/to_bs.rb +72 -68
  91. data/lib/rdoc/markup/to_html.rb +600 -493
  92. data/lib/rdoc/markup/to_html_crossref.rb +221 -191
  93. data/lib/rdoc/markup/to_html_snippet.rb +232 -227
  94. data/lib/rdoc/markup/to_joined_paragraph.rb +40 -41
  95. data/lib/rdoc/markup/to_label.rb +63 -59
  96. data/lib/rdoc/markup/to_markdown.rb +212 -208
  97. data/lib/rdoc/markup/to_rdoc.rb +336 -332
  98. data/lib/rdoc/markup/to_table_of_contents.rb +66 -62
  99. data/lib/rdoc/markup/to_test.rb +60 -56
  100. data/lib/rdoc/markup/to_tt_only.rb +83 -86
  101. data/lib/rdoc/markup/verbatim.rb +62 -58
  102. data/lib/rdoc/markup.rb +198 -196
  103. data/lib/rdoc/options.rb +1063 -1076
  104. data/lib/rdoc/parser/c.rb +1039 -1036
  105. data/lib/rdoc/parser/changelog.rb +319 -315
  106. data/lib/rdoc/parser/markdown.rb +17 -13
  107. data/lib/rdoc/parser/rbs.rb +279 -0
  108. data/lib/rdoc/parser/rd.rb +17 -13
  109. data/lib/rdoc/parser/ruby.rb +1231 -2222
  110. data/lib/rdoc/parser/ruby_colorizer.rb +303 -0
  111. data/lib/rdoc/parser/simple.rb +31 -27
  112. data/lib/rdoc/parser/text.rb +12 -8
  113. data/lib/rdoc/parser.rb +230 -221
  114. data/lib/rdoc/rbs_helper.rb +186 -0
  115. data/lib/rdoc/rd/inline.rb +57 -53
  116. data/lib/rdoc/rd.rb +90 -88
  117. data/lib/rdoc/rdoc.rb +547 -366
  118. data/lib/rdoc/ri/driver.rb +1141 -1130
  119. data/lib/rdoc/ri/formatter.rb +7 -3
  120. data/lib/rdoc/ri/paths.rb +140 -136
  121. data/lib/rdoc/ri/servlet.rb +456 -0
  122. data/lib/rdoc/ri/store.rb +4 -2
  123. data/lib/rdoc/ri/task.rb +55 -51
  124. data/lib/rdoc/ri.rb +14 -11
  125. data/lib/rdoc/rubygems_hook.rb +194 -192
  126. data/lib/rdoc/server.rb +462 -0
  127. data/lib/rdoc/stats/normal.rb +46 -42
  128. data/lib/rdoc/stats/quiet.rb +39 -35
  129. data/lib/rdoc/stats/verbose.rb +35 -31
  130. data/lib/rdoc/stats.rb +363 -338
  131. data/lib/rdoc/store.rb +919 -725
  132. data/lib/rdoc/task.rb +260 -255
  133. data/lib/rdoc/text.rb +130 -245
  134. data/lib/rdoc/token_stream.rb +101 -115
  135. data/lib/rdoc/tom_doc.rb +203 -201
  136. data/lib/rdoc/version.rb +1 -1
  137. data/lib/rdoc.rb +35 -7
  138. data/lib/rubygems_plugin.rb +2 -11
  139. data/rdoc-logo.svg +43 -0
  140. data/rdoc.gemspec +6 -4
  141. metadata +36 -20
  142. data/lib/rdoc/code_object/anon_class.rb +0 -10
  143. data/lib/rdoc/code_object/ghost_method.rb +0 -6
  144. data/lib/rdoc/code_object/meta_method.rb +0 -6
  145. data/lib/rdoc/markdown/literals.kpeg +0 -21
  146. data/lib/rdoc/markdown/literals.rb +0 -454
  147. data/lib/rdoc/parser/prism_ruby.rb +0 -1112
  148. data/lib/rdoc/parser/ripper_state_lex.rb +0 -302
  149. data/lib/rdoc/parser/ruby_tools.rb +0 -163
  150. data/lib/rdoc/servlet.rb +0 -452
@@ -1,22 +1,26 @@
1
1
  # frozen_string_literal: true
2
- ##
3
- # Parse a Markdown format file. The parsed RDoc::Markup::Document is attached
4
- # as a file comment.
2
+ module RDoc
3
+ class Parser
4
+ ##
5
+ # Parse a Markdown format file. The parsed RDoc::Markup::Document is attached
6
+ # as a file comment.
5
7
 
6
- class RDoc::Parser::Markdown < RDoc::Parser
8
+ class Markdown < Parser
7
9
 
8
- include RDoc::Parser::Text
10
+ include Parser::Text
9
11
 
10
- parse_files_matching(/\.(md|markdown)(?:\.[^.]+)?$/)
12
+ parse_files_matching(/\.(md|markdown)(?:\.[^.]+)?$/)
11
13
 
12
- ##
13
- # Creates an Markdown-format TopLevel for the given file.
14
+ ##
15
+ # Creates an Markdown-format TopLevel for the given file.
14
16
 
15
- def scan
16
- comment = RDoc::Comment.new @content, @top_level
17
- comment.format = 'markdown'
17
+ def scan
18
+ comment = Comment.new @content, @top_level
19
+ comment.format = 'markdown'
18
20
 
19
- @top_level.comment = comment
20
- end
21
+ @top_level.comment = comment
22
+ end
21
23
 
24
+ end
25
+ end
22
26
  end
@@ -0,0 +1,279 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rbs'
4
+
5
+ module RDoc
6
+ class Parser
7
+ ##
8
+ # Parse RBS signature files as first-class RDoc input.
9
+
10
+ class RBS < Parser
11
+ RBS_FILE_EXTENSION = /\.rbs$/
12
+
13
+ parse_files_matching RBS_FILE_EXTENSION
14
+
15
+ def scan
16
+ _, _, decls = ::RBS::Parser.parse_signature(@content)
17
+ decls.each do |decl|
18
+ parse_decl decl, @top_level
19
+ end
20
+ @top_level
21
+ end
22
+
23
+ private
24
+
25
+ def record_object_location(object, location)
26
+ object.line = location.start_line if location
27
+
28
+ if ClassModule === object
29
+ @top_level.add_to_classes_or_modules object unless
30
+ @top_level.classes_or_modules.include? object
31
+ end
32
+
33
+ object.record_location @top_level
34
+ object
35
+ end
36
+
37
+ def rdoc_comment_for(decl)
38
+ rbs_comment = decl.comment if decl.respond_to?(:comment)
39
+ return unless rbs_comment
40
+
41
+ # TODO: Run RBS comments through RDoc's directive preprocessor so
42
+ # directives like :nodoc: affect the documented object.
43
+ comment = Comment.new rbs_comment.string, @top_level
44
+ comment.format = 'markdown'
45
+ comment
46
+ end
47
+
48
+ def local_module_name(type_name, context)
49
+ name = type_name.to_s
50
+ return name if name.start_with?('::')
51
+
52
+ namespace_names = context == @top_level ? [] : context.full_name.split('::')
53
+
54
+ namespace_names.length.downto(1) do |length|
55
+ qualified_name = namespace_names.take(length).join('::')
56
+ if module_name = @top_level.find_module_named("#{qualified_name}::#{name}")
57
+ return module_name.full_name
58
+ end
59
+ end
60
+
61
+ name
62
+ end
63
+
64
+ def merge_documentation(object, comment, type_signature_lines)
65
+ if comment
66
+ object.comment = if object.comment.empty?
67
+ comment
68
+ else
69
+ merge_comments object, comment
70
+ end
71
+ end
72
+
73
+ # TODO: Track RBS-owned documentation overlays so incremental reparsing can
74
+ # replace stale comments and signatures from the previous RBS parse.
75
+ object.type_signature_lines ||= type_signature_lines
76
+ end
77
+
78
+ def merge_comments(object, comment)
79
+ document = Markup::Document.new
80
+ document.concat object.parse(object.comment).parts
81
+ document << Markup::Rule.new(1)
82
+ document.concat comment.parse.parts
83
+
84
+ # Keep this text separator in sync with the Rule node above.
85
+ merged_comment = Comment.new "#{object.comment}\n---\n#{comment}", comment.location
86
+ merged_comment.format = 'markdown'
87
+ merged_comment.document = document
88
+ merged_comment
89
+ end
90
+
91
+ def attr_rw_matches?(existing_rw, new_rw)
92
+ existing_rw.each_char.any? { |rw| new_rw.include? rw }
93
+ end
94
+
95
+ def merge_attribute_methods(context, name, rw, singleton, comment, type_signature_lines)
96
+ method_names = []
97
+ method_names << name if rw.include?('R')
98
+ method_names << "#{name}=" if rw.include?('W')
99
+
100
+ methods = method_names.map { |method_name| context.find_method(method_name, singleton) }
101
+ methods.compact.each do |method|
102
+ merge_documentation method, comment, type_signature_lines
103
+ end
104
+
105
+ methods.any?
106
+ end
107
+
108
+ def rdoc_method_name(decl)
109
+ rbs_constructor_decl?(decl) ? 'new' : decl.name.to_s
110
+ end
111
+
112
+ def rdoc_method_singleton?(decl)
113
+ # TODO: RBS `self?` methods are :singleton_instance and should add both a
114
+ # singleton method and a private instance method.
115
+ rbs_constructor_decl?(decl) || decl.singleton?
116
+ end
117
+
118
+ def rdoc_method_visibility(decl)
119
+ rbs_constructor_decl?(decl) ? :public : decl.visibility
120
+ end
121
+
122
+ def rbs_constructor_decl?(decl)
123
+ decl.kind == :instance && decl.name == :initialize
124
+ end
125
+
126
+ def parse_attr_decl(decl, context)
127
+ rw = case decl
128
+ when ::RBS::AST::Members::AttrReader
129
+ 'R'
130
+ when ::RBS::AST::Members::AttrWriter
131
+ 'W'
132
+ when ::RBS::AST::Members::AttrAccessor
133
+ 'RW'
134
+ end
135
+
136
+ comment = rdoc_comment_for decl
137
+ type_signature_lines = [decl.type.to_s]
138
+ name = decl.name.to_s
139
+ singleton = decl.kind == :singleton
140
+ if attribute = context.find_attribute(name, singleton)
141
+ merge_documentation attribute, comment, type_signature_lines if
142
+ attr_rw_matches? attribute.rw, rw
143
+ return
144
+ end
145
+
146
+ if merge_attribute_methods(context, name, rw, singleton, comment, type_signature_lines)
147
+ return
148
+ end
149
+
150
+ attribute = Attr.new(
151
+ name,
152
+ rw,
153
+ comment,
154
+ singleton: singleton
155
+ )
156
+ record_object_location attribute, decl.location
157
+ attribute.type_signature_lines = type_signature_lines
158
+ attribute.visibility = decl.visibility if decl.visibility
159
+ context.add_attribute attribute
160
+ end
161
+
162
+ def parse_class_decl(decl, context)
163
+ owner, name = context.find_or_create_constant_owner_for_path decl.name
164
+ superclass = decl.super_class&.name&.to_s || '::Object'
165
+ klass = owner.add_class NormalClass, name, superclass
166
+ record_object_location klass, decl.location
167
+ comment = rdoc_comment_for decl
168
+ klass.add_comment comment, @top_level if comment
169
+
170
+ decl.members.each { |member| parse_decl member, klass }
171
+ end
172
+
173
+ def parse_constant_decl(decl, context)
174
+ constant = Constant.new decl.name.to_s, decl.type.to_s,
175
+ rdoc_comment_for(decl)
176
+ record_object_location constant, decl.location
177
+ context.add_constant constant
178
+ end
179
+
180
+ def parse_decl(decl, context)
181
+ case decl
182
+ when ::RBS::AST::Declarations::Class
183
+ parse_class_decl decl, context
184
+ when ::RBS::AST::Declarations::Module, ::RBS::AST::Declarations::Interface
185
+ parse_module_decl decl, context
186
+ when ::RBS::AST::Declarations::ClassAlias,
187
+ ::RBS::AST::Declarations::ModuleAlias
188
+ # TODO: Add RBS class and module aliases to the RDoc store.
189
+ nil
190
+ else
191
+ parse_member_decl decl, context
192
+ end
193
+ end
194
+
195
+ def parse_extend_decl(decl, context)
196
+ extend_decl = Extend.new local_module_name(decl.name, context),
197
+ rdoc_comment_for(decl)
198
+ record_object_location extend_decl, decl.location
199
+ context.add_extend extend_decl
200
+ end
201
+
202
+ def parse_include_decl(decl, context)
203
+ include_decl = Include.new local_module_name(decl.name, context),
204
+ rdoc_comment_for(decl)
205
+ record_object_location include_decl, decl.location
206
+ context.add_include include_decl
207
+ end
208
+
209
+ def parse_member_decl(decl, context)
210
+ case decl
211
+ when ::RBS::AST::Declarations::Constant
212
+ parse_constant_decl decl, context
213
+ when ::RBS::AST::Members::MethodDefinition
214
+ parse_method_decl decl, context
215
+ when ::RBS::AST::Members::Alias
216
+ parse_method_alias_decl decl, context
217
+ when ::RBS::AST::Members::AttrReader,
218
+ ::RBS::AST::Members::AttrWriter,
219
+ ::RBS::AST::Members::AttrAccessor
220
+ parse_attr_decl decl, context
221
+ when ::RBS::AST::Members::Include
222
+ parse_include_decl decl, context
223
+ when ::RBS::AST::Members::Extend
224
+ parse_extend_decl decl, context
225
+ when ::RBS::AST::Members::Private,
226
+ ::RBS::AST::Members::Public
227
+ # TODO: Track standalone RBS visibility members.
228
+ nil
229
+ end
230
+ end
231
+
232
+ def parse_method_alias_decl(decl, context)
233
+ alias_def = Alias.new(
234
+ decl.old_name.to_s,
235
+ decl.new_name.to_s,
236
+ rdoc_comment_for(decl),
237
+ singleton: decl.kind == :singleton
238
+ )
239
+ record_object_location alias_def, decl.location
240
+ context.add_alias alias_def
241
+ end
242
+
243
+ def parse_method_decl(decl, context)
244
+ comment = rdoc_comment_for decl
245
+ type_signature_lines = decl.overloads.map { |overload| overload.method_type.to_s }
246
+ method_name = rdoc_method_name(decl)
247
+ singleton = rdoc_method_singleton?(decl)
248
+ visibility = rdoc_method_visibility(decl)
249
+
250
+ if method = context.find_method(method_name, singleton)
251
+ merge_documentation method, comment, type_signature_lines
252
+ return
253
+ end
254
+
255
+ method = AnyMethod.new method_name, singleton: singleton
256
+ record_object_location method, decl.location
257
+ method.type_signature_lines = type_signature_lines
258
+
259
+ if loc = decl.location
260
+ method.start_collecting_tokens :ruby
261
+ method.add_token line_no: loc.start_line, char_no: 1, text: loc.source
262
+ end
263
+
264
+ method.comment = comment if comment
265
+ method.visibility = visibility if visibility
266
+ context.add_method method
267
+ end
268
+
269
+ def parse_module_decl(decl, context)
270
+ mod = context.add_module NormalModule, decl.name.to_s
271
+ record_object_location mod, decl.location
272
+ comment = rdoc_comment_for decl
273
+ mod.add_comment comment, @top_level if comment
274
+
275
+ decl.members.each { |member| parse_decl member, mod }
276
+ end
277
+ end
278
+ end
279
+ end
@@ -1,22 +1,26 @@
1
1
  # frozen_string_literal: true
2
- ##
3
- # Parse a RD format file. The parsed RDoc::Markup::Document is attached as a
4
- # file comment.
2
+ module RDoc
3
+ class Parser
4
+ ##
5
+ # Parse a RD format file. The parsed RDoc::Markup::Document is attached as a
6
+ # file comment.
5
7
 
6
- class RDoc::Parser::RD < RDoc::Parser
8
+ class RD < Parser
7
9
 
8
- include RDoc::Parser::Text
10
+ include Parser::Text
9
11
 
10
- parse_files_matching(/\.rd(?:\.[^.]+)?$/)
12
+ parse_files_matching(/\.rd(?:\.[^.]+)?$/)
11
13
 
12
- ##
13
- # Creates an rd-format TopLevel for the given file.
14
+ ##
15
+ # Creates an rd-format TopLevel for the given file.
14
16
 
15
- def scan
16
- comment = RDoc::Comment.new @content, @top_level
17
- comment.format = 'rd'
17
+ def scan
18
+ comment = Comment.new @content, @top_level
19
+ comment.format = 'rd'
18
20
 
19
- @top_level.comment = comment
20
- end
21
+ @top_level.comment = comment
22
+ end
21
23
 
24
+ end
25
+ end
22
26
  end