ruby_mod_kit 0.0.3 → 0.0.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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby_mod_kit.yml +5 -0
  3. data/README.md +89 -0
  4. data/lib/ruby_mod_kit/cli.rb +17 -2
  5. data/lib/ruby_mod_kit/config.rb +53 -0
  6. data/lib/ruby_mod_kit/core_ext/eval.rb +6 -10
  7. data/lib/ruby_mod_kit/corrector.rb +4 -3
  8. data/lib/ruby_mod_kit/corrector_manager.rb +18 -18
  9. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +5 -7
  10. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +4 -11
  11. data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +8 -12
  12. data/lib/ruby_mod_kit/feature/type/check/arguments/add_arguments_checker_mission.rb +56 -0
  13. data/lib/ruby_mod_kit/feature/type/check/arguments.rb +23 -0
  14. data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +20 -12
  15. data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +35 -19
  16. data/lib/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rb +49 -0
  17. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +12 -7
  18. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +7 -8
  19. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +6 -9
  20. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +9 -10
  21. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +5 -7
  22. data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +3 -0
  23. data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +5 -6
  24. data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +13 -17
  25. data/lib/ruby_mod_kit/feature/type/yard/type_parameter_mission.rb +35 -0
  26. data/lib/ruby_mod_kit/feature/type/yard/type_return_mission.rb +30 -0
  27. data/lib/ruby_mod_kit/feature/type/yard.rb +31 -0
  28. data/lib/ruby_mod_kit/feature.rb +0 -6
  29. data/lib/ruby_mod_kit/generation.rb +83 -39
  30. data/lib/ruby_mod_kit/memo/ivar_memo.rb +4 -0
  31. data/lib/ruby_mod_kit/memo/overload_memo.rb +1 -0
  32. data/lib/ruby_mod_kit/memo/parameter_memo.rb +4 -2
  33. data/lib/ruby_mod_kit/memo.rb +0 -2
  34. data/lib/ruby_mod_kit/memo_pad.rb +9 -0
  35. data/lib/ruby_mod_kit/mission.rb +1 -8
  36. data/lib/ruby_mod_kit/node/base_node.rb +39 -12
  37. data/lib/ruby_mod_kit/node/begin_node.rb +31 -0
  38. data/lib/ruby_mod_kit/node/call_node.rb +1 -1
  39. data/lib/ruby_mod_kit/node/def_node.rb +1 -1
  40. data/lib/ruby_mod_kit/node/def_parent_node.rb +13 -6
  41. data/lib/ruby_mod_kit/node/parameter_node.rb +3 -3
  42. data/lib/ruby_mod_kit/node/program_node.rb +6 -1
  43. data/lib/ruby_mod_kit/node/statements_node.rb +1 -1
  44. data/lib/ruby_mod_kit/node/symbol_node.rb +2 -1
  45. data/lib/ruby_mod_kit/node/untyped_node.rb +1 -1
  46. data/lib/ruby_mod_kit/node/wrap.rb +3 -1
  47. data/lib/ruby_mod_kit/node.rb +1 -2
  48. data/lib/ruby_mod_kit/version.rb +1 -1
  49. data/lib/ruby_mod_kit.rb +11 -11
  50. data/ruby_mod_kit.gemspec +7 -1
  51. data/sig/generated/ruby_mod_kit/cli.rbs +5 -0
  52. data/sig/generated/ruby_mod_kit/config.rbs +21 -0
  53. data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +4 -2
  54. data/sig/generated/ruby_mod_kit/corrector.rbs +4 -3
  55. data/sig/generated/ruby_mod_kit/corrector_manager.rbs +3 -7
  56. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +1 -3
  57. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +1 -8
  58. data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +1 -4
  59. data/sig/generated/ruby_mod_kit/feature/type/check/arguments/add_arguments_checker_mission.rbs +16 -0
  60. data/sig/generated/ruby_mod_kit/feature/type/check/arguments.rbs +15 -0
  61. data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +7 -3
  62. data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +8 -9
  63. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rbs +21 -0
  64. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +1 -4
  65. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +1 -4
  66. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +1 -4
  67. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +1 -4
  68. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +1 -4
  69. data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +1 -3
  70. data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +3 -4
  71. data/sig/generated/ruby_mod_kit/feature/type/yard/type_parameter_mission.rbs +16 -0
  72. data/sig/generated/ruby_mod_kit/feature/type/yard/type_return_mission.rbs +16 -0
  73. data/sig/generated/ruby_mod_kit/feature/type/yard.rbs +17 -0
  74. data/sig/generated/ruby_mod_kit/feature.rbs +0 -4
  75. data/sig/generated/ruby_mod_kit/generation.rbs +55 -15
  76. data/sig/generated/ruby_mod_kit/memo/ivar_memo.rbs +8 -0
  77. data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +2 -0
  78. data/sig/generated/ruby_mod_kit/memo/parameter_memo.rbs +6 -2
  79. data/sig/generated/ruby_mod_kit/memo_pad.rbs +8 -0
  80. data/sig/generated/ruby_mod_kit/mission.rbs +1 -8
  81. data/sig/generated/ruby_mod_kit/node/base_node.rbs +22 -8
  82. data/sig/generated/ruby_mod_kit/node/begin_node.rbs +26 -0
  83. data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +5 -0
  84. data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +1 -1
  85. data/sig/generated/ruby_mod_kit/node/program_node.rbs +3 -0
  86. data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +2 -0
  87. data/sig/generated/ruby_mod_kit.rbs +6 -3
  88. data/sig/yaml.rbs +3 -0
  89. metadata +21 -5
  90. data/sig/generated/ruby_mod_kit/memo.rbs +0 -7
  91. data/sig/generated/ruby_mod_kit/node.rbs +0 -7
