ruby_mod_kit 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -8
  3. data/lib/ruby_mod_kit/cli.rb +10 -1
  4. data/lib/ruby_mod_kit/core_ext/eval.rb +36 -0
  5. data/lib/ruby_mod_kit/core_ext/load.rb +74 -0
  6. data/lib/ruby_mod_kit/core_ext.rb +7 -0
  7. data/lib/ruby_mod_kit/corrector.rb +22 -0
  8. data/lib/ruby_mod_kit/corrector_manager.rb +68 -0
  9. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +42 -0
  10. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +49 -0
  11. data/lib/ruby_mod_kit/feature/instance_variable_parameter.rb +27 -0
  12. data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +80 -0
  13. data/lib/ruby_mod_kit/feature/overload.rb +19 -0
  14. data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +49 -0
  15. data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +90 -0
  16. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +41 -0
  17. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +31 -0
  18. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +43 -0
  19. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +38 -0
  20. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +32 -0
  21. data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +29 -0
  22. data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +45 -0
  23. data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +67 -0
  24. data/lib/ruby_mod_kit/feature/type.rb +31 -0
  25. data/lib/ruby_mod_kit/feature.rb +24 -0
  26. data/lib/ruby_mod_kit/generation.rb +60 -22
  27. data/lib/ruby_mod_kit/memo/def_parent_memo.rb +36 -0
  28. data/lib/ruby_mod_kit/memo/{ivar.rb → ivar_memo.rb} +17 -3
  29. data/lib/ruby_mod_kit/memo/{method.rb → method_memo.rb} +7 -7
  30. data/lib/ruby_mod_kit/memo/offset_memo.rb +1 -1
  31. data/lib/ruby_mod_kit/memo/overload_memo.rb +46 -0
  32. data/lib/ruby_mod_kit/memo/{parameter.rb → parameter_memo.rb} +3 -3
  33. data/lib/ruby_mod_kit/memo.rb +7 -64
  34. data/lib/ruby_mod_kit/memo_pad.rb +69 -0
  35. data/lib/ruby_mod_kit/mission.rb +5 -24
  36. data/lib/ruby_mod_kit/node/base_node.rb +137 -0
  37. data/lib/ruby_mod_kit/node/call_node.rb +10 -6
  38. data/lib/ruby_mod_kit/node/def_node.rb +10 -6
  39. data/lib/ruby_mod_kit/node/def_parent_node.rb +41 -0
  40. data/lib/ruby_mod_kit/node/parameter_node.rb +12 -8
  41. data/lib/ruby_mod_kit/node/program_node.rb +2 -2
  42. data/lib/ruby_mod_kit/node/statements_node.rb +10 -6
  43. data/lib/ruby_mod_kit/node/symbol_node.rb +10 -6
  44. data/lib/ruby_mod_kit/node/untyped_node.rb +10 -6
  45. data/lib/ruby_mod_kit/node/wrap.rb +43 -0
  46. data/lib/ruby_mod_kit/node.rb +5 -149
  47. data/lib/ruby_mod_kit/offset_diff.rb +12 -6
  48. data/lib/ruby_mod_kit/version.rb +1 -1
  49. data/lib/ruby_mod_kit.rb +43 -11
  50. data/ruby_mod_kit.gemspec +1 -6
  51. data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +17 -0
  52. data/sig/generated/ruby_mod_kit/core_ext/load.rbs +33 -0
  53. data/sig/generated/ruby_mod_kit/corrector.rbs +16 -0
  54. data/sig/generated/ruby_mod_kit/corrector_manager.rbs +26 -0
  55. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +20 -0
  56. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +21 -0
  57. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter.rbs +14 -0
  58. data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +24 -0
  59. data/sig/generated/ruby_mod_kit/feature/overload.rbs +11 -0
  60. data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +20 -0
  61. data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +39 -0
  62. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +19 -0
  63. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +19 -0
  64. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +19 -0
  65. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +19 -0
  66. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +19 -0
  67. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline.rbs +13 -0
  68. data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +20 -0
  69. data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +20 -0
  70. data/sig/generated/ruby_mod_kit/feature/type.rbs +14 -0
  71. data/sig/generated/ruby_mod_kit/feature.rbs +16 -0
  72. data/sig/generated/ruby_mod_kit/generation.rbs +25 -10
  73. data/sig/generated/ruby_mod_kit/memo/def_parent_memo.rbs +24 -0
  74. data/sig/generated/ruby_mod_kit/memo/{ivar.rbs → ivar_memo.rbs} +15 -3
  75. data/sig/generated/ruby_mod_kit/memo/{method.rbs → method_memo.rbs} +8 -8
  76. data/sig/generated/ruby_mod_kit/memo/offset_memo.rbs +1 -1
  77. data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +32 -0
  78. data/sig/generated/ruby_mod_kit/memo/{parameter.rbs → parameter_memo.rbs} +3 -3
  79. data/sig/generated/ruby_mod_kit/memo.rbs +2 -36
  80. data/sig/generated/ruby_mod_kit/memo_pad.rbs +46 -0
  81. data/sig/generated/ruby_mod_kit/mission.rbs +4 -12
  82. data/sig/generated/ruby_mod_kit/node/base_node.rbs +65 -0
  83. data/sig/generated/ruby_mod_kit/node/call_node.rbs +11 -6
  84. data/sig/generated/ruby_mod_kit/node/def_node.rbs +11 -6
  85. data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +31 -0
  86. data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +13 -8
  87. data/sig/generated/ruby_mod_kit/node/program_node.rbs +2 -2
  88. data/sig/generated/ruby_mod_kit/node/statements_node.rbs +11 -6
  89. data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +11 -6
  90. data/sig/generated/ruby_mod_kit/node/untyped_node.rbs +11 -6
  91. data/sig/generated/ruby_mod_kit/node/wrap.rbs +12 -0
  92. data/sig/generated/ruby_mod_kit/node.rbs +2 -58
  93. data/sig/generated/ruby_mod_kit/offset_diff.rbs +3 -1
  94. data/sig/generated/ruby_mod_kit.rbs +13 -2
  95. data/sig/thor.rbs +2 -0
  96. metadata +63 -43
  97. data/lib/ruby_mod_kit/memo/class.rb +0 -27
  98. data/lib/ruby_mod_kit/mission/fix_parse_error.rb +0 -213
  99. data/lib/ruby_mod_kit/mission/ivar_arg.rb +0 -42
  100. data/lib/ruby_mod_kit/mission/overload.rb +0 -73
  101. data/lib/ruby_mod_kit/mission/type_attr.rb +0 -75
  102. data/lib/ruby_mod_kit/mission/type_parameter.rb +0 -39
  103. data/lib/ruby_mod_kit/mission/type_return.rb +0 -33
  104. data/lib/ruby_mod_kit/node/class_node.rb +0 -37
  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/class.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/mission/fix_parse_error.rbs +0 -73
  111. data/sig/generated/ruby_mod_kit/mission/ivar_arg.rbs +0 -19
  112. data/sig/generated/ruby_mod_kit/mission/overload.rbs +0 -20
  113. data/sig/generated/ruby_mod_kit/mission/type_attr.rbs +0 -18
  114. data/sig/generated/ruby_mod_kit/mission/type_parameter.rbs +0 -18
  115. data/sig/generated/ruby_mod_kit/mission/type_return.rbs +0 -18
  116. data/sig/generated/ruby_mod_kit/node/class_node.rbs +0 -29
  117. data/sig/generated/ruby_mod_kit/transpiler.rbs +0 -11
