ruby_mod_kit 0.0.2 → 0.0.4
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/.ruby_mod_kit.yml +5 -0
- data/lib/ruby_mod_kit/cli.rb +17 -2
- data/lib/ruby_mod_kit/config.rb +53 -0
- data/lib/ruby_mod_kit/core_ext/eval.rb +6 -0
- data/lib/ruby_mod_kit/core_ext/load.rb +12 -4
- data/lib/ruby_mod_kit/core_ext.rb +2 -2
- data/lib/ruby_mod_kit/corrector.rb +20 -0
- data/lib/ruby_mod_kit/corrector_manager.rb +64 -0
- data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +40 -0
- data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +42 -0
- data/lib/ruby_mod_kit/feature/instance_variable_parameter.rb +27 -0
- data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +77 -0
- data/lib/ruby_mod_kit/feature/overload.rb +19 -0
- data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +52 -0
- data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +84 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rb +49 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +46 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +29 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +41 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +36 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +30 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +32 -0
- data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +43 -0
- data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +69 -0
- data/lib/ruby_mod_kit/feature/type.rb +31 -0
- data/lib/ruby_mod_kit/feature.rb +18 -0
- data/lib/ruby_mod_kit/generation.rb +76 -29
- data/lib/ruby_mod_kit/memo/def_parent_memo.rb +36 -0
- data/lib/ruby_mod_kit/memo/{ivar.rb → ivar_memo.rb} +19 -3
- data/lib/ruby_mod_kit/memo/{method.rb → method_memo.rb} +7 -7
- data/lib/ruby_mod_kit/memo/offset_memo.rb +1 -1
- data/lib/ruby_mod_kit/memo/overload_memo.rb +47 -0
- data/lib/ruby_mod_kit/memo/{parameter.rb → parameter_memo.rb} +3 -3
- data/lib/ruby_mod_kit/memo.rb +7 -66
- data/lib/ruby_mod_kit/memo_pad.rb +72 -0
- data/lib/ruby_mod_kit/mission.rb +3 -25
- data/lib/ruby_mod_kit/node/base_node.rb +155 -0
- data/lib/ruby_mod_kit/node/call_node.rb +11 -7
- data/lib/ruby_mod_kit/node/def_node.rb +11 -7
- data/lib/ruby_mod_kit/node/def_parent_node.rb +25 -14
- data/lib/ruby_mod_kit/node/parameter_node.rb +13 -9
- data/lib/ruby_mod_kit/node/program_node.rb +8 -3
- data/lib/ruby_mod_kit/node/statements_node.rb +11 -7
- data/lib/ruby_mod_kit/node/symbol_node.rb +12 -7
- data/lib/ruby_mod_kit/node/untyped_node.rb +11 -7
- data/lib/ruby_mod_kit/node/wrap.rb +43 -0
- data/lib/ruby_mod_kit/node.rb +4 -150
- data/lib/ruby_mod_kit/version.rb +1 -1
- data/lib/ruby_mod_kit.rb +27 -8
- data/ruby_mod_kit.gemspec +7 -1
- data/sig/generated/ruby_mod_kit/cli.rbs +5 -0
- data/sig/generated/ruby_mod_kit/config.rbs +21 -0
- data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +3 -0
- data/sig/generated/ruby_mod_kit/core_ext/load.rbs +7 -4
- data/sig/generated/ruby_mod_kit/corrector.rbs +14 -0
- data/sig/generated/ruby_mod_kit/corrector_manager.rbs +22 -0
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +18 -0
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +14 -0
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter.rbs +14 -0
- data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +21 -0
- data/sig/generated/ruby_mod_kit/feature/overload.rbs +11 -0
- data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +24 -0
- data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +33 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rbs +21 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline.rbs +13 -0
- data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +18 -0
- data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +19 -0
- data/sig/generated/ruby_mod_kit/feature/type.rbs +14 -0
- data/sig/generated/ruby_mod_kit/feature.rbs +12 -0
- data/sig/generated/ruby_mod_kit/generation.rbs +44 -13
- data/sig/generated/ruby_mod_kit/memo/def_parent_memo.rbs +24 -0
- data/sig/generated/ruby_mod_kit/memo/{ivar.rbs → ivar_memo.rbs} +19 -3
- data/sig/generated/ruby_mod_kit/memo/{method.rbs → method_memo.rbs} +8 -8
- data/sig/generated/ruby_mod_kit/memo/offset_memo.rbs +1 -1
- data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +34 -0
- data/sig/generated/ruby_mod_kit/memo/{parameter.rbs → parameter_memo.rbs} +3 -3
- data/sig/generated/ruby_mod_kit/memo_pad.rbs +50 -0
- data/sig/generated/ruby_mod_kit/mission.rbs +2 -13
- data/sig/generated/ruby_mod_kit/node/base_node.rbs +75 -0
- data/sig/generated/ruby_mod_kit/node/call_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/def_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +17 -10
- data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +13 -8
- data/sig/generated/ruby_mod_kit/node/program_node.rbs +5 -2
- data/sig/generated/ruby_mod_kit/node/statements_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +13 -6
- data/sig/generated/ruby_mod_kit/node/untyped_node.rbs +11 -6
- data/sig/generated/ruby_mod_kit/node/wrap.rbs +12 -0
- data/sig/generated/ruby_mod_kit.rbs +10 -3
- data/sig/yaml.rbs +3 -0
- metadata +63 -30
- data/lib/ruby_mod_kit/memo/def_parent.rb +0 -27
- data/lib/ruby_mod_kit/mission/fix_parse_error.rb +0 -216
- data/lib/ruby_mod_kit/mission/ivar_arg.rb +0 -42
- data/lib/ruby_mod_kit/mission/overload.rb +0 -73
- data/lib/ruby_mod_kit/mission/type_attr.rb +0 -75
- data/lib/ruby_mod_kit/mission/type_parameter.rb +0 -39
- data/lib/ruby_mod_kit/mission/type_return.rb +0 -33
- data/lib/ruby_mod_kit/transpiler.rb +0 -20
- data/sig/generated/examples/user.rbs +0 -60
- data/sig/generated/ruby_mod_kit/memo/def_parent.rbs +0 -20
- data/sig/generated/ruby_mod_kit/memo/located.rbs +0 -14
- data/sig/generated/ruby_mod_kit/memo/parameter_type.rbs +0 -14
- data/sig/generated/ruby_mod_kit/memo.rbs +0 -41
- data/sig/generated/ruby_mod_kit/mission/fix_parse_error.rbs +0 -73
- data/sig/generated/ruby_mod_kit/mission/ivar_arg.rbs +0 -19
- data/sig/generated/ruby_mod_kit/mission/overload.rbs +0 -20
- data/sig/generated/ruby_mod_kit/mission/type_attr.rbs +0 -18
- data/sig/generated/ruby_mod_kit/mission/type_parameter.rbs +0 -18
- data/sig/generated/ruby_mod_kit/mission/type_return.rbs +0 -18
- data/sig/generated/ruby_mod_kit/node.rbs +0 -63
- data/sig/generated/ruby_mod_kit/transpiler.rbs +0 -11
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# rbs_inline: enabled
|
|
4
|
-
|
|
5
|
-
module RubyModKit
|
|
6
|
-
class Mission
|
|
7
|
-
# The mission for parameter types
|
|
8
|
-
class FixParseError < Mission
|
|
9
|
-
# @rbs @previous_error_messages: Array[String]
|
|
10
|
-
|
|
11
|
-
# @rbs return: void
|
|
12
|
-
def initialize
|
|
13
|
-
super(0)
|
|
14
|
-
@previous_error_messages = []
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# @rbs generation: Generation
|
|
18
|
-
# @rbs root_node: Node
|
|
19
|
-
# @rbs parse_result: Prism::ParseResult
|
|
20
|
-
# @rbs memo: Memo
|
|
21
|
-
# @rbs return: bool
|
|
22
|
-
def perform(generation, root_node, parse_result, memo)
|
|
23
|
-
return true if parse_result.errors.empty?
|
|
24
|
-
|
|
25
|
-
check_prev_errors(generation, parse_result)
|
|
26
|
-
@previous_error_messages = parse_result.errors.map(&:message)
|
|
27
|
-
|
|
28
|
-
parse_result.errors.each do |parse_error|
|
|
29
|
-
case parse_error.type
|
|
30
|
-
when :argument_formal_ivar
|
|
31
|
-
fix_argument_formal_ivar(parse_error, generation, root_node, memo)
|
|
32
|
-
when :argument_formal_constant
|
|
33
|
-
fix_argument_formal_constant(parse_error, generation)
|
|
34
|
-
when :unexpected_token_ignore
|
|
35
|
-
case parse_error.location.slice
|
|
36
|
-
when "=>"
|
|
37
|
-
fix_unexpected_assoc(parse_error, generation, root_node, memo)
|
|
38
|
-
when ":"
|
|
39
|
-
fix_unexpected_colon(parse_error, generation, root_node, memo)
|
|
40
|
-
end
|
|
41
|
-
when :def_params_term_paren
|
|
42
|
-
fix_def_params_term_paren(parse_error, generation, root_node, memo)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
false
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# @rbs generation: Generation
|
|
50
|
-
# @rbs parse_result: Prism::ParseResult
|
|
51
|
-
# @rbs return: void
|
|
52
|
-
def check_prev_errors(generation, parse_result)
|
|
53
|
-
return if @previous_error_messages.empty?
|
|
54
|
-
return if parse_result.errors.empty?
|
|
55
|
-
return if @previous_error_messages != parse_result.errors.map(&:message)
|
|
56
|
-
|
|
57
|
-
message = +""
|
|
58
|
-
parse_result.errors.each do |parse_error|
|
|
59
|
-
message << "\n" unless message.empty?
|
|
60
|
-
message << "#{generation.name}:#{parse_error.location.start_line}:#{parse_error.message} "
|
|
61
|
-
message << "(#{parse_error.type})"
|
|
62
|
-
line = parse_result.source.lines[parse_error.location.start_line - 1]
|
|
63
|
-
if line
|
|
64
|
-
message << "\n#{line.chomp}\n"
|
|
65
|
-
message << "#{" " * parse_error.location.start_column}^#{"~" * [parse_error.location.length - 1, 0].max}"
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
raise RubyModKit::SyntaxError, message
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# @rbs parse_error: Prism::ParseError
|
|
72
|
-
# @rbs generation: Generation
|
|
73
|
-
# @rbs root_node: Node
|
|
74
|
-
# @rbs memo: Memo
|
|
75
|
-
# @rbs return: void
|
|
76
|
-
def fix_def_params_term_paren(parse_error, generation, root_node, memo)
|
|
77
|
-
column = parse_error.location.start_column - 1
|
|
78
|
-
return if column < 0
|
|
79
|
-
|
|
80
|
-
line = generation.line(parse_error)[column..] || return
|
|
81
|
-
line =~ /\A\*(.*?)\s*=>\s*/
|
|
82
|
-
length = ::Regexp.last_match(0)&.length || return
|
|
83
|
-
type = ::Regexp.last_match(1) || return
|
|
84
|
-
offset = parse_error.location.start_offset - 1
|
|
85
|
-
parameter_position_node = root_node.node_at(offset + length) || return
|
|
86
|
-
|
|
87
|
-
generation[parse_error.location.start_offset, length - 1] = ""
|
|
88
|
-
parameter_memo = memo.parameter_memo(parameter_position_node)
|
|
89
|
-
parameter_memo.type = type
|
|
90
|
-
parameter_memo.qualifier = "*"
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
# @rbs parse_error: Prism::ParseError
|
|
94
|
-
# @rbs generation: Generation
|
|
95
|
-
# @rbs root_node: Node
|
|
96
|
-
# @rbs memo: Memo
|
|
97
|
-
# @rbs return: void
|
|
98
|
-
def fix_argument_formal_ivar(parse_error, generation, root_node, memo)
|
|
99
|
-
src_offset = parse_error.location.start_offset
|
|
100
|
-
|
|
101
|
-
name = parse_error.location.slice[1..]
|
|
102
|
-
raise RubyModKit::Error unless name
|
|
103
|
-
|
|
104
|
-
parameter_position_node = root_node.node_at(src_offset)
|
|
105
|
-
raise RubyModKit::Error unless parameter_position_node
|
|
106
|
-
|
|
107
|
-
generation[src_offset, parse_error.location.length] = name
|
|
108
|
-
parameter_memo = memo.parameter_memo(parameter_position_node)
|
|
109
|
-
parameter_memo.ivar_parameter = true
|
|
110
|
-
generation.add_mission(Mission::IvarArg.new(src_offset))
|
|
111
|
-
|
|
112
|
-
return unless parameter_memo.untyped?
|
|
113
|
-
|
|
114
|
-
def_parent_node = root_node.def_parent_node_at(parse_error.location.start_offset) || return
|
|
115
|
-
ivar_memo_type = memo.def_parent_memo(def_parent_node).ivar_memo(name.to_sym).type || return
|
|
116
|
-
parameter_memo.type = ivar_memo_type
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# @rbs parse_error: Prism::ParseError
|
|
120
|
-
# @rbs generation: Generation
|
|
121
|
-
# @rbs return: void
|
|
122
|
-
def fix_argument_formal_constant(parse_error, generation)
|
|
123
|
-
line = generation.line(parse_error)
|
|
124
|
-
line = line[parse_error.location.start_column..] || return
|
|
125
|
-
parameter_type = line[/(\A[A-Z]\w*(?:::[A-Z]\w*)+)(?:\s*=>\s*)/, 1] || return
|
|
126
|
-
src_offset = parse_error.location.start_offset
|
|
127
|
-
generation[src_offset, parameter_type.length] = "(#{parameter_type})"
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
# @rbs parse_error: Prism::ParseError
|
|
131
|
-
# @rbs generation: Generation
|
|
132
|
-
# @rbs root_node: Node
|
|
133
|
-
# @rbs memo: Memo
|
|
134
|
-
# @rbs return: void
|
|
135
|
-
def fix_unexpected_assoc(parse_error, generation, root_node, memo)
|
|
136
|
-
def_node = root_node.def_node_at(parse_error.location.start_offset) || return
|
|
137
|
-
def_parent_node = def_node.parent
|
|
138
|
-
parameters_node, body_node, = def_node.children
|
|
139
|
-
return if !def_parent_node || !parameters_node || !body_node
|
|
140
|
-
|
|
141
|
-
last_parameter_node = parameters_node.children.max_by(&:offset) || return
|
|
142
|
-
last_parameter_offset = last_parameter_node.offset
|
|
143
|
-
|
|
144
|
-
right_node = body_node.children.find { _1.offset >= parse_error.location.end_offset } || return
|
|
145
|
-
right_offset = right_node.offset
|
|
146
|
-
parameter_type = generation[last_parameter_offset...right_offset] || raise(RubyModKit::Error)
|
|
147
|
-
parameter_type = parameter_type.sub(/\s*=>\s*\z/, "")
|
|
148
|
-
generation[last_parameter_offset, right_offset - last_parameter_offset] = ""
|
|
149
|
-
memo.parameter_memo(last_parameter_node).type = parameter_type
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
# @rbs parse_error: Prism::ParseError
|
|
153
|
-
# @rbs generation: Generation
|
|
154
|
-
# @rbs root_node: Node
|
|
155
|
-
# @rbs memo: Memo
|
|
156
|
-
# @rbs return: void
|
|
157
|
-
def fix_unexpected_colon(parse_error, generation, root_node, memo)
|
|
158
|
-
parent_node = root_node.statements_node_at(parse_error.location.start_offset)&.parent
|
|
159
|
-
case parent_node
|
|
160
|
-
when Node::DefNode
|
|
161
|
-
fix_unexpected_colon_in_def(parse_error, generation, root_node, parent_node, memo)
|
|
162
|
-
when Node::DefParentNode
|
|
163
|
-
fix_unexpected_colon_in_module(parse_error, generation, parent_node, memo)
|
|
164
|
-
end
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# @rbs parse_error: Prism::ParseError
|
|
168
|
-
# @rbs generation: Generation
|
|
169
|
-
# @rbs root_node: Node
|
|
170
|
-
# @rbs def_node: Node::DefNode
|
|
171
|
-
# @rbs memo: Memo
|
|
172
|
-
# @rbs return: void
|
|
173
|
-
def fix_unexpected_colon_in_def(parse_error, generation, root_node, def_node, memo)
|
|
174
|
-
lparen_loc = def_node.lparen_loc
|
|
175
|
-
rparen_loc = def_node.rparen_loc
|
|
176
|
-
if !lparen_loc && !rparen_loc
|
|
177
|
-
src_offset = def_node.name_loc.end_offset
|
|
178
|
-
elsif lparen_loc && rparen_loc && lparen_loc.slice == "(" && rparen_loc.slice == ")"
|
|
179
|
-
src_offset = rparen_loc.end_offset
|
|
180
|
-
else
|
|
181
|
-
return
|
|
182
|
-
end
|
|
183
|
-
return if generation[src_offset...parse_error.location.start_offset] !~ /\A\s*\z/
|
|
184
|
-
|
|
185
|
-
return_type_location = root_node.node_at(parse_error.location.end_offset + 1)&.location || return_type_location
|
|
186
|
-
generation[src_offset, return_type_location.end_offset - src_offset] = ""
|
|
187
|
-
memo.method_memo(def_node).type = return_type_location.slice
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
# @rbs parse_error: Prism::ParseError
|
|
191
|
-
# @rbs generation: Generation
|
|
192
|
-
# @rbs def_parent_node: Node::DefParentNode
|
|
193
|
-
# @rbs memo: Memo
|
|
194
|
-
# @rbs return: void
|
|
195
|
-
def fix_unexpected_colon_in_module(parse_error, generation, def_parent_node, memo)
|
|
196
|
-
line = generation.line(parse_error)
|
|
197
|
-
line_offset = generation.src_offset(parse_error) || return
|
|
198
|
-
attr_patterns = %i[attr_reader reader getter attr_writer writer setter attr_accessor accessor property]
|
|
199
|
-
return if line !~ /(\A\s*)(?:(#{attr_patterns.join("|")}) )?@(\w*)\s*:\s*(.*)/
|
|
200
|
-
|
|
201
|
-
length = ::Regexp.last_match(0)&.length
|
|
202
|
-
indent = ::Regexp.last_match(1)
|
|
203
|
-
attr_kind = ::Regexp.last_match(2)
|
|
204
|
-
ivar_name = ::Regexp.last_match(3)
|
|
205
|
-
type = ::Regexp.last_match(4)
|
|
206
|
-
return if !length || !indent || !ivar_name || !type
|
|
207
|
-
|
|
208
|
-
ivar_memo = memo.def_parent_memo(def_parent_node).ivar_memo(ivar_name.to_sym)
|
|
209
|
-
ivar_memo.type = type
|
|
210
|
-
ivar_memo.attr_kind = attr_kind if attr_kind
|
|
211
|
-
|
|
212
|
-
generation[line_offset, length] = "#{indent}# @rbs @#{ivar_name}: #{Memo.unify_type(type)}"
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
end
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# rbs_inline: enabled
|
|
4
|
-
|
|
5
|
-
module RubyModKit
|
|
6
|
-
class Mission
|
|
7
|
-
# The mission for instance variable arguments
|
|
8
|
-
class IvarArg < Mission
|
|
9
|
-
# @rbs @assignment: String
|
|
10
|
-
|
|
11
|
-
attr_reader :assignment #: String
|
|
12
|
-
|
|
13
|
-
# @rbs generation: Generation
|
|
14
|
-
# @rbs root_node: Node
|
|
15
|
-
# @rbs _parse_result: Prism::ParseResult
|
|
16
|
-
# @rbs _memo: Memo
|
|
17
|
-
# @rbs return: bool
|
|
18
|
-
def perform(generation, root_node, _parse_result, _memo)
|
|
19
|
-
parameter_node = root_node.parameter_node_at(@offset)
|
|
20
|
-
raise RubyModKit::Error unless parameter_node
|
|
21
|
-
|
|
22
|
-
def_node = root_node.def_node_at(@offset)
|
|
23
|
-
raise RubyModKit::Error, "DefNode not found" unless def_node
|
|
24
|
-
|
|
25
|
-
def_body_location = def_node.body_location
|
|
26
|
-
end_loc = def_node.end_keyword_loc
|
|
27
|
-
if def_body_location
|
|
28
|
-
indent = def_body_location.start_column
|
|
29
|
-
src_offset = def_body_location.start_offset - indent
|
|
30
|
-
elsif end_loc
|
|
31
|
-
indent = end_loc.start_column + 2
|
|
32
|
-
src_offset = end_loc.start_offset - indent + 2
|
|
33
|
-
end
|
|
34
|
-
raise RubyModKit::Error if !src_offset || !indent
|
|
35
|
-
|
|
36
|
-
name = parameter_node.name
|
|
37
|
-
generation[src_offset, 0] = "#{" " * indent}@#{name} = #{name}\n"
|
|
38
|
-
true
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# rbs_inline: enabled
|
|
4
|
-
|
|
5
|
-
module RubyModKit
|
|
6
|
-
class Mission
|
|
7
|
-
# The mission for overload
|
|
8
|
-
class Overload < Mission
|
|
9
|
-
OVERLOAD_METHOD_MAP = {
|
|
10
|
-
"*": "_mul",
|
|
11
|
-
}.freeze #: Hash[Symbol, String]
|
|
12
|
-
|
|
13
|
-
# @rbs return: void
|
|
14
|
-
def initialize
|
|
15
|
-
super(0)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# @rbs generation: Generation
|
|
19
|
-
# @rbs root_node: Node
|
|
20
|
-
# @rbs parse_result: Prism::ParseResult
|
|
21
|
-
# @rbs memo: Memo
|
|
22
|
-
# @rbs return: bool
|
|
23
|
-
def perform(generation, root_node, parse_result, memo)
|
|
24
|
-
method_memo_groups = memo.methods_memo.each_value.group_by do |method_memo|
|
|
25
|
-
[root_node.def_parent_node_at(method_memo.offset), method_memo.name]
|
|
26
|
-
end
|
|
27
|
-
method_memo_groups.each_value do |method_memos|
|
|
28
|
-
next if method_memos.length <= 1
|
|
29
|
-
|
|
30
|
-
first_method_memo = method_memos.first
|
|
31
|
-
name = first_method_memo.name
|
|
32
|
-
first_def_node = root_node.def_node_at(first_method_memo.offset)
|
|
33
|
-
raise RubyModKit::Error unless first_def_node.is_a?(Node::DefNode)
|
|
34
|
-
raise RubyModKit::Error unless name.is_a?(Symbol)
|
|
35
|
-
|
|
36
|
-
start_line = first_def_node.location.start_line - 1
|
|
37
|
-
indent = parse_result.source.lines[start_line][/\A */] || ""
|
|
38
|
-
start_line -= 1 while parse_result.source.lines[start_line - 1] =~ /^ *# *@rbs /
|
|
39
|
-
src_offset = parse_result.source.offsets[start_line]
|
|
40
|
-
script = +""
|
|
41
|
-
|
|
42
|
-
method_memos.each do |method_memo|
|
|
43
|
-
script << if script.empty?
|
|
44
|
-
"# @rbs"
|
|
45
|
-
else
|
|
46
|
-
"# |"
|
|
47
|
-
end
|
|
48
|
-
type = method_memo.type
|
|
49
|
-
type = "(#{type})" if type.include?(" ")
|
|
50
|
-
script << " (#{method_memo.parameters.map(&:type).join(", ")}) -> #{type}\n"
|
|
51
|
-
end
|
|
52
|
-
script << "def #{name}(*args)\n case args\n"
|
|
53
|
-
overload_prefix = +"#{OVERLOAD_METHOD_MAP[name] || name}_"
|
|
54
|
-
method_memos.each_with_index do |method_memo, i|
|
|
55
|
-
overload_name = "#{overload_prefix}_overload#{i}"
|
|
56
|
-
def_node = root_node.def_node_at(method_memo.offset)
|
|
57
|
-
raise RubyModKit::Error if !def_node || !def_node.is_a?(Node::DefNode)
|
|
58
|
-
|
|
59
|
-
name_loc = def_node.name_loc
|
|
60
|
-
generation[name_loc.start_offset, name_loc.length] = overload_name
|
|
61
|
-
script << " in [#{method_memo.parameters.map(&:type).join(", ")}]\n"
|
|
62
|
-
script << " #{overload_name}(*args)\n"
|
|
63
|
-
end
|
|
64
|
-
script << " end\nend\n\n"
|
|
65
|
-
|
|
66
|
-
script.gsub!(/^(?=.)/, indent)
|
|
67
|
-
generation[src_offset, 0] = script
|
|
68
|
-
end
|
|
69
|
-
true
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# rbs_inline: enabled
|
|
4
|
-
|
|
5
|
-
module RubyModKit
|
|
6
|
-
class Mission
|
|
7
|
-
# The mission for parameter types
|
|
8
|
-
class TypeAttr < Mission
|
|
9
|
-
# @rbs return: void
|
|
10
|
-
def initialize
|
|
11
|
-
super(0)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# @rbs generation: Generation
|
|
15
|
-
# @rbs root_node: Node
|
|
16
|
-
# @rbs _parse_result: Prism::ParseResult
|
|
17
|
-
# @rbs memo: Memo
|
|
18
|
-
# @rbs return: bool
|
|
19
|
-
def perform(generation, root_node, _parse_result, memo)
|
|
20
|
-
memo.def_parents_memo.each_value do |def_parent_memo|
|
|
21
|
-
ivars_memo = def_parent_memo.ivars_memo.dup
|
|
22
|
-
def_parent_node = root_node.def_parent_node_at(def_parent_memo.offset) || raise(RubyModKit::Error)
|
|
23
|
-
attr_adding_line = 0
|
|
24
|
-
def_parent_node.body_node&.children&.each do |call_node|
|
|
25
|
-
break if ivars_memo.empty?
|
|
26
|
-
next unless call_node.is_a?(Node::CallNode)
|
|
27
|
-
next unless %i[attr_reader attr_writer attr_accessor].include?(call_node.name)
|
|
28
|
-
|
|
29
|
-
attr_adding_line = call_node.location.end_line
|
|
30
|
-
argument_nodes = call_node.children[0].children
|
|
31
|
-
next if argument_nodes.size != 1 || !argument_nodes[0].is_a?(Node::SymbolNode)
|
|
32
|
-
|
|
33
|
-
name = argument_nodes[0].value || next
|
|
34
|
-
ivar_memo = ivars_memo.delete(name) || next
|
|
35
|
-
line = generation.line(call_node)
|
|
36
|
-
length = line[/\A\s*(#{call_node.name}\s+:#{name})(?=\n\z)/, 1]&.length || next
|
|
37
|
-
generation[call_node.location.start_offset + length, 0] = " #: #{ivar_memo.type}"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
ivars_memo.keep_if { |_, ivar_memo| ivar_memo.attr_kind }
|
|
41
|
-
next if ivars_memo.empty?
|
|
42
|
-
|
|
43
|
-
add_first_separator_line = false
|
|
44
|
-
if attr_adding_line == 0
|
|
45
|
-
attr_adding_line = def_parent_node.location.start_line
|
|
46
|
-
prev_line = nil
|
|
47
|
-
while generation.line(attr_adding_line) =~ /\A\s*#.*|\A$/
|
|
48
|
-
prev_line = ::Regexp.last_match(0)
|
|
49
|
-
attr_adding_line += 1
|
|
50
|
-
end
|
|
51
|
-
add_first_separator_line = prev_line != ""
|
|
52
|
-
end
|
|
53
|
-
line = generation.line(attr_adding_line) || next
|
|
54
|
-
add_separator_line = line != "\n" && line !~ /\A\s*end$/
|
|
55
|
-
offset = generation.src_offset(attr_adding_line) || next
|
|
56
|
-
|
|
57
|
-
if def_parent_node.body_node
|
|
58
|
-
first_line = generation.line(def_parent_node.body_node)
|
|
59
|
-
indent = first_line[/\A\s*/] || raise(RubyModKit::Error)
|
|
60
|
-
else
|
|
61
|
-
def_parent_line = generation.line(def_parent_node)
|
|
62
|
-
indent = " #{def_parent_line[/\A\s*/]}"
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
generation[offset, 0] = "\n" if add_first_separator_line
|
|
66
|
-
ivars_memo.each do |name, ivar_memo|
|
|
67
|
-
generation[offset, 0] = "#{indent}#{ivar_memo.attr_kind} :#{name} #: #{ivar_memo.type}\n"
|
|
68
|
-
end
|
|
69
|
-
generation[offset, 0] = "\n" if add_separator_line
|
|
70
|
-
end
|
|
71
|
-
true
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# rbs_inline: enabled
|
|
4
|
-
|
|
5
|
-
module RubyModKit
|
|
6
|
-
class Mission
|
|
7
|
-
# The mission for parameter types
|
|
8
|
-
class TypeParameter < Mission
|
|
9
|
-
# @rbs return: void
|
|
10
|
-
def initialize
|
|
11
|
-
super(0)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# @rbs generation: Generation
|
|
15
|
-
# @rbs root_node: Node
|
|
16
|
-
# @rbs parse_result: Prism::ParseResult
|
|
17
|
-
# @rbs memo: Memo
|
|
18
|
-
# @rbs return: bool
|
|
19
|
-
def perform(generation, root_node, parse_result, memo)
|
|
20
|
-
memo.parameters_memo.each do |offset, parameter_memo|
|
|
21
|
-
next if parameter_memo.untyped?
|
|
22
|
-
|
|
23
|
-
def_node = root_node.def_node_at(offset)
|
|
24
|
-
raise RubyModKit::Error, "DefNode not found" if !def_node || !def_node.is_a?(Node::DefNode)
|
|
25
|
-
|
|
26
|
-
parameter_node = root_node.parameter_node_at(offset)
|
|
27
|
-
raise RubyModKit::Error, "ParameterNode not found" unless parameter_node
|
|
28
|
-
|
|
29
|
-
type = parameter_memo.type
|
|
30
|
-
src_offset = parse_result.source.offsets[def_node.location.start_line - 1]
|
|
31
|
-
indent = def_node.offset - src_offset
|
|
32
|
-
qualified_name = "#{parameter_memo.qualifier}#{parameter_node.name}"
|
|
33
|
-
generation[src_offset, 0] = "#{" " * indent}# @rbs #{qualified_name}: #{type}\n"
|
|
34
|
-
end
|
|
35
|
-
true
|
|
36
|
-
end
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# rbs_inline: enabled
|
|
4
|
-
|
|
5
|
-
module RubyModKit
|
|
6
|
-
class Mission
|
|
7
|
-
# The mission for parameter types
|
|
8
|
-
class TypeReturn < Mission
|
|
9
|
-
# @rbs return: void
|
|
10
|
-
def initialize
|
|
11
|
-
super(0)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# @rbs generation: Generation
|
|
15
|
-
# @rbs root_node: Node
|
|
16
|
-
# @rbs parse_result: Prism::ParseResult
|
|
17
|
-
# @rbs memo: Memo
|
|
18
|
-
# @rbs return: bool
|
|
19
|
-
def perform(generation, root_node, parse_result, memo)
|
|
20
|
-
memo.methods_memo.each do |offset, method_memo|
|
|
21
|
-
def_node = root_node.def_node_at(offset)
|
|
22
|
-
raise RubyModKit::Error, "DefNode not found" if !def_node || !def_node.is_a?(Node::DefNode)
|
|
23
|
-
next if method_memo.untyped?
|
|
24
|
-
|
|
25
|
-
src_offset = parse_result.source.offsets[def_node.location.start_line - 1]
|
|
26
|
-
indent = offset - src_offset
|
|
27
|
-
generation[src_offset, 0] = "#{" " * indent}# @rbs return: #{method_memo.type}\n"
|
|
28
|
-
end
|
|
29
|
-
true
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
# rbs_inline: enabled
|
|
4
|
-
|
|
5
|
-
module RubyModKit
|
|
6
|
-
# The class of transpiler.
|
|
7
|
-
class Transpiler
|
|
8
|
-
# @rbs src: String
|
|
9
|
-
# @rbs filename: String | nil
|
|
10
|
-
# @rbs return: String
|
|
11
|
-
def transpile(src, filename: nil)
|
|
12
|
-
generation = Generation.new(src.dup, filename: filename)
|
|
13
|
-
until generation.completed?
|
|
14
|
-
generation.resolve
|
|
15
|
-
generation = generation.succ
|
|
16
|
-
end
|
|
17
|
-
generation.script
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Generated from examples/user.rb with RBS::Inline
|
|
2
|
-
|
|
3
|
-
# Example class
|
|
4
|
-
class User
|
|
5
|
-
@email: String
|
|
6
|
-
|
|
7
|
-
@tel: nil | String
|
|
8
|
-
|
|
9
|
-
@nick: nil | String
|
|
10
|
-
|
|
11
|
-
attr_reader email: String
|
|
12
|
-
|
|
13
|
-
attr_reader name: nil | String
|
|
14
|
-
|
|
15
|
-
attr_reader nick: nil | String
|
|
16
|
-
|
|
17
|
-
# @rbs email: String
|
|
18
|
-
# @rbs tel: nil | String
|
|
19
|
-
# @rbs name: nil | String
|
|
20
|
-
# @rbs nick: nil | String
|
|
21
|
-
# @rbs return: void
|
|
22
|
-
def initialize: (String email, ?nil | String tel, ?name: nil | String, ?nick: nil | String) -> void
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
# Example class
|
|
26
|
-
class Pos
|
|
27
|
-
@x: Integer
|
|
28
|
-
|
|
29
|
-
@y: Integer
|
|
30
|
-
|
|
31
|
-
@z: Integer
|
|
32
|
-
|
|
33
|
-
attr_reader x: Integer
|
|
34
|
-
|
|
35
|
-
attr_reader y: Integer
|
|
36
|
-
|
|
37
|
-
attr_reader z: Integer
|
|
38
|
-
|
|
39
|
-
# @rbs x: Integer
|
|
40
|
-
# @rbs y: Integer
|
|
41
|
-
# @rbs z: Integer
|
|
42
|
-
# @rbs return: void
|
|
43
|
-
def initialize: (Integer x, Integer y, ?Integer z) -> void
|
|
44
|
-
|
|
45
|
-
# @rbs (Pos) -> Integer
|
|
46
|
-
# | (Integer) -> Pos
|
|
47
|
-
def *: (Pos) -> Integer
|
|
48
|
-
| (Integer) -> Pos
|
|
49
|
-
|
|
50
|
-
# @rbs other: Pos
|
|
51
|
-
# @rbs return: Integer
|
|
52
|
-
def _mul__overload0: (Pos other) -> Integer
|
|
53
|
-
|
|
54
|
-
# @rbs n: Integer
|
|
55
|
-
# @rbs return: Pos
|
|
56
|
-
def _mul__overload1: (Integer n) -> Pos
|
|
57
|
-
|
|
58
|
-
# @rbs return: String
|
|
59
|
-
def to_s: () -> String
|
|
60
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Generated from lib/ruby_mod_kit/memo/def_parent.rb with RBS::Inline
|
|
2
|
-
|
|
3
|
-
module RubyModKit
|
|
4
|
-
class Memo
|
|
5
|
-
# The memo for def parent (class, module)
|
|
6
|
-
class DefParent < OffsetMemo
|
|
7
|
-
@ivars_memo: Hash[Symbol, Memo::Ivar]
|
|
8
|
-
|
|
9
|
-
attr_reader ivars_memo: Hash[Symbol, Memo::Ivar]
|
|
10
|
-
|
|
11
|
-
# @rbs def_parent_node: Node::DefParentNode
|
|
12
|
-
# @rbs return: void
|
|
13
|
-
def initialize: (Node::DefParentNode def_parent_node) -> void
|
|
14
|
-
|
|
15
|
-
# @rbs name: Symbol
|
|
16
|
-
# @rbs return: Memo::Ivar
|
|
17
|
-
def ivar_memo: (Symbol name) -> Memo::Ivar
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# Generated from lib/ruby_mod_kit/memo/located.rb with RBS::Inline
|
|
2
|
-
|
|
3
|
-
module RubyModKit
|
|
4
|
-
class Memo
|
|
5
|
-
# The base class for located memo
|
|
6
|
-
class Located
|
|
7
|
-
attr_reader offset: Integer
|
|
8
|
-
|
|
9
|
-
# @rbs offset: Integer
|
|
10
|
-
# @rbs return: void
|
|
11
|
-
def initialize: (Integer offset) -> void
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
# Generated from lib/ruby_mod_kit/memo/parameter_type.rb with RBS::Inline
|
|
2
|
-
|
|
3
|
-
module RubyModKit
|
|
4
|
-
class Memo
|
|
5
|
-
# The memo for parameter type
|
|
6
|
-
class ParameterType < Located
|
|
7
|
-
# @rbs offset: Integer
|
|
8
|
-
# @rbs name: Symbol
|
|
9
|
-
# @rbs type: String
|
|
10
|
-
# @rbs return: void
|
|
11
|
-
def initialize: (Integer offset, Symbol name, String type) -> void
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Generated from lib/ruby_mod_kit/memo.rb with RBS::Inline
|
|
2
|
-
|
|
3
|
-
module RubyModKit
|
|
4
|
-
# The class of transpiler generation.
|
|
5
|
-
class Memo
|
|
6
|
-
@def_parents_memo: Hash[Integer, Memo::DefParent]
|
|
7
|
-
|
|
8
|
-
@methods_memo: Hash[Integer, Memo::Method]
|
|
9
|
-
|
|
10
|
-
@parameters_memo: Hash[Integer, Memo::Parameter]
|
|
11
|
-
|
|
12
|
-
attr_reader def_parents_memo: Hash[Integer, Memo::DefParent]
|
|
13
|
-
|
|
14
|
-
attr_reader methods_memo: Hash[Integer, Memo::Method]
|
|
15
|
-
|
|
16
|
-
attr_reader parameters_memo: Hash[Integer, Memo::Parameter]
|
|
17
|
-
|
|
18
|
-
# @rbs return: void
|
|
19
|
-
def initialize: () -> void
|
|
20
|
-
|
|
21
|
-
# @rbs offset_diff: OffsetDiff
|
|
22
|
-
# @rbs return: void
|
|
23
|
-
def succ: (OffsetDiff offset_diff) -> void
|
|
24
|
-
|
|
25
|
-
# @rbs def_parent_node: Node::DefParentNode
|
|
26
|
-
# @rbs return: Memo::DefParent
|
|
27
|
-
def def_parent_memo: (Node::DefParentNode def_parent_node) -> Memo::DefParent
|
|
28
|
-
|
|
29
|
-
# @rbs def_node: Node::DefNode
|
|
30
|
-
# @rbs return: Memo::Method
|
|
31
|
-
def method_memo: (Node::DefNode def_node) -> Memo::Method
|
|
32
|
-
|
|
33
|
-
# @rbs node: Node
|
|
34
|
-
# @rbs return: Memo::Parameter
|
|
35
|
-
def parameter_memo: (Node node) -> Memo::Parameter
|
|
36
|
-
|
|
37
|
-
# @rbs type: String
|
|
38
|
-
# @rbs return: String
|
|
39
|
-
def self.unify_type: (String type) -> String
|
|
40
|
-
end
|
|
41
|
-
end
|