@@ -5,7 +5,6 @@
5
5
  module RubyModKit
6
6
  # The class of transpiler generation.
7
7
  class Generation
8
- # @rbs @parse_result: Prism::ParseResult
9
8
  # @rbs @script: String
10
9
  # @rbs @missions: Array[Mission]
11
10
  # @rbs @memo_pad: MemoPad
@@ -15,36 +14,46 @@ module RubyModKit
15
14
  # @rbs @filename: String | nil
16
15
  # @rbs @corrector_manager: CorrectorManager
17
16
  # @rbs @features: Array[Feature]
17
+ # @rbs @config: Config
18
+ # @rbs @errors: Array[Prism::ParseError]
19
+ # @rbs @lines: Array[String]
20
+ # @rbs @offsets: Array[Integer]
21
+ # @rbs @source: String
18
22
 
19
- attr_reader :parse_result #: Prism::ParseResult
20
23
  attr_reader :script #: String
24
+ attr_reader :memo_pad #: MemoPad
25
+ attr_reader :root_node #: Node::ProgramNode
26
+ attr_reader :errors #: Array[Prism::ParseError]
27
+ attr_reader :lines #: Array[String]
28
+ attr_reader :offsets #: Array[Integer]
21
29
 
22
30
  # @rbs script: String
23
31
  # @rbs missions: Array[Mission]
24
32
  # @rbs memo_pad: MemoPad | nil
25
33
  # @rbs generation_num: Integer
34
+ # @rbs config: Config | nil
26
35
  # @rbs filename: String | nil
27
36
  # @rbs corrector_manager: CorrectorManager | nil
28
37
  # @rbs features: Array[Feature] | nil
29
38
  # @rbs return: void
