rdoc-markdown 0.22.0 → 0.23.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/lib/rdoc/generator/markdown/signatures.rb +47 -21
- data/lib/rdoc/markdown/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c3c8efb1f673d2b95ce85319abcf5e35b8cd46d3fa31260dbf2c4082d952556e
|
|
4
|
+
data.tar.gz: da6d4d6a45e85c905c087065ab6ddd235097c75962fd2ee701d576e4f9d44070
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1914a8ec4a9a6bdc749f997eb6ac39bd418333aeabe12102f6933c95a3909961ec3a1aa8e54c7fbb0315cb4d7f76ec2eb70f5bef452dc547f0dc6ba2fd4b725c
|
|
7
|
+
data.tar.gz: 8db50c4acd4fce77dd8c3b52516fe2db549acbdb18481bb8caa3c2ee94091caed11236d99898aaa7f19b9c4813a6a48a1839bd86abc6a370a767f4c96fb76d0b
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.23.0
|
|
4
|
+
|
|
5
|
+
- Show optional argument defaults in method headings.
|
|
6
|
+
- Preserve Ruby expressions in optional argument defaults.
|
|
7
|
+
|
|
3
8
|
## 0.22.0
|
|
4
9
|
|
|
5
10
|
- BREAKING: Use Ruby notation in search-index names: `Duck.MAX_VELOCITY` becomes `Duck::MAX_VELOCITY`, and instance attributes use `Class#attr` instead of `Class.attr`. Consumers matching index names must update these lookups. Class-level attributes retain `Class.attr`; document paths and anchors are unchanged.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "prism"
|
|
4
|
+
|
|
3
5
|
# Normalizes RDoc and RBS method signatures for headings.
|
|
4
6
|
module RDoc::Generator::Markdown::Signatures
|
|
5
7
|
# Signature opening delimiters and their matching closers.
|
|
@@ -15,18 +17,17 @@ module RDoc::Generator::Markdown::Signatures
|
|
|
15
17
|
# @return [String] Complete signature including the method name or documented receiver.
|
|
16
18
|
def self.render_method_signature(method, store)
|
|
17
19
|
name = method.name
|
|
18
|
-
|
|
19
|
-
if !
|
|
20
|
+
type_signatures = method.type_signature_lines || store.rbs_signature_for(method)
|
|
21
|
+
if !type_signatures && ["[]", "[]="].include?(name) && (call_seq = method.call_seq)
|
|
20
22
|
return call_seq.lines.map { |line| normalize_signature(line) }.join(" | ")
|
|
21
23
|
end
|
|
22
|
-
|
|
24
|
+
params = method.params
|
|
23
25
|
|
|
24
|
-
signatures =
|
|
26
|
+
signatures = (type_signatures || [method.param_seq]).filter_map do |signature|
|
|
25
27
|
next unless signature&.match?(/\S/)
|
|
26
28
|
|
|
27
|
-
signature =
|
|
28
|
-
|
|
29
|
-
merge_method_signature_arguments(signature, method.params)
|
|
29
|
+
signature = merge_method_signature_arguments(signature, params)
|
|
30
|
+
type_signatures ? signature : restore_method_parameter_defaults(signature, params)
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
"#{name}#{signatures.empty? ? "()" : signatures.join(" | ")}"
|
|
@@ -41,13 +42,43 @@ module RDoc::Generator::Markdown::Signatures
|
|
|
41
42
|
signature.gsub("->", " -> ").gsub(/\s+/, " ").strip
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
#
|
|
45
|
+
# Restores source defaults for bare argument names in an untyped call sequence.
|
|
46
|
+
#
|
|
47
|
+
# @param signature [String] Normalized call sequence without the method name.
|
|
48
|
+
# @param raw_params [String, nil] Method parameter list from RDoc.
|
|
49
|
+
# @return [String] Signature with matching source default expressions preserved.
|
|
50
|
+
def self.restore_method_parameter_defaults(signature, raw_params)
|
|
51
|
+
signature_args, signature_suffix = split_signature_arguments_and_suffix(signature)
|
|
52
|
+
source_params = ruby_parameters(raw_params)
|
|
53
|
+
documented_params = ruby_parameters(signature_args)
|
|
54
|
+
return signature unless source_params && documented_params
|
|
55
|
+
|
|
56
|
+
defaults = source_params.optionals.to_h { |param| [param.name.to_s, param.slice] }
|
|
57
|
+
signature_parts = documented_params.compact_child_nodes.map(&:slice)
|
|
58
|
+
default_parts = signature_parts.map { |part| defaults.fetch(part, part) }
|
|
59
|
+
return signature if default_parts == signature_parts
|
|
60
|
+
|
|
61
|
+
"(#{default_parts.join(", ")})#{signature_suffix}"
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Parses Ruby parameter boundaries without evaluating or rewriting default expressions.
|
|
65
|
+
#
|
|
66
|
+
# @param params [String, nil] Parenthesized or bare Ruby parameters.
|
|
67
|
+
# @return [Prism::ParametersNode, nil] Parameters, or nil for empty or invalid syntax.
|
|
68
|
+
def self.ruby_parameters(params)
|
|
69
|
+
result = Prism.parse("def _ #{params.to_s.lstrip}\nend")
|
|
70
|
+
result.value.statements.body.first.parameters if result.success?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Normalizes a signature and merges RDoc parameter names into type-only arguments.
|
|
45
74
|
#
|
|
46
75
|
# @param signature [String] Method signature from RDoc call sequence.
|
|
47
76
|
# @param raw_params [String, nil] Method parameter list from RDoc.
|
|
48
77
|
#
|
|
49
78
|
# @return [String] Signature with names added when safe.
|
|
50
79
|
def self.merge_method_signature_arguments(signature, raw_params)
|
|
80
|
+
signature = normalize_signature(signature)
|
|
81
|
+
signature = " #{signature}" if signature.start_with?("->")
|
|
51
82
|
params = raw_params.to_s.strip
|
|
52
83
|
params = params[1...-1] if params.start_with?("(") && params.end_with?(")")
|
|
53
84
|
|
|
@@ -106,25 +137,20 @@ module RDoc::Generator::Markdown::Signatures
|
|
|
106
137
|
# @return [Array<String>] Signature parts.
|
|
107
138
|
def self.split_signature_list(list)
|
|
108
139
|
parts = []
|
|
109
|
-
|
|
140
|
+
start = 0
|
|
110
141
|
delimiters = []
|
|
111
142
|
|
|
112
|
-
list.each_char do |char|
|
|
143
|
+
list.each_char.with_index do |char, index|
|
|
113
144
|
if char == "," && delimiters.empty?
|
|
114
|
-
parts <<
|
|
115
|
-
|
|
116
|
-
else
|
|
117
|
-
closing = DELIMITER_PAIRS[char]
|
|
118
|
-
if closing
|
|
119
|
-
delimiters << closing
|
|
120
|
-
elsif char == delimiters.last
|
|
121
|
-
delimiters.pop
|
|
122
|
-
end
|
|
123
|
-
current << char
|
|
145
|
+
parts << list[start...index].strip
|
|
146
|
+
start = index + 1
|
|
124
147
|
end
|
|
148
|
+
closing = DELIMITER_PAIRS[char]
|
|
149
|
+
delimiters << closing if closing
|
|
150
|
+
delimiters.pop if char == delimiters.last
|
|
125
151
|
end
|
|
126
152
|
|
|
127
|
-
parts <<
|
|
153
|
+
parts << list[start..].strip if start < list.length
|
|
128
154
|
parts
|
|
129
155
|
end
|
|
130
156
|
end
|