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.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby_mod_kit.yml +5 -0
  3. data/lib/ruby_mod_kit/cli.rb +17 -2
  4. data/lib/ruby_mod_kit/config.rb +53 -0
  5. data/lib/ruby_mod_kit/core_ext/eval.rb +6 -0
  6. data/lib/ruby_mod_kit/core_ext/load.rb +12 -4
  7. data/lib/ruby_mod_kit/core_ext.rb +2 -2
  8. data/lib/ruby_mod_kit/corrector.rb +20 -0
  9. data/lib/ruby_mod_kit/corrector_manager.rb +64 -0
  10. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +40 -0
  11. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +42 -0
  12. data/lib/ruby_mod_kit/feature/instance_variable_parameter.rb +27 -0
  13. data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +77 -0
  14. data/lib/ruby_mod_kit/feature/overload.rb +19 -0
  15. data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +52 -0
  16. data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +84 -0
  17. data/lib/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rb +49 -0
  18. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +46 -0
  19. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +29 -0
  20. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +41 -0
  21. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +36 -0
  22. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +30 -0
  23. data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +32 -0
  24. data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +43 -0
  25. data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +69 -0
  26. data/lib/ruby_mod_kit/feature/type.rb +31 -0
  27. data/lib/ruby_mod_kit/feature.rb +18 -0
  28. data/lib/ruby_mod_kit/generation.rb +76 -29
  29. data/lib/ruby_mod_kit/memo/def_parent_memo.rb +36 -0
  30. data/lib/ruby_mod_kit/memo/{ivar.rb → ivar_memo.rb} +19 -3
  31. data/lib/ruby_mod_kit/memo/{method.rb → method_memo.rb} +7 -7
  32. data/lib/ruby_mod_kit/memo/offset_memo.rb +1 -1
  33. data/lib/ruby_mod_kit/memo/overload_memo.rb +47 -0
  34. data/lib/ruby_mod_kit/memo/{parameter.rb → parameter_memo.rb} +3 -3
  35. data/lib/ruby_mod_kit/memo.rb +7 -66
  36. data/lib/ruby_mod_kit/memo_pad.rb +72 -0
  37. data/lib/ruby_mod_kit/mission.rb +3 -25
  38. data/lib/ruby_mod_kit/node/base_node.rb +155 -0
  39. data/lib/ruby_mod_kit/node/call_node.rb +11 -7
  40. data/lib/ruby_mod_kit/node/def_node.rb +11 -7
  41. data/lib/ruby_mod_kit/node/def_parent_node.rb +25 -14
  42. data/lib/ruby_mod_kit/node/parameter_node.rb +13 -9
  43. data/lib/ruby_mod_kit/node/program_node.rb +8 -3
  44. data/lib/ruby_mod_kit/node/statements_node.rb +11 -7
  45. data/lib/ruby_mod_kit/node/symbol_node.rb +12 -7
  46. data/lib/ruby_mod_kit/node/untyped_node.rb +11 -7
  47. data/lib/ruby_mod_kit/node/wrap.rb +43 -0
  48. data/lib/ruby_mod_kit/node.rb +4 -150
  49. data/lib/ruby_mod_kit/version.rb +1 -1
  50. data/lib/ruby_mod_kit.rb +27 -8
  51. data/ruby_mod_kit.gemspec +7 -1
  52. data/sig/generated/ruby_mod_kit/cli.rbs +5 -0
  53. data/sig/generated/ruby_mod_kit/config.rbs +21 -0
  54. data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +3 -0
  55. data/sig/generated/ruby_mod_kit/core_ext/load.rbs +7 -4
  56. data/sig/generated/ruby_mod_kit/corrector.rbs +14 -0
  57. data/sig/generated/ruby_mod_kit/corrector_manager.rbs +22 -0
  58. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +18 -0
  59. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +14 -0
  60. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter.rbs +14 -0
  61. data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +21 -0
  62. data/sig/generated/ruby_mod_kit/feature/overload.rbs +11 -0
  63. data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +24 -0
  64. data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +33 -0
  65. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rbs +21 -0
  66. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +16 -0
  67. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +16 -0
  68. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +16 -0
  69. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +16 -0
  70. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +16 -0
  71. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline.rbs +13 -0
  72. data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +18 -0
  73. data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +19 -0
  74. data/sig/generated/ruby_mod_kit/feature/type.rbs +14 -0
  75. data/sig/generated/ruby_mod_kit/feature.rbs +12 -0
  76. data/sig/generated/ruby_mod_kit/generation.rbs +44 -13
  77. data/sig/generated/ruby_mod_kit/memo/def_parent_memo.rbs +24 -0
  78. data/sig/generated/ruby_mod_kit/memo/{ivar.rbs → ivar_memo.rbs} +19 -3
  79. data/sig/generated/ruby_mod_kit/memo/{method.rbs → method_memo.rbs} +8 -8
  80. data/sig/generated/ruby_mod_kit/memo/offset_memo.rbs +1 -1
  81. data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +34 -0
  82. data/sig/generated/ruby_mod_kit/memo/{parameter.rbs → parameter_memo.rbs} +3 -3
  83. data/sig/generated/ruby_mod_kit/memo_pad.rbs +50 -0
  84. data/sig/generated/ruby_mod_kit/mission.rbs +2 -13
  85. data/sig/generated/ruby_mod_kit/node/base_node.rbs +75 -0
  86. data/sig/generated/ruby_mod_kit/node/call_node.rbs +11 -6
  87. data/sig/generated/ruby_mod_kit/node/def_node.rbs +11 -6
  88. data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +17 -10
  89. data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +13 -8
  90. data/sig/generated/ruby_mod_kit/node/program_node.rbs +5 -2
  91. data/sig/generated/ruby_mod_kit/node/statements_node.rbs +11 -6
  92. data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +13 -6
  93. data/sig/generated/ruby_mod_kit/node/untyped_node.rbs +11 -6
  94. data/sig/generated/ruby_mod_kit/node/wrap.rbs +12 -0
  95. data/sig/generated/ruby_mod_kit.rbs +10 -3
  96. data/sig/yaml.rbs +3 -0
  97. metadata +63 -30
  98. data/lib/ruby_mod_kit/memo/def_parent.rb +0 -27
  99. data/lib/ruby_mod_kit/mission/fix_parse_error.rb +0 -216
  100. data/lib/ruby_mod_kit/mission/ivar_arg.rb +0 -42
  101. data/lib/ruby_mod_kit/mission/overload.rb +0 -73
  102. data/lib/ruby_mod_kit/mission/type_attr.rb +0 -75
  103. data/lib/ruby_mod_kit/mission/type_parameter.rb +0 -39
  104. data/lib/ruby_mod_kit/mission/type_return.rb +0 -33
  105. data/lib/ruby_mod_kit/transpiler.rb +0 -20
  106. data/sig/generated/examples/user.rbs +0 -60
  107. data/sig/generated/ruby_mod_kit/memo/def_parent.rbs +0 -20
  108. data/sig/generated/ruby_mod_kit/memo/located.rbs +0 -14
  109. data/sig/generated/ruby_mod_kit/memo/parameter_type.rbs +0 -14
  110. data/sig/generated/ruby_mod_kit/memo.rbs +0 -41
  111. data/sig/generated/ruby_mod_kit/mission/fix_parse_error.rbs +0 -73
  112. data/sig/generated/ruby_mod_kit/mission/ivar_arg.rbs +0 -19
  113. data/sig/generated/ruby_mod_kit/mission/overload.rbs +0 -20
  114. data/sig/generated/ruby_mod_kit/mission/type_attr.rbs +0 -18
  115. data/sig/generated/ruby_mod_kit/mission/type_parameter.rbs +0 -18
  116. data/sig/generated/ruby_mod_kit/mission/type_return.rbs +0 -18
  117. data/sig/generated/ruby_mod_kit/node.rbs +0 -63
  118. 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