30
- def initialize(script, missions: [], memo_pad: nil, generation_num: 0,
39
+ def initialize(script, missions: [], memo_pad: nil, generation_num: 0, config: nil,
31
40
  filename: nil, corrector_manager: nil, features: nil)
32
41
  @script = script
33
42
  @missions = missions
34
43
  @generation_num = generation_num
35
44
  @filename = filename
36
- @features = features || [
37
- Feature::InstanceVariableParameter.new,
38
- Feature::Overload.new,
39
- Feature::Type.new,
40
- Feature::Type::RbsInline.new,
41
- ].sort
45
+ @config = config || Config.new
46
+ @features = features || @config.features
42
47
 
43
48
  @memo_pad = memo_pad || MemoPad.new
44
49
  @corrector_manager = corrector_manager || CorrectorManager.new(@features)
45
50
  @offset_diff = OffsetDiff.new
46
- @parse_result = Prism.parse(@script)
47
- @root_node = Node::ProgramNode.new(@parse_result.value)
51
+ parse_result = Prism.parse(@script)
52
+ @errors = parse_result.errors
53
+ @lines = parse_result.source.lines
54
+ @offsets = parse_result.source.offsets
55
+ @source = @script.dup
56
+ @root_node = Node::ProgramNode.new(parse_result.value)
48
57
  init_missions
49
58
  end
50
59
 
@@ -66,14 +75,11 @@ module RubyModKit
66
75
 
67
76
  # @rbs return: Generation
68
77
  def succ
69
- if @parse_result.errors.empty?
78
+ if @errors.empty?
70
79
  perform_missions
71
80
  else
72
81
  perform_corrector
73
82
  end
74
- @missions.each do |mission|
75
- mission.succ(@offset_diff)
76
- end
77
83
  @memo_pad.succ(@offset_diff)
78
84
 
79
85
  Generation.new(
@@ -84,6 +90,7 @@ module RubyModKit
84
90
  filename: @filename,
85
91
  corrector_manager: @corrector_manager,
86
92
  features: @features,
93
+ config: @config,
87
94
  )
88
95
  end
89
96
 
@@ -94,7 +101,7 @@ module RubyModKit
94
101
 
95
102
  # @rbs return: bool
96
103
  def completed?
97
- @parse_result.errors.empty? && @missions.empty?
104
+ @errors.empty? && @missions.empty?
98
105
  end
99
106
 
100
107
  # @rbs src_offset: Integer
@@ -107,18 +114,10 @@ module RubyModKit
107
114
  @offset_diff.insert(src_offset, diff)
108
115
  end
109
116
 
110
- # @rbs src_range: Range[Integer]
117
+ # @rbs src_range: Range[Integer | nil]
111
118
  # @rbs return: String
112
119
  def [](src_range)
113
- dst_range = Range.new(@offset_diff[src_range.first], @offset_diff[src_range.last], src_range.exclude_end?)
114
- @script[dst_range] || raise(RubyModKit::Error, "Invalid range")
115
- end
116
-
117
- # @rbs offset: Integer
118
- # @rbs return: String
119
- def line_by_offset(offset)
120
- offset = @offset_diff[offset]
121
- (@script.match(/.*\n?/, offset) && Regexp.last_match(0)) || raise(RubyModKit::Error)
120
+ @source[src_range] || raise(RubyModKit::Error, "Invalid range")
122
121
  end
123
122
 
124
123
  # @rbs (Integer) -> String
@@ -138,53 +137,97 @@ module RubyModKit
138
137
  # @rbs line_num: Integer
139
138
  # @rbs return: String
140
139
  def line__overload0(line_num)
141
- line_by_offset(@parse_result.source.offsets[line_num])
140
+ @lines[line_num] || raise(RubyModKit::Error)
142
141
  end
143
142
 
144
143
  # @rbs node: Node::BaseNode
145
144
  # @rbs return: String
146
145
  def line__overload1(node)
147
- line(node.prism_node.location.start_line - 1)
146
+ line(node.location.start_line - 1)
148
147
  end
149
148
 
150
149
  # @rbs parse_error: Prism::ParseError
151
150
  # @rbs return: String
152
151
  def line__overload2(parse_error)
153
152
  line(parse_error.location.start_line - 1)
153
+ rescue RubyModKit::Error
154
+ ""
154
155
  end
155
156
 
156
157
  # @rbs (Integer) -> (Integer | nil)
158
+ # | (Node::BaseNode) -> (Integer | nil)
159
+ # | (Node::BaseNode, Integer) -> (Integer | nil)
157
160
  # | (Prism::ParseError) -> (Integer | nil)
158
- def src_offset(*args)
161
+ def line_offset(*args)
159
162
  case args
160
163
  in [Integer]
161
- src_offset__overload0(*args)
164
+ line_offset__overload0(*args)
165
+ in [Node::BaseNode]
166
+ line_offset__overload1(*args)
167
+ in [Node::BaseNode, Integer]
168
+ line_offset__overload2(*args)
162
169
  in [Prism::ParseError]
163
- src_offset__overload1(*args)
170
+ line_offset__overload3(*args)
164
171
  end
165
172
  end
166
173
 
167
174
  # @rbs line_num: Integer
168
175
  # @rbs return: Integer | nil
169
- def src_offset__overload0(line_num)
170
- parse_result.source.offsets[line_num]
176
+ def line_offset__overload0(line_num)
177
+ @offsets[line_num]
178
+ end
179
+
180
+ # @rbs node: Node::BaseNode
181
+ # @rbs return: Integer | nil
182
+ def line_offset__overload1(node)
183
+ line_offset(node, 0)
184
+ end
185
+
186
+ # @rbs node: Node::BaseNode
187
+ # @rbs line_offset: Integer
188
+ # @rbs return: Integer | nil
189
+ def line_offset__overload2(node, line_offset)
190
+ line_offset(node.location.start_line - 1 + line_offset)
171
191
  end
172
192
 
173
193
  # @rbs parse_error: Prism::ParseError
174
194
  # @rbs return: Integer | nil
175
- def src_offset__overload1(parse_error)
176
- src_offset(parse_error.location.start_line - 1)
195
+ def line_offset__overload3(parse_error)
196
+ line_offset(parse_error.location.start_line - 1)
197
+ end
198
+
199
+ # @rbs (Integer) -> String
200
+ # | (Node::BaseNode) -> String
201
+ def line_indent(*args)
202
+ case args
203
+ in [Integer]
204
+ line_indent__overload0(*args)
205
+ in [Node::BaseNode]
206
+ line_indent__overload1(*args)
207
+ end
208
+ end
209
+
210
+ # @rbs line_num: Integer
211
+ # @rbs return: String
212
+ def line_indent__overload0(line_num)
213
+ line(line_num)[/\A[ \t]*/] || ""
214
+ end
215
+
216
+ # @rbs node: Node::BaseNode
217
+ # @rbs return: String
218
+ def line_indent__overload1(node)
219
+ line_indent(node.location.start_line - 1)
177
220
  end
178
221
 
179
222
  # @rbs return: void
180
223
  def perform_corrector
181
- @corrector_manager.perform(self, @root_node, @parse_result, @memo_pad)
224
+ @corrector_manager.perform(self)
182
225
  end
183
226
 
184
227
  # @rbs return: void
185
228
  def perform_missions
186
229
  @missions.delete_if do |mission|
187
- mission.perform(self, @root_node, @parse_result, @memo_pad) || break
230
+ mission.perform(self) || break
188
231
  end
189
232
  end
190
233
 
@@ -197,9 +240,10 @@ module RubyModKit
197
240
  class << self
198
241
  # @rbs src: String
199
242
  # @rbs filename: String | nil
243
+ # @rbs config: Config | nil
200
244
  # @rbs return: Generation
201
- def resolve(src, filename: nil)
202
- generation = Generation.new(src.dup, filename: filename)
245
+ def resolve(src, filename: nil, config: nil)
246
+ generation = Generation.new(src.dup, filename: filename, config: config)
203
247
  generation = generation.succ until generation.completed?
204
248
  generation
205
249
  end
@@ -11,11 +11,15 @@ module RubyModKit
11
11
  # @rbs @offset: nil | Integer
12
12
  # @rbs @indent: String
13
13
  # @rbs @name: Symbol
14
+ # @rbs @visibility: nil | Symbol
15
+ # @rbs @separator: String
14
16
 
15
17
  attr_reader :type #: nil | String
16
18
  attr_reader :attr_kind #: nil | Symbol
17
19
  attr_accessor :offset #: nil | Integer
18
20
  attr_accessor :indent #: String
21
+ attr_accessor :visibility #: nil | Symbol
22
+ attr_accessor :separator #: String
19
23
 
20
24
  # @rbs name: Symbol
21
25
  # @rbs return: void
@@ -9,6 +9,7 @@ module RubyModKit
9
9
  # @rbs @name: Symbol
10
10
  # @rbs @overload_types: [[Array[String], String]]
11
11
  # @rbs @offset_corrected: bool
12
+ # @rbs @offset: Integer
12
13
 
13
14
  attr_reader :name #: Symbol
14
15
  attr_reader :overload_types #: [[Array[String], String]]
@@ -8,11 +8,13 @@ module RubyModKit
8
8
  class ParameterMemo < OffsetMemo
9
9
  # @rbs @type: String
10
10
  # @rbs @ivar_parameter: bool
11
- # @rbs @qualifier: String
11
+ # @rbs @qualifier: String | nil
12
+ # @rbs @name: Symbol
12
13
 
13
14
  attr_reader :type #: String
14
15
  attr_accessor :ivar_parameter #: bool
15
- attr_accessor :qualifier #: String
16
+ attr_accessor :qualifier #: String | nil
17
+ attr_accessor :name #: Symbol
16
18
 
17
19
  UNTYPED = "untyped"
18
20
 
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rbs_inline: enabled
4
-
5
3
  module RubyModKit
6
4
  # The namespace of transpiler memo.
7
5
  module Memo
@@ -9,11 +9,13 @@ module RubyModKit
9
9
  # @rbs @methods_memo: Hash[Integer, Memo::MethodMemo]
10
10
  # @rbs @parameters_memo: Hash[Integer, Memo::ParameterMemo]
11
11
  # @rbs @overloads_memo: Hash[Integer, Memo::OverloadMemo]
12
+ # @rbs @flags: Hash[Symbol, bool]
12
13
 
13
14
  attr_reader :def_parents_memo #: Hash[Integer, Memo::DefParentMemo]
14
15
  attr_reader :methods_memo #: Hash[Integer, Memo::MethodMemo]
15
16
  attr_reader :parameters_memo #: Hash[Integer, Memo::ParameterMemo]
16
17
  attr_reader :overloads_memo #: Hash[Integer, Memo::OverloadMemo]
18
+ attr_accessor :flags #: Hash[Symbol, bool]
17
19
 
18
20
  # @rbs return: void
19
21
  def initialize
@@ -21,6 +23,7 @@ module RubyModKit
21
23
  @methods_memo = {}
22
24
  @parameters_memo = {}
23
25
  @overloads_memo = {}
26
+ @flags = Hash.new(false)
24
27
  end
25
28
 
26
29
  # @rbs offset_diff: OffsetDiff
@@ -65,5 +68,11 @@ module RubyModKit
65
68
 
66
69
  method_memo(def_node).add_parameter(memo)
67
70
  end
71
+
72
+ # @rbs &block: (Memo::ParameterMemo) -> void
73
+ # @rbs return: void
74
+ def each_parameter_memo(&block)
75
+ parameters_memo.each_value(&block)
76
+ end
68
77
  end
69
78
  end
@@ -6,16 +6,9 @@ module RubyModKit
6
6
  # The base class of transpiler mission.
7
7
  class Mission
8
8
  # @rbs _generation: Generation
9
- # @rbs _root_node: Node::ProgramNode
10
- # @rbs _parse_result: Prism::ParseResult
11
- # @rbs _memo_pad: MemoPad
12
9
  # @rbs return: void
13
- def perform(_generation, _root_node, _parse_result, _memo_pad)
10
+ def perform(_generation)
14
11
  raise RubyModKit::Error, "Unexpected type #{self.class}"
15
12
  end
16
-
17
- # @rbs offset_diff: OffsetDiff
18
- # @rbs return: void
19
- def succ(offset_diff); end
20
13
  end
21
14
  end
@@ -11,11 +11,12 @@ module RubyModKit
11
11
  # @rbs @ancestors: Array[Node::BaseNode]
12
12
  # @rbs @prev: Node::BaseNode | nil
13
13
 
14
- attr_reader :location #: Prism::Location
15
14
  attr_reader :prev #: Node::BaseNode | nil
16
15
 
17
- # @rbs return: void
18
- def initialize
16
+ # @rbs return: Prism::Location
17
+ def location
18
+ return @location if defined?(@location)
19
+
19
20
  @location = prism_node.location
20
21
  end
21
22
 
@@ -25,15 +26,22 @@ module RubyModKit
25
26
 
26
27
  prev = nil
27
28
  @children = prism_node.child_nodes.compact.map do |prism_child_node|
28
- prev = Node.wrap(prism_child_node, parent: self, prev: prev)
29
+ prev = wrap(prism_child_node, prev: prev)
29
30
  end
30
31
  end
31
32
 
33
+ # @rbs prism_node: Prism::Node
34
+ # @rbs prev: Node::BaseNode | nil
35
+ # @rbs return: Node::BaseNode
36
+ def wrap(prism_node, prev: nil)
37
+ Node.wrap(prism_node, parent: self, prev: prev)
38
+ end
39
+
32
40
  # @rbs return: Array[Node::BaseNode]
33
41
  def ancestors
34
42
  return @ancestors if @ancestors
35
43
 
36
- parent = @parent
44
+ parent = self.parent
37
45
  @ancestors = if parent
38
46
  [parent] + parent.ancestors
39
47
  else
@@ -41,6 +49,11 @@ module RubyModKit
41
49
  end
42
50
  end
43
51
 
52
+ # @rbs return: nil | BaseNode
53
+ def parent
54
+ raise(RubyModKit::Error)
55
+ end
56
+
44
57
  # @rbs return: Symbol
45
58
  def name
46
59
  raise(RubyModKit::Error, "Expected ParameterNode but #{self.class}:#{prism_node.inspect}")
@@ -80,10 +93,14 @@ module RubyModKit
80
93
  end
81
94
 
82
95
  # @rbs offset: Integer
96
+ # @rbs allowed: Array[Class] | nil
83
97
  # @rbs return: Node::DefParentNode | nil
84
- def def_parent_node_at(offset)
98
+ def def_parent_node_at(offset, allowed: nil)
85
99
  node = node_at(offset) || return
86
- [node, *node.ancestors].each { return _1 if _1.is_a?(Node::DefParentNode) }
100
+ [node, *node.ancestors].each do |ancestor_node|
101
+ return ancestor_node if ancestor_node.is_a?(Node::DefParentNode)
102
+ return nil if allowed && !allowed.include?(ancestor_node.class)
103
+ end
87
104
  nil
88
105
  end
89
106
 
@@ -93,16 +110,16 @@ module RubyModKit
93
110
  self.offset <= offset && offset <= prism_node.location.end_offset
94
111
  end
95
112
 
96
- # @rbs return: Prism::Node & Prism::_Node
97
- def prism_node
98
- raise RubyModKit::Error
99
- end
100
-
101
113
  # @rbs return: Integer
102
114
  def offset
103
115
  location.start_offset
104
116
  end
105
117
 
118
+ # @rbs return: String
119
+ def slice
120
+ location.slice
121
+ end
122
+
106
123
  # @rbs return: String
107
124
  def inspect
108
125
  str = +"#<#{self.class} "
@@ -132,6 +149,16 @@ module RubyModKit
132
149
  str << ">"
133
150
  str
134
151
  end
152
+
153
+ private
154
+
155
+ # :nocov:
156
+ # This is just for interface definition, must not be called
157
+ # @rbs return: Prism::Node & Prism::_Node
158
+ def prism_node
159
+ raise RubyModKit::Error
160
+ end
161
+ # :nocov:
135
162
  end
136
163
  end
137
164
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rbs_inline: enabled
4
+
5
+ module RubyModKit
6
+ module Node
7
+ # Transpiler program node
8
+ class BeginNode < Node::BaseNode
9
+ # @rbs @prism_node: Prism::BeginNode
10
+ # @rbs @parent: Node::BaseNode
11
+ # @rbs @prev: Node::BaseNode | nil
12
+
13
+ private attr_reader :prism_node #: Prism::BeginNode
14
+ attr_reader :parent #: Node::BaseNode
15
+ attr_reader :prev #: Node::BaseNode | nil
16
+
17
+ # @rbs prism_node: Prism::BeginNode
18
+ # @rbs parent: Node::BaseNode
19
+ # @rbs prev: Node::BaseNode | nil
20
+ # @rbs return: void
21
+ def initialize(prism_node, parent:, prev: nil)
22
+ @prism_node = prism_node
23
+ @parent = parent
24
+ @prev = prev
25
+ raise RubyModKit::Error unless prism_node.is_a?(Prism::BeginNode)
26
+
27
+ super()
28
+ end
29
+ end
30
+ end
31
+ end
@@ -11,7 +11,7 @@ module RubyModKit
11
11
  # @rbs @parent: Node::BaseNode
12
12
  # @rbs @prev: Node::BaseNode | nil
13
13
 
14
- attr_reader :prism_node #: Prism::CallNode
14
+ private attr_reader :prism_node #: Prism::CallNode
15
15
  attr_reader :name #: Symbol
16
16
  attr_reader :parent #: Node::BaseNode
17
17
  attr_reader :prev #: Node::BaseNode | nil
@@ -10,7 +10,7 @@ module RubyModKit
10
10
  # @rbs @parent: Node::BaseNode
11
11
  # @rbs @prev: Node::BaseNode | nil
12
12
 
13
- attr_reader :prism_node #: Prism::DefNode
13
+ private attr_reader :prism_node #: Prism::DefNode
14
14
  attr_reader :parent #: Node::BaseNode
15
15
  attr_reader :prev #: Node::BaseNode | nil
16
16
 
@@ -11,7 +11,7 @@ module RubyModKit
11
11
  # @rbs @parent: Node::BaseNode
12
12
  # @rbs @prev: Node::BaseNode | nil
13
13
 
14
- attr_reader :prism_node #: Prism::ClassNode | Prism::ModuleNode
14
+ private attr_reader :prism_node #: Prism::ClassNode | Prism::ModuleNode
15
15
  attr_reader :parent #: Node::BaseNode
16
16
  attr_reader :prev #: Node::BaseNode | nil
17
17
 
@@ -28,13 +28,20 @@ module RubyModKit
28
28
  super()
29
29
  end
30
30
 
31
+ # @rbs prism_child_node: Prism::Node
32
+ # @rbs prev: Node::BaseNode | nil
33
+ # @rbs return: Node::BaseNode
34
+ def wrap(prism_child_node, prev: nil)
35
+ child_node = super
36
+ @body_node = child_node if prism_child_node == @prism_node.body && child_node.is_a?(Node::StatementsNode)
37
+ child_node
38
+ end
39
+
31
40
  # @rbs return: nil | Node::StatementsNode
32
41
  def body_node
33
- return @body_node if defined?(@body_node)
34
-
35
- body_node = children.find { |node| node.prism_node == @prism_node.body }
36
- body_node = nil unless body_node.is_a?(Node::StatementsNode)
37
- @body_node = body_node
42
+ # body_node will be set in #children
43
+ children
44
+ @body_node
38
45
  end
39
46
  end
40
47
  end
@@ -13,9 +13,9 @@ module RubyModKit
13
13
  # @rbs!
14
14
  # type prism_node = Prism::RequiredParameterNode | Prism::OptionalKeywordParameterNode
15
15
  # | Prism::OptionalParameterNode | Prism::RequiredKeywordParameterNode
16
- # | Prism::RestParameterNode
16
+ # | Prism::RestParameterNode | Prism::BlockParameterNode
17
17
 
18
- attr_reader :prism_node #: prism_node
18
+ private attr_reader :prism_node #: prism_node
19
19
  attr_reader :parent #: Node::BaseNode
20
20
  attr_reader :prev #: Node::BaseNode | nil
21
21
 
@@ -30,7 +30,7 @@ module RubyModKit
30
30
  case prism_node
31
31
  when Prism::RequiredParameterNode, Prism::OptionalKeywordParameterNode,
32
32
  Prism::OptionalParameterNode, Prism::RequiredKeywordParameterNode,
33
- Prism::RestParameterNode
33
+ Prism::RestParameterNode, Prism::BlockParameterNode
34
34
  super()
35
35
  else
36
36
  raise RubyModKit::Error, "unexpected prism node #{prism_node.class}"
@@ -8,7 +8,7 @@ module RubyModKit
8
8
  class ProgramNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::ProgramNode
10
10
 
11
- attr_reader :prism_node #: Prism::ProgramNode
11
+ private attr_reader :prism_node #: Prism::ProgramNode
12
12
 
13
13
  # @rbs prism_node: Prism::ProgramNode
14
14
  # @rbs return: void
@@ -18,6 +18,11 @@ module RubyModKit
18
18
 
19
19
  super()
20
20
  end
21
+
22
+ # @rbs return: nil
23
+ def parent
24
+ nil
25
+ end
21
26
  end
22
27
  end
23
28
  end
@@ -10,7 +10,7 @@ module RubyModKit
10
10
  # @rbs @parent: Node::BaseNode
11
11
  # @rbs @prev: Node::BaseNode | nil
12
12
 
13
- attr_reader :prism_node #: Prism::StatementsNode
13
+ private attr_reader :prism_node #: Prism::StatementsNode
14
14
  attr_reader :parent #: Node::BaseNode
15
15
  attr_reader :prev #: Node::BaseNode | nil
16
16
 
@@ -9,8 +9,9 @@ module RubyModKit
9
9
  # @rbs @prism_node: Prism::SymbolNode
10
10
  # @rbs @parent: Node::BaseNode
11
11
  # @rbs @prev: Node::BaseNode | nil
12
+ # @rbs @value: nil | Symbol
12
13
 
13
- attr_reader :prism_node #: Prism::SymbolNode
14
+ private attr_reader :prism_node #: Prism::SymbolNode
14
15
  attr_reader :parent #: Node::BaseNode
15
16
  attr_reader :prev #: Node::BaseNode | nil
16
17
 
@@ -10,7 +10,7 @@ module RubyModKit
10
10
  # @rbs @parent: Node::BaseNode
11
11
  # @rbs @prev: Node::BaseNode | nil
12
12
 
13
- attr_reader :prism_node #: Prism::Node
13
+ private attr_reader :prism_node #: Prism::Node
14
14
  attr_reader :parent #: Node::BaseNode
15
15
  attr_reader :prev #: Node::BaseNode | nil
16
16
 
@@ -20,6 +20,8 @@ module RubyModKit
20
20
  # @rbs return: Node::BaseNode
21
21
  def wrap(prism_node, parent:, prev: nil)
22
22
  case prism_node
23
+ when Prism::BeginNode
24
+ Node::BeginNode.new(prism_node, parent: parent, prev: prev)
23
25
  when Prism::CallNode
24
26
  Node::CallNode.new(prism_node, parent: parent, prev: prev)
25
27
  when Prism::DefNode
@@ -28,7 +30,7 @@ module RubyModKit
28
30
  Node::DefParentNode.new(prism_node, parent: parent, prev: prev)
29
31
  when Prism::RequiredParameterNode, Prism::OptionalKeywordParameterNode,
30
32
  Prism::OptionalParameterNode, Prism::RequiredKeywordParameterNode,
31
- Prism::RestParameterNode
33
+ Prism::RestParameterNode, Prism::BlockParameterNode
32
34
  Node::ParameterNode.new(prism_node, parent: parent, prev: prev)
33
35
  when Prism::StatementsNode
34
36
  Node::StatementsNode.new(prism_node, parent: parent, prev: prev)
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rbs_inline: enabled
4
-
5
3
  module RubyModKit
6
4
  # The namespace of transpile node.
7
5
  module Node
@@ -9,6 +7,7 @@ module RubyModKit
9
7
  end
10
8
 
11
9
  require_relative "node/base_node"
10
+ require_relative "node/begin_node"
12
11
  require_relative "node/symbol_node"
13
12
  require_relative "node/def_parent_node"
14
13
  require_relative "node/call_node"
@@ -3,5 +3,5 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- VERSION = "0.0.3" #: String
6
+ VERSION = "0.0.5" #: String
7
7
  end