ruby_mod_kit 0.0.3 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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