@@ -1,213 +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})\n"
62
- message << parse_result.source.lines[parse_error.location.start_line - 1].chomp << "\n"
63
- message << "#{" " * parse_error.location.start_column}^#{"~" * [parse_error.location.length - 1, 0].max}"
64
- end
65
- raise RubyModKit::SyntaxError, message
66
- end
67
-
68
- # @rbs parse_error: Prism::ParseError
69
- # @rbs generation: Generation
70
- # @rbs root_node: Node
71
- # @rbs memo: Memo
72
- # @rbs return: void
73
- def fix_def_params_term_paren(parse_error, generation, root_node, memo)
74
- column = parse_error.location.start_column - 1
75
- return if column < 0
76
-
77
- line = generation.line(parse_error)[column..] || return
78
- line =~ /\A\*(.*?)\s*=>\s*/
79
- length = ::Regexp.last_match(0)&.length || return
80
- type = ::Regexp.last_match(1) || return
81
- offset = parse_error.location.start_offset - 1
82
- parameter_position_node = root_node.node_at(offset + length) || return
83
-
84
- generation[parse_error.location.start_offset, length - 1] = ""
85
- parameter_memo = memo.parameter_memo(parameter_position_node)
86
- parameter_memo.type = type
87
- parameter_memo.qualifier = "*"
88
- end
89
-
90
- # @rbs parse_error: Prism::ParseError
91
- # @rbs generation: Generation
92
- # @rbs root_node: Node
93
- # @rbs memo: Memo
94
- # @rbs return: void
95
- def fix_argument_formal_ivar(parse_error, generation, root_node, memo)
96
- src_offset = parse_error.location.start_offset
97
-
98
- name = parse_error.location.slice[1..]
99
- raise RubyModKit::Error unless name
100
-
101
- parameter_position_node = root_node.node_at(src_offset)
102
- raise RubyModKit::Error unless parameter_position_node
103
-
104
- generation[src_offset, parse_error.location.length] = name
105
- parameter_memo = memo.parameter_memo(parameter_position_node)
106
- parameter_memo.ivar_parameter = true
107
- generation.add_mission(Mission::IvarArg.new(src_offset))
108
-
109
- return unless parameter_memo.untyped?
110
-
111
- class_node = root_node.class_node_at(parse_error.location.start_offset) || return
112
- ivar_memo_type = memo.class_memo(class_node).ivar_memo(name.to_sym).type || return
113
- parameter_memo.type = ivar_memo_type
114
- end
115
-
116
- # @rbs parse_error: Prism::ParseError
117
- # @rbs generation: Generation
118
- # @rbs return: void
119
- def fix_argument_formal_constant(parse_error, generation)
120
- line = generation.line(parse_error)
121
- line = line[parse_error.location.start_column..] || return
122
- parameter_type = line[/(\A[A-Z]\w*(?:::[A-Z]\w*)+)(?:\s*=>\s*)/, 1] || return
123
- src_offset = parse_error.location.start_offset
124
- generation[src_offset, parameter_type.length] = "(#{parameter_type})"
125
- end
126
-
127
- # @rbs parse_error: Prism::ParseError
128
- # @rbs generation: Generation
129
- # @rbs root_node: Node
130
- # @rbs memo: Memo
131
- # @rbs return: void
132
- def fix_unexpected_assoc(parse_error, generation, root_node, memo)
133
- def_node = root_node.def_node_at(parse_error.location.start_offset) || return
134
- def_parent_node = def_node.parent
135
- parameters_node, body_node, = def_node.children
136
- return if !def_parent_node || !parameters_node || !body_node
137
-
138
- last_parameter_node = parameters_node.children.max_by(&:offset) || return
139
- last_parameter_offset = last_parameter_node.offset
140
-
141
- right_node = body_node.children.find { _1.offset >= parse_error.location.end_offset } || return
142
- right_offset = right_node.offset
143
- parameter_type = generation[last_parameter_offset...right_offset] || raise(RubyModKit::Error)
144
- parameter_type = parameter_type.sub(/\s*=>\s*\z/, "")
145
- generation[last_parameter_offset, right_offset - last_parameter_offset] = ""
146
- memo.parameter_memo(last_parameter_node).type = parameter_type
147
- end
148
-
149
- # @rbs parse_error: Prism::ParseError
150
- # @rbs generation: Generation
151
- # @rbs root_node: Node
152
- # @rbs memo: Memo
153
- # @rbs return: void
154
- def fix_unexpected_colon(parse_error, generation, root_node, memo)
155
- parent_node = root_node.statements_node_at(parse_error.location.start_offset)&.parent
156
- case parent_node
157
- when Node::DefNode
158
- fix_unexpected_colon_in_def(parse_error, generation, root_node, parent_node, memo)
159
- when Node::ClassNode
160
- fix_unexpected_colon_in_module(parse_error, generation, parent_node, memo)
161
- end
162
- end
163
-
164
- # @rbs parse_error: Prism::ParseError
165
- # @rbs generation: Generation
166
- # @rbs root_node: Node
167
- # @rbs def_node: Node::DefNode
168
- # @rbs memo: Memo
169
- # @rbs return: void
170
- def fix_unexpected_colon_in_def(parse_error, generation, root_node, def_node, memo)
171
- lparen_loc = def_node.lparen_loc
172
- rparen_loc = def_node.rparen_loc
173
- if !lparen_loc && !rparen_loc
174
- src_offset = def_node.name_loc.end_offset
175
- elsif lparen_loc && rparen_loc && lparen_loc.slice == "(" && rparen_loc.slice == ")"
176
- src_offset = rparen_loc.end_offset
177
- else
178
- return
179
- end
180
- return if generation[src_offset...parse_error.location.start_offset] !~ /\A\s*\z/
181
-
182
- return_type_location = root_node.node_at(parse_error.location.end_offset + 1)&.location || return_type_location
183
- generation[src_offset, return_type_location.end_offset - src_offset] = ""
184
- memo.method_memo(def_node).type = return_type_location.slice
185
- end
186
-
187
- # @rbs parse_error: Prism::ParseError
188
- # @rbs generation: Generation
189
- # @rbs class_node: Node::ClassNode
190
- # @rbs memo: Memo
191
- # @rbs return: void
192
- def fix_unexpected_colon_in_module(parse_error, generation, class_node, memo)
193
- line = generation.line(parse_error)
194
- line_offset = generation.src_offset(parse_error) || return
195
- attr_patterns = %i[attr_reader reader getter attr_writer writer setter attr_accessor accessor property]
196
- return if line !~ /(\A\s*)(?:(#{attr_patterns.join("|")}) )?@(\w*)\s*:\s*(.*)/
197
-
198
- length = ::Regexp.last_match(0)&.length
199
- indent = ::Regexp.last_match(1)
200
- attr_kind = ::Regexp.last_match(2)
201
- ivar_name = ::Regexp.last_match(3)
202
- type = ::Regexp.last_match(4)
203
- return if !length || !indent || !ivar_name || !type
204
-
205
- ivar_memo = memo.class_memo(class_node).ivar_memo(ivar_name.to_sym)
206
- ivar_memo.type = type
207
- ivar_memo.attr_kind = attr_kind if attr_kind
208
-
209
- generation[line_offset, length] = "#{indent}# @rbs @#{ivar_name}: #{Memo.unify_type(type)}"
210
- end
211
- end
212
- end
213
- 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.class_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.classes_memo.each_value do |class_memo|
21
- ivars_memo = class_memo.ivars_memo.dup
22
- class_node = root_node.class_node_at(class_memo.offset) || raise(RubyModKit::Error)
23
- attr_adding_line = 0
24
- class_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 = class_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 class_node.body_node
58
- first_line = generation.line(class_node.body_node)
59
- indent = first_line[/\A\s*/] || raise(RubyModKit::Error)
60
- else
61
- class_line = generation.line(class_node)
62
- indent = " #{class_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,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # rbs_inline: enabled
4
-
5
- module RubyModKit
6
- class Node
7
- # Transpiler program node
8
- class ClassNode < Node
9
- # @rbs @prism_node: Prism::ClassNode
10
- # @rbs @body_node: nil | Node::StatementsNode
11
- # @rbs @parent: Node
12
-
13
- attr_reader :prism_node #: Prism::ClassNode
14
- attr_reader :body_node #: nil | Node::StatementsNode
15
- attr_reader :parent #: Node
16
-
17
- # @rbs prism_node: Prism::ClassNode
18
- # @rbs parent: Node
19
- # @rbs return: void
20
- def initialize(prism_node, parent:)
21
- @prism_node = prism_node
22
- @parent = parent
23
- raise RubyModKit::Error unless prism_node.is_a?(Prism::ClassNode)
24
-
25
- super()
26
- end
27
-
28
- # @rbs child_prism_node: Prism::Node
29
- # @rbs return: Node
30
- def wrap(child_prism_node)
31
- node = super
32
- @body_node = node if child_prism_node == prism_node.body && node.is_a?(Node::StatementsNode)
33
- node
34
- end
35
- end
36
- end
37
- 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/class.rb with RBS::Inline
2
-
3
- module RubyModKit
4
- class Memo
5
- # The memo for parameter type
6
- class Class < OffsetMemo
7
- @ivars_memo: Hash[Symbol, Memo::Ivar]
8
-
9
- attr_reader ivars_memo: Hash[Symbol, Memo::Ivar]
10
-
11
- # @rbs class_node: Node::ClassNode
12
- # @rbs return: void
13
- def initialize: (Node::ClassNode class_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