spoom 1.7.4 → 1.7.5
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/lib/spoom/cli/srb/assertions.rb +14 -1
- data/lib/spoom/cli/srb/sigs.rb +8 -2
- data/lib/spoom/coverage/d3/base.rb +1 -1
- data/lib/spoom/coverage/d3/timeline.rb +1 -1
- data/lib/spoom/coverage/report.rb +2 -2
- data/lib/spoom/sorbet/lsp/structures.rb +1 -1
- data/lib/spoom/sorbet/translate/rbs_comments_to_sorbet_sigs.rb +43 -25
- data/lib/spoom/sorbet/translate/sorbet_assertions_to_rbs_comments.rb +38 -7
- data/lib/spoom/sorbet/translate/sorbet_sigs_to_rbs_comments.rb +60 -18
- data/lib/spoom/sorbet/translate.rb +50 -6
- data/lib/spoom/source/rewriter.rb +2 -2
- data/lib/spoom/version.rb +1 -1
- data/rbi/spoom.rbi +40 -8
- 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: 8704c33b8976616ddeb6d404521a47ab654b6bb652212f35ea9b2c92fa3a9469
|
4
|
+
data.tar.gz: c85e35bac3a99847a82c8234f4303434fede477317fd99ffc79dfcd66789d14b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d83c8596f8e10ccb36256d42ed97c3b6eeb69bbb50b922e4b09d088d5a2decadee5103583fa2ab638a359c7f97cb48eec9be695886d11755b24f66ca3c10a538
|
7
|
+
data.tar.gz: 990bcdfb1851ccd8808f4dfd02739cfb96cc35f65ac8b4167849d03b4c08b95904b2cda2c6ef3ec6173df0f7348bac3d1e404c57c39cffa863d83acaf1573160
|
@@ -10,6 +10,11 @@ module Spoom
|
|
10
10
|
desc "translate", "Translate type assertions from/to RBI and RBS"
|
11
11
|
option :from, type: :string, aliases: :f, desc: "From format", enum: ["rbi"], default: "rbi"
|
12
12
|
option :to, type: :string, aliases: :t, desc: "To format", enum: ["rbs"], default: "rbs"
|
13
|
+
option :translate_t_let, type: :boolean, aliases: :t_let, desc: "Translate `T.let`", default: true
|
14
|
+
option :translate_t_cast, type: :boolean, aliases: :t_cast, desc: "Translate `T.cast`", default: true
|
15
|
+
option :translate_t_bind, type: :boolean, aliases: :t_bind, desc: "Translate `T.bind`", default: true
|
16
|
+
option :translate_t_must, type: :boolean, aliases: :t_must, desc: "Translate `T.must`", default: true
|
17
|
+
option :translate_t_unsafe, type: :boolean, aliases: :t_unsafe, desc: "Translate `T.unsafe`", default: true
|
13
18
|
def translate(*paths)
|
14
19
|
from = options[:from]
|
15
20
|
to = options[:to]
|
@@ -19,7 +24,15 @@ module Spoom
|
|
19
24
|
"in `#{files.size}` file#{files.size == 1 ? "" : "s"}...\n\n")
|
20
25
|
|
21
26
|
transformed_files = transform_files(files) do |file, contents|
|
22
|
-
Spoom::Sorbet::Translate.sorbet_assertions_to_rbs_comments(
|
27
|
+
Spoom::Sorbet::Translate.sorbet_assertions_to_rbs_comments(
|
28
|
+
contents,
|
29
|
+
file: file,
|
30
|
+
translate_t_let: options[:translate_t_let],
|
31
|
+
translate_t_cast: options[:translate_t_cast],
|
32
|
+
translate_t_bind: options[:translate_t_bind],
|
33
|
+
translate_t_must: options[:translate_t_must],
|
34
|
+
translate_t_unsafe: options[:translate_t_unsafe],
|
35
|
+
)
|
23
36
|
end
|
24
37
|
|
25
38
|
say("Translated type assertions in `#{transformed_files}` file#{transformed_files == 1 ? "" : "s"}.")
|
data/lib/spoom/cli/srb/sigs.rb
CHANGED
@@ -17,6 +17,9 @@ module Spoom
|
|
17
17
|
default: true
|
18
18
|
option :include_rbi_files, type: :boolean, desc: "Include RBI files", default: false
|
19
19
|
option :max_line_length, type: :numeric, desc: "Max line length (pass 0 to disable)", default: 120
|
20
|
+
option :translate_generics, type: :boolean, desc: "Translate generics", default: false
|
21
|
+
option :translate_helpers, type: :boolean, desc: "Translate helpers", default: false
|
22
|
+
option :translate_abstract_methods, type: :boolean, desc: "Translate abstract methods", default: false
|
20
23
|
def translate(*paths)
|
21
24
|
from = options[:from]
|
22
25
|
to = options[:to]
|
@@ -49,6 +52,9 @@ module Spoom
|
|
49
52
|
file: file,
|
50
53
|
positional_names: options[:positional_names],
|
51
54
|
max_line_length: max_line_length,
|
55
|
+
translate_generics: options[:translate_generics],
|
56
|
+
translate_helpers: options[:translate_helpers],
|
57
|
+
translate_abstract_methods: options[:translate_abstract_methods],
|
52
58
|
)
|
53
59
|
end
|
54
60
|
when "rbs"
|
@@ -156,7 +162,7 @@ module Spoom
|
|
156
162
|
|
157
163
|
# DO NOT EDIT MANUALLY
|
158
164
|
# This is an autogenerated file for types exported from the `#{spec.name}` gem.
|
159
|
-
# Please instead update this file by running `spoom srb sigs export`.
|
165
|
+
# Please instead update this file by running `bundle exec spoom srb sigs export`.
|
160
166
|
RB
|
161
167
|
|
162
168
|
output_path ||= "rbi/#{spec.name}.rbi"
|
@@ -169,7 +175,7 @@ module Spoom
|
|
169
175
|
say_error(<<~ERR, status: "\nError")
|
170
176
|
The RBI file at `#{output_path}` is not up to date
|
171
177
|
|
172
|
-
Please run `spoom srb sigs export` to update it.
|
178
|
+
Please run `bundle exec spoom srb sigs export` to update it.
|
173
179
|
ERR
|
174
180
|
exit(1)
|
175
181
|
end
|
@@ -70,7 +70,7 @@ module Spoom
|
|
70
70
|
|
71
71
|
# @abstract
|
72
72
|
#: -> Array[Cards::Card]
|
73
|
-
def cards
|
73
|
+
def cards = raise NotImplementedError, "Abstract method called"
|
74
74
|
|
75
75
|
#: -> String
|
76
76
|
def footer_html
|
@@ -106,7 +106,7 @@ module Spoom
|
|
106
106
|
|
107
107
|
# @abstract
|
108
108
|
#: -> String
|
109
|
-
def erb
|
109
|
+
def erb = raise NotImplementedError, "Abstract method called"
|
110
110
|
end
|
111
111
|
|
112
112
|
class Snapshot < Card
|
@@ -41,31 +41,7 @@ module Spoom
|
|
41
41
|
# @override
|
42
42
|
#: (Prism::DefNode node) -> void
|
43
43
|
def visit_def_node(node)
|
44
|
-
|
45
|
-
return if comments.empty?
|
46
|
-
|
47
|
-
return if comments.signatures.empty?
|
48
|
-
|
49
|
-
builder = RBI::Parser::TreeBuilder.new(@ruby_contents, comments: [], file: @file)
|
50
|
-
builder.visit(node)
|
51
|
-
rbi_node = builder.tree.nodes.first #: as RBI::Method
|
52
|
-
|
53
|
-
comments.signatures.each do |signature|
|
54
|
-
method_type = ::RBS::Parser.parse_method_type(signature.string)
|
55
|
-
translator = RBI::RBS::MethodTypeTranslator.new(rbi_node)
|
56
|
-
translator.visit(method_type)
|
57
|
-
sig = translator.result
|
58
|
-
apply_member_annotations(comments.method_annotations, sig)
|
59
|
-
|
60
|
-
@rewriter << Source::Replace.new(
|
61
|
-
signature.location.start_offset,
|
62
|
-
signature.location.end_offset,
|
63
|
-
sig.string(max_line_length: @max_line_length),
|
64
|
-
)
|
65
|
-
rescue ::RBS::ParsingError, ::RBI::Error
|
66
|
-
# Ignore signatures with errors
|
67
|
-
next
|
68
|
-
end
|
44
|
+
rewrite_def(node, node_rbs_comments(node))
|
69
45
|
end
|
70
46
|
|
71
47
|
# @override
|
@@ -75,6 +51,12 @@ module Spoom
|
|
75
51
|
when "attr_reader", "attr_writer", "attr_accessor"
|
76
52
|
visit_attr(node)
|
77
53
|
else
|
54
|
+
def_node = node.arguments&.arguments&.first
|
55
|
+
if def_node&.is_a?(Prism::DefNode)
|
56
|
+
rewrite_def(def_node, node_rbs_comments(node))
|
57
|
+
return
|
58
|
+
end
|
59
|
+
|
78
60
|
super
|
79
61
|
end
|
80
62
|
end
|
@@ -119,6 +101,42 @@ module Spoom
|
|
119
101
|
end
|
120
102
|
end
|
121
103
|
|
104
|
+
#: (Prism::DefNode, RBS::Comments) -> void
|
105
|
+
def rewrite_def(def_node, comments)
|
106
|
+
return if comments.empty?
|
107
|
+
return if comments.signatures.empty?
|
108
|
+
|
109
|
+
builder = RBI::Parser::TreeBuilder.new(@ruby_contents, comments: [], file: @file)
|
110
|
+
builder.visit(def_node)
|
111
|
+
rbi_node = builder.tree.nodes.first #: as RBI::Method
|
112
|
+
|
113
|
+
comments.signatures.each do |signature|
|
114
|
+
begin
|
115
|
+
method_type = ::RBS::Parser.parse_method_type(signature.string)
|
116
|
+
rescue ::RBS::ParsingError
|
117
|
+
next
|
118
|
+
end
|
119
|
+
|
120
|
+
translator = RBI::RBS::MethodTypeTranslator.new(rbi_node)
|
121
|
+
|
122
|
+
begin
|
123
|
+
translator.visit(method_type)
|
124
|
+
rescue ::RBI::Error
|
125
|
+
next
|
126
|
+
end
|
127
|
+
|
128
|
+
sig = translator.result
|
129
|
+
|
130
|
+
apply_member_annotations(comments.method_annotations, sig)
|
131
|
+
|
132
|
+
@rewriter << Source::Replace.new(
|
133
|
+
signature.location.start_offset,
|
134
|
+
signature.location.end_offset,
|
135
|
+
sig.string(max_line_length: @max_line_length),
|
136
|
+
)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
122
140
|
#: (Prism::ClassNode | Prism::ModuleNode | Prism::SingletonClassNode) -> void
|
123
141
|
def apply_class_annotations(node)
|
124
142
|
comments = node_rbs_comments(node)
|
@@ -8,6 +8,33 @@ module Spoom
|
|
8
8
|
class SorbetAssertionsToRBSComments < Translator
|
9
9
|
LINE_BREAK = "\n".ord #: Integer
|
10
10
|
|
11
|
+
#: (
|
12
|
+
#| String,
|
13
|
+
#| file: String,
|
14
|
+
#| ?translate_t_let: bool,
|
15
|
+
#| ?translate_t_cast: bool,
|
16
|
+
#| ?translate_t_bind: bool,
|
17
|
+
#| ?translate_t_must: bool,
|
18
|
+
#| ?translate_t_unsafe: bool,
|
19
|
+
#| ) -> void
|
20
|
+
def initialize(
|
21
|
+
ruby_contents,
|
22
|
+
file:,
|
23
|
+
translate_t_let: true,
|
24
|
+
translate_t_cast: true,
|
25
|
+
translate_t_bind: true,
|
26
|
+
translate_t_must: true,
|
27
|
+
translate_t_unsafe: true
|
28
|
+
)
|
29
|
+
super(ruby_contents, file: file)
|
30
|
+
|
31
|
+
@translate_t_let = translate_t_let
|
32
|
+
@translate_t_cast = translate_t_cast
|
33
|
+
@translate_t_bind = translate_t_bind
|
34
|
+
@translate_t_must = translate_t_must
|
35
|
+
@translate_t_unsafe = translate_t_unsafe
|
36
|
+
end
|
37
|
+
|
11
38
|
# @override
|
12
39
|
#: (Prism::StatementsNode) -> void
|
13
40
|
def visit_statements_node(node)
|
@@ -59,7 +86,7 @@ module Spoom
|
|
59
86
|
end
|
60
87
|
|
61
88
|
return false unless node.is_a?(Prism::CallNode)
|
62
|
-
return false unless
|
89
|
+
return false unless translatable_annotation?(node)
|
63
90
|
return false unless at_end_of_line?(node)
|
64
91
|
|
65
92
|
value = T.must(node.arguments&.arguments&.first)
|
@@ -116,16 +143,20 @@ module Spoom
|
|
116
143
|
|
117
144
|
# Is this node a `T.let` or `T.cast`?
|
118
145
|
#: (Prism::CallNode) -> bool
|
119
|
-
def
|
146
|
+
def translatable_annotation?(node)
|
120
147
|
return false unless t?(node.receiver)
|
121
148
|
|
122
149
|
case node.name
|
123
|
-
when :let
|
124
|
-
return node.arguments&.arguments&.size == 2
|
150
|
+
when :let
|
151
|
+
return @translate_t_let && node.arguments&.arguments&.size == 2
|
152
|
+
when :cast
|
153
|
+
return @translate_t_cast && node.arguments&.arguments&.size == 2
|
125
154
|
when :bind
|
126
|
-
return node.arguments&.arguments&.size == 2 && node.arguments&.arguments&.first.is_a?(Prism::SelfNode)
|
127
|
-
when :must
|
128
|
-
return node.arguments&.arguments&.size == 1
|
155
|
+
return @translate_t_bind && node.arguments&.arguments&.size == 2 && node.arguments&.arguments&.first.is_a?(Prism::SelfNode)
|
156
|
+
when :must
|
157
|
+
return @translate_t_must && node.arguments&.arguments&.size == 1
|
158
|
+
when :unsafe
|
159
|
+
return @translate_t_unsafe && node.arguments&.arguments&.size == 1
|
129
160
|
end
|
130
161
|
|
131
162
|
false
|
@@ -7,8 +7,24 @@ module Spoom
|
|
7
7
|
# Converts all `sig` nodes to RBS comments in the given Ruby code.
|
8
8
|
# It also handles type members and class annotations.
|
9
9
|
class SorbetSigsToRBSComments < Translator
|
10
|
-
#: (
|
11
|
-
|
10
|
+
#: (
|
11
|
+
#| String,
|
12
|
+
#| file: String,
|
13
|
+
#| positional_names: bool,
|
14
|
+
#| ?max_line_length: Integer?,
|
15
|
+
#| ?translate_generics: bool,
|
16
|
+
#| ?translate_helpers: bool,
|
17
|
+
#| ?translate_abstract_methods: bool
|
18
|
+
#| ) -> void
|
19
|
+
def initialize(
|
20
|
+
ruby_contents,
|
21
|
+
file:,
|
22
|
+
positional_names:,
|
23
|
+
max_line_length: nil,
|
24
|
+
translate_generics: true,
|
25
|
+
translate_helpers: true,
|
26
|
+
translate_abstract_methods: true
|
27
|
+
)
|
12
28
|
super(ruby_contents, file: file)
|
13
29
|
|
14
30
|
@positional_names = positional_names #: bool
|
@@ -19,6 +35,10 @@ module Spoom
|
|
19
35
|
@extend_t_generics = [] #: Array[Prism::CallNode]
|
20
36
|
@seen_mixes_in_class_methods = false #: bool
|
21
37
|
@max_line_length = max_line_length #: Integer?
|
38
|
+
|
39
|
+
@translate_generics = translate_generics #: bool
|
40
|
+
@translate_helpers = translate_helpers #: bool
|
41
|
+
@translate_abstract_methods = translate_abstract_methods #: bool
|
22
42
|
end
|
23
43
|
|
24
44
|
# @override
|
@@ -44,7 +64,6 @@ module Spoom
|
|
44
64
|
def visit_def_node(node)
|
45
65
|
last_sigs = collect_last_sigs
|
46
66
|
return if last_sigs.empty?
|
47
|
-
return if last_sigs.any? { |_, sig| sig.is_abstract }
|
48
67
|
|
49
68
|
apply_member_annotations(last_sigs)
|
50
69
|
|
@@ -54,11 +73,26 @@ module Spoom
|
|
54
73
|
rbi_node = builder.tree.nodes.first #: as RBI::Method
|
55
74
|
|
56
75
|
last_sigs.each do |node, sig|
|
76
|
+
next if sig.is_abstract && !@translate_abstract_methods
|
77
|
+
|
57
78
|
out = rbs_print(node.location.start_column) do |printer|
|
58
79
|
printer.print_method_sig(rbi_node, sig)
|
59
80
|
end
|
60
81
|
@rewriter << Source::Replace.new(node.location.start_offset, node.location.end_offset, out)
|
61
82
|
end
|
83
|
+
|
84
|
+
if @translate_abstract_methods && last_sigs.any? { |_, sig| sig.is_abstract }
|
85
|
+
@rewriter << Source::Replace.new(
|
86
|
+
node.rparen_loc&.end_offset || node.name_loc.end_offset,
|
87
|
+
node.location.end_offset - 1,
|
88
|
+
if node.name.end_with?("=")
|
89
|
+
indent = " " * node.location.start_column
|
90
|
+
"\n#{indent} raise NotImplementedError, \"Abstract method called\"\n#{indent}end"
|
91
|
+
else
|
92
|
+
" = raise NotImplementedError, \"Abstract method called\""
|
93
|
+
end,
|
94
|
+
)
|
95
|
+
end
|
62
96
|
end
|
63
97
|
|
64
98
|
# @override
|
@@ -83,6 +117,8 @@ module Spoom
|
|
83
117
|
# @override
|
84
118
|
#: (Prism::ConstantWriteNode) -> void
|
85
119
|
def visit_constant_write_node(node)
|
120
|
+
return super unless @translate_generics
|
121
|
+
|
86
122
|
call = node.value
|
87
123
|
return super unless call.is_a?(Prism::CallNode)
|
88
124
|
return super unless call.message == "type_member"
|
@@ -113,19 +149,23 @@ module Spoom
|
|
113
149
|
|
114
150
|
yield
|
115
151
|
|
116
|
-
|
152
|
+
if @translate_generics
|
153
|
+
delete_extend_t_generics
|
117
154
|
|
118
|
-
|
119
|
-
|
120
|
-
|
155
|
+
if @type_members.any?
|
156
|
+
indent = " " * node.location.start_column
|
157
|
+
@rewriter << Source::Insert.new(node.location.start_offset, "#: [#{@type_members.join(", ")}]\n#{indent}")
|
158
|
+
end
|
121
159
|
end
|
122
160
|
|
123
|
-
|
124
|
-
|
125
|
-
|
161
|
+
if @translate_helpers
|
162
|
+
unless @seen_mixes_in_class_methods
|
163
|
+
delete_extend_t_helpers
|
164
|
+
end
|
126
165
|
|
127
|
-
|
128
|
-
|
166
|
+
@class_annotations.each do |call|
|
167
|
+
apply_class_annotation(node, call)
|
168
|
+
end
|
129
169
|
end
|
130
170
|
|
131
171
|
@class_annotations = old_class_annotations
|
@@ -237,23 +277,25 @@ module Spoom
|
|
237
277
|
node, _sig = sigs.first #: as [Prism::CallNode, RBI::Sig]
|
238
278
|
insert_pos = node.location.start_offset
|
239
279
|
|
280
|
+
indent = " " * node.location.start_column
|
281
|
+
|
240
282
|
if sigs.any? { |_, sig| sig.without_runtime }
|
241
|
-
@rewriter << Source::Insert.new(insert_pos, "# @without_runtime\n")
|
283
|
+
@rewriter << Source::Insert.new(insert_pos, "# @without_runtime\n#{indent}")
|
242
284
|
end
|
243
285
|
|
244
286
|
if sigs.any? { |_, sig| sig.is_final }
|
245
|
-
@rewriter << Source::Insert.new(insert_pos, "# @final\n")
|
287
|
+
@rewriter << Source::Insert.new(insert_pos, "# @final\n#{indent}")
|
246
288
|
end
|
247
289
|
|
248
|
-
if sigs.any? { |_, sig| sig.is_abstract }
|
249
|
-
@rewriter << Source::Insert.new(insert_pos, "# @abstract\n")
|
290
|
+
if sigs.any? { |_, sig| sig.is_abstract } && @translate_abstract_methods
|
291
|
+
@rewriter << Source::Insert.new(insert_pos, "# @abstract\n#{indent}")
|
250
292
|
end
|
251
293
|
|
252
294
|
if sigs.any? { |_, sig| sig.is_override }
|
253
295
|
@rewriter << if sigs.any? { |_, sig| sig.allow_incompatible_override }
|
254
|
-
Source::Insert.new(insert_pos, "# @override(allow_incompatible: true)\n")
|
296
|
+
Source::Insert.new(insert_pos, "# @override(allow_incompatible: true)\n#{indent}")
|
255
297
|
else
|
256
|
-
Source::Insert.new(insert_pos, "# @override\n")
|
298
|
+
Source::Insert.new(insert_pos, "# @override\n#{indent}")
|
257
299
|
end
|
258
300
|
end
|
259
301
|
|
@@ -25,9 +25,30 @@ module Spoom
|
|
25
25
|
|
26
26
|
# Converts all `sig` nodes to RBS comments in the given Ruby code.
|
27
27
|
# It also handles type members and class annotations.
|
28
|
-
#: (
|
29
|
-
|
30
|
-
|
28
|
+
#: (
|
29
|
+
#| String,
|
30
|
+
#| file: String,
|
31
|
+
#| ?positional_names: bool,
|
32
|
+
#| ?max_line_length: Integer?,
|
33
|
+
#| ?translate_generics: bool,
|
34
|
+
#| ?translate_helpers: bool,
|
35
|
+
#| ?translate_abstract_methods: bool
|
36
|
+
#| ) -> String
|
37
|
+
def sorbet_sigs_to_rbs_comments(
|
38
|
+
ruby_contents, file:, positional_names: true, max_line_length: nil,
|
39
|
+
translate_generics: true,
|
40
|
+
translate_helpers: true,
|
41
|
+
translate_abstract_methods: true
|
42
|
+
)
|
43
|
+
SorbetSigsToRBSComments.new(
|
44
|
+
ruby_contents,
|
45
|
+
file: file,
|
46
|
+
positional_names: positional_names,
|
47
|
+
max_line_length: max_line_length,
|
48
|
+
translate_generics: translate_generics,
|
49
|
+
translate_helpers: translate_helpers,
|
50
|
+
translate_abstract_methods: translate_abstract_methods,
|
51
|
+
).rewrite
|
31
52
|
end
|
32
53
|
|
33
54
|
# Converts all the RBS comments in the given Ruby code to `sig` nodes.
|
@@ -39,9 +60,32 @@ module Spoom
|
|
39
60
|
|
40
61
|
# Converts all `T.let` and `T.cast` nodes to RBS comments in the given Ruby code.
|
41
62
|
# It also handles type members and class annotations.
|
42
|
-
#: (
|
43
|
-
|
44
|
-
|
63
|
+
#: (
|
64
|
+
#| String,
|
65
|
+
#| file: String,
|
66
|
+
#| ?translate_t_let: bool,
|
67
|
+
#| ?translate_t_cast: bool,
|
68
|
+
#| ?translate_t_bind: bool,
|
69
|
+
#| ?translate_t_must: bool,
|
70
|
+
#| ?translate_t_unsafe: bool
|
71
|
+
#| ) -> String
|
72
|
+
def sorbet_assertions_to_rbs_comments(
|
73
|
+
ruby_contents, file:,
|
74
|
+
translate_t_let: true,
|
75
|
+
translate_t_cast: true,
|
76
|
+
translate_t_bind: true,
|
77
|
+
translate_t_must: true,
|
78
|
+
translate_t_unsafe: true
|
79
|
+
)
|
80
|
+
SorbetAssertionsToRBSComments.new(
|
81
|
+
ruby_contents,
|
82
|
+
file: file,
|
83
|
+
translate_t_let: translate_t_let,
|
84
|
+
translate_t_cast: translate_t_cast,
|
85
|
+
translate_t_bind: translate_t_bind,
|
86
|
+
translate_t_must: translate_t_must,
|
87
|
+
translate_t_unsafe: translate_t_unsafe,
|
88
|
+
).rewrite
|
45
89
|
end
|
46
90
|
end
|
47
91
|
end
|
@@ -29,11 +29,11 @@ module Spoom
|
|
29
29
|
class Edit
|
30
30
|
# @abstract
|
31
31
|
#: (Array[Integer]) -> void
|
32
|
-
def apply(bytes)
|
32
|
+
def apply(bytes) = raise NotImplementedError, "Abstract method called"
|
33
33
|
|
34
34
|
# @abstract
|
35
35
|
#: -> [Integer, Integer]
|
36
|
-
def range
|
36
|
+
def range = raise NotImplementedError, "Abstract method called"
|
37
37
|
end
|
38
38
|
|
39
39
|
class Insert < Edit
|
data/lib/spoom/version.rb
CHANGED
data/rbi/spoom.rbi
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
# DO NOT EDIT MANUALLY
|
4
4
|
# This is an autogenerated file for types exported from the `spoom` gem.
|
5
|
-
# Please instead update this file by running `spoom srb sigs export`.
|
5
|
+
# Please instead update this file by running `bundle exec spoom srb sigs export`.
|
6
6
|
|
7
7
|
module Spoom
|
8
8
|
class << self
|
@@ -2842,18 +2842,31 @@ module Spoom::Sorbet::Translate
|
|
2842
2842
|
sig { params(ruby_contents: ::String, file: ::String, max_line_length: T.nilable(::Integer)).returns(::String) }
|
2843
2843
|
def rbs_comments_to_sorbet_sigs(ruby_contents, file:, max_line_length: T.unsafe(nil)); end
|
2844
2844
|
|
2845
|
-
sig
|
2846
|
-
|
2845
|
+
sig do
|
2846
|
+
params(
|
2847
|
+
ruby_contents: ::String,
|
2848
|
+
file: ::String,
|
2849
|
+
translate_t_let: T::Boolean,
|
2850
|
+
translate_t_cast: T::Boolean,
|
2851
|
+
translate_t_bind: T::Boolean,
|
2852
|
+
translate_t_must: T::Boolean,
|
2853
|
+
translate_t_unsafe: T::Boolean
|
2854
|
+
).returns(::String)
|
2855
|
+
end
|
2856
|
+
def sorbet_assertions_to_rbs_comments(ruby_contents, file:, translate_t_let: T.unsafe(nil), translate_t_cast: T.unsafe(nil), translate_t_bind: T.unsafe(nil), translate_t_must: T.unsafe(nil), translate_t_unsafe: T.unsafe(nil)); end
|
2847
2857
|
|
2848
2858
|
sig do
|
2849
2859
|
params(
|
2850
2860
|
ruby_contents: ::String,
|
2851
2861
|
file: ::String,
|
2852
2862
|
positional_names: T::Boolean,
|
2853
|
-
max_line_length: T.nilable(::Integer)
|
2863
|
+
max_line_length: T.nilable(::Integer),
|
2864
|
+
translate_generics: T::Boolean,
|
2865
|
+
translate_helpers: T::Boolean,
|
2866
|
+
translate_abstract_methods: T::Boolean
|
2854
2867
|
).returns(::String)
|
2855
2868
|
end
|
2856
|
-
def sorbet_sigs_to_rbs_comments(ruby_contents, file:, positional_names: T.unsafe(nil), max_line_length: T.unsafe(nil)); end
|
2869
|
+
def sorbet_sigs_to_rbs_comments(ruby_contents, file:, positional_names: T.unsafe(nil), max_line_length: T.unsafe(nil), translate_generics: T.unsafe(nil), translate_helpers: T.unsafe(nil), translate_abstract_methods: T.unsafe(nil)); end
|
2857
2870
|
|
2858
2871
|
sig { params(ruby_contents: ::String, file: ::String).returns(::String) }
|
2859
2872
|
def strip_sorbet_sigs(ruby_contents, file:); end
|
@@ -2899,11 +2912,27 @@ class Spoom::Sorbet::Translate::RBSCommentsToSorbetSigs < ::Spoom::Sorbet::Trans
|
|
2899
2912
|
sig { params(annotations: T::Array[::Spoom::RBS::Annotation], sig: ::RBI::Sig).void }
|
2900
2913
|
def apply_member_annotations(annotations, sig); end
|
2901
2914
|
|
2915
|
+
sig { params(def_node: ::Prism::DefNode, comments: ::Spoom::RBS::Comments).void }
|
2916
|
+
def rewrite_def(def_node, comments); end
|
2917
|
+
|
2902
2918
|
sig { params(node: ::Prism::CallNode).void }
|
2903
2919
|
def visit_attr(node); end
|
2904
2920
|
end
|
2905
2921
|
|
2906
2922
|
class Spoom::Sorbet::Translate::SorbetAssertionsToRBSComments < ::Spoom::Sorbet::Translate::Translator
|
2923
|
+
sig do
|
2924
|
+
params(
|
2925
|
+
ruby_contents: ::String,
|
2926
|
+
file: ::String,
|
2927
|
+
translate_t_let: T::Boolean,
|
2928
|
+
translate_t_cast: T::Boolean,
|
2929
|
+
translate_t_bind: T::Boolean,
|
2930
|
+
translate_t_must: T::Boolean,
|
2931
|
+
translate_t_unsafe: T::Boolean
|
2932
|
+
).void
|
2933
|
+
end
|
2934
|
+
def initialize(ruby_contents, file:, translate_t_let: T.unsafe(nil), translate_t_cast: T.unsafe(nil), translate_t_bind: T.unsafe(nil), translate_t_must: T.unsafe(nil), translate_t_unsafe: T.unsafe(nil)); end
|
2935
|
+
|
2907
2936
|
sig { override.params(node: ::Prism::IfNode).void }
|
2908
2937
|
def visit_if_node(node); end
|
2909
2938
|
|
@@ -2928,7 +2957,7 @@ class Spoom::Sorbet::Translate::SorbetAssertionsToRBSComments < ::Spoom::Sorbet:
|
|
2928
2957
|
def t?(node); end
|
2929
2958
|
|
2930
2959
|
sig { params(node: ::Prism::CallNode).returns(T::Boolean) }
|
2931
|
-
def
|
2960
|
+
def translatable_annotation?(node); end
|
2932
2961
|
end
|
2933
2962
|
|
2934
2963
|
Spoom::Sorbet::Translate::SorbetAssertionsToRBSComments::LINE_BREAK = T.let(T.unsafe(nil), Integer)
|
@@ -2939,10 +2968,13 @@ class Spoom::Sorbet::Translate::SorbetSigsToRBSComments < ::Spoom::Sorbet::Trans
|
|
2939
2968
|
ruby_contents: ::String,
|
2940
2969
|
file: ::String,
|
2941
2970
|
positional_names: T::Boolean,
|
2942
|
-
max_line_length: T.nilable(::Integer)
|
2971
|
+
max_line_length: T.nilable(::Integer),
|
2972
|
+
translate_generics: T::Boolean,
|
2973
|
+
translate_helpers: T::Boolean,
|
2974
|
+
translate_abstract_methods: T::Boolean
|
2943
2975
|
).void
|
2944
2976
|
end
|
2945
|
-
def initialize(ruby_contents, file:, positional_names:, max_line_length: T.unsafe(nil)); end
|
2977
|
+
def initialize(ruby_contents, file:, positional_names:, max_line_length: T.unsafe(nil), translate_generics: T.unsafe(nil), translate_helpers: T.unsafe(nil), translate_abstract_methods: T.unsafe(nil)); end
|
2946
2978
|
|
2947
2979
|
sig { override.params(node: ::Prism::CallNode).void }
|
2948
2980
|
def visit_call_node(node); end
|