ruby_mod_kit 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. data/lib/ruby_mod_kit/core_ext/eval.rb +6 -0
  3. data/lib/ruby_mod_kit/core_ext/load.rb +12 -4
  4. data/lib/ruby_mod_kit/core_ext.rb +2 -2
  5. data/lib/ruby_mod_kit/corrector.rb +22 -0
  6. data/lib/ruby_mod_kit/corrector_manager.rb +68 -0
  7. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +42 -0
  8. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +49 -0
  9. data/lib/ruby_mod_kit/feature/instance_variable_parameter.rb +27 -0
  10. data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +80 -0
  11. data/lib/ruby_mod_kit/feature/overload.rb +19 -0
  12. data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +49 -0
  13. data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +90 -0
  14. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +41 -0
  15. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +31 -0
  16. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +43 -0
  17. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +38 -0
  18. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +32 -0
  19. data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +29 -0
  20. data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +45 -0
  21. data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +67 -0
  22. data/lib/ruby_mod_kit/feature/type.rb +31 -0
  23. data/lib/ruby_mod_kit/feature.rb +24 -0
  24. data/lib/ruby_mod_kit/generation.rb +60 -22
  25. data/lib/ruby_mod_kit/memo/def_parent_memo.rb +36 -0
  26. data/lib/ruby_mod_kit/memo/{ivar.rb → ivar_memo.rb} +17 -3
  27. data/lib/ruby_mod_kit/memo/{method.rb → method_memo.rb} +7 -7
  28. data/lib/ruby_mod_kit/memo/offset_memo.rb +1 -1
  29. data/lib/ruby_mod_kit/memo/overload_memo.rb +46 -0
  30. data/lib/ruby_mod_kit/memo/{parameter.rb → parameter_memo.rb} +3 -3
  31. data/lib/ruby_mod_kit/memo.rb +7 -64
  32. data/lib/ruby_mod_kit/memo_pad.rb +69 -0
  33. data/lib/ruby_mod_kit/mission.rb +5 -24
  34. data/lib/ruby_mod_kit/node/base_node.rb +137 -0
  35. data/lib/ruby_mod_kit/node/call_node.rb +10 -6
  36. data/lib/ruby_mod_kit/node/def_node.rb +10 -6
  37. data/lib/ruby_mod_kit/node/def_parent_node.rb +17 -13
  38. data/lib/ruby_mod_kit/node/parameter_node.rb +12 -8
  39. data/lib/ruby_mod_kit/node/program_node.rb +2 -2
  40. data/lib/ruby_mod_kit/node/statements_node.rb +10 -6
  41. data/lib/ruby_mod_kit/node/symbol_node.rb +10 -6
  42. data/lib/ruby_mod_kit/node/untyped_node.rb +10 -6
  43. data/lib/ruby_mod_kit/node/wrap.rb +43 -0
  44. data/lib/ruby_mod_kit/node.rb +4 -148
  45. data/lib/ruby_mod_kit/version.rb +1 -1
  46. data/lib/ruby_mod_kit.rb +17 -3
  47. data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +3 -0
  48. data/sig/generated/ruby_mod_kit/core_ext/load.rbs +7 -4
  49. data/sig/generated/ruby_mod_kit/corrector.rbs +16 -0
  50. data/sig/generated/ruby_mod_kit/corrector_manager.rbs +26 -0
  51. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +20 -0
  52. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +21 -0
  53. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter.rbs +14 -0
  54. data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +24 -0
  55. data/sig/generated/ruby_mod_kit/feature/overload.rbs +11 -0
  56. data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +20 -0
  57. data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +39 -0
  58. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +19 -0
  59. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +19 -0
  60. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +19 -0
  61. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +19 -0
  62. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +19 -0
  63. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline.rbs +13 -0
  64. data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +20 -0
  65. data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +20 -0
  66. data/sig/generated/ruby_mod_kit/feature/type.rbs +14 -0
  67. data/sig/generated/ruby_mod_kit/feature.rbs +16 -0
  68. data/sig/generated/ruby_mod_kit/generation.rbs +25 -10
  69. data/sig/generated/ruby_mod_kit/memo/def_parent_memo.rbs +24 -0
  70. data/sig/generated/ruby_mod_kit/memo/{ivar.rbs → ivar_memo.rbs} +15 -3
  71. data/sig/generated/ruby_mod_kit/memo/{method.rbs → method_memo.rbs} +8 -8
  72. data/sig/generated/ruby_mod_kit/memo/offset_memo.rbs +1 -1
  73. data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +32 -0
  74. data/sig/generated/ruby_mod_kit/memo/{parameter.rbs → parameter_memo.rbs} +3 -3
  75. data/sig/generated/ruby_mod_kit/memo.rbs +2 -36
  76. data/sig/generated/ruby_mod_kit/memo_pad.rbs +46 -0
  77. data/sig/generated/ruby_mod_kit/mission.rbs +4 -12
  78. data/sig/generated/ruby_mod_kit/node/base_node.rbs +65 -0
  79. data/sig/generated/ruby_mod_kit/node/call_node.rbs +11 -6
  80. data/sig/generated/ruby_mod_kit/node/def_node.rbs +11 -6
  81. data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +12 -10
  82. data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +13 -8
  83. data/sig/generated/ruby_mod_kit/node/program_node.rbs +2 -2
  84. data/sig/generated/ruby_mod_kit/node/statements_node.rbs +11 -6
  85. data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +11 -6
  86. data/sig/generated/ruby_mod_kit/node/untyped_node.rbs +11 -6
  87. data/sig/generated/ruby_mod_kit/node/wrap.rbs +12 -0
  88. data/sig/generated/ruby_mod_kit/node.rbs +2 -58
  89. data/sig/generated/ruby_mod_kit.rbs +4 -0
  90. metadata +56 -27
  91. data/lib/ruby_mod_kit/memo/def_parent.rb +0 -27
  92. data/lib/ruby_mod_kit/mission/fix_parse_error.rb +0 -216
  93. data/lib/ruby_mod_kit/mission/ivar_arg.rb +0 -42
  94. data/lib/ruby_mod_kit/mission/overload.rb +0 -73
  95. data/lib/ruby_mod_kit/mission/type_attr.rb +0 -75
  96. data/lib/ruby_mod_kit/mission/type_parameter.rb +0 -39
  97. data/lib/ruby_mod_kit/mission/type_return.rb +0 -33
  98. data/lib/ruby_mod_kit/transpiler.rb +0 -20
  99. data/sig/generated/examples/user.rbs +0 -60
  100. data/sig/generated/ruby_mod_kit/memo/def_parent.rbs +0 -20
  101. data/sig/generated/ruby_mod_kit/memo/located.rbs +0 -14
  102. data/sig/generated/ruby_mod_kit/memo/parameter_type.rbs +0 -14
  103. data/sig/generated/ruby_mod_kit/mission/fix_parse_error.rbs +0 -73
  104. data/sig/generated/ruby_mod_kit/mission/ivar_arg.rbs +0 -19
  105. data/sig/generated/ruby_mod_kit/mission/overload.rbs +0 -20
  106. data/sig/generated/ruby_mod_kit/mission/type_attr.rbs +0 -18
  107. data/sig/generated/ruby_mod_kit/mission/type_parameter.rbs +0 -18
  108. data/sig/generated/ruby_mod_kit/mission/type_return.rbs +0 -18
  109. data/sig/generated/ruby_mod_kit/transpiler.rbs +0 -11
@@ -3,71 +3,14 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- # The class of transpiler generation.
7
- class Memo
8
- # @rbs @def_parents_memo: Hash[Integer, Memo::DefParent]
9
- # @rbs @methods_memo: Hash[Integer, Memo::Method]
10
- # @rbs @parameters_memo: Hash[Integer, Memo::Parameter]
11
-
12
- attr_reader :def_parents_memo #: Hash[Integer, Memo::DefParent]
13
- attr_reader :methods_memo #: Hash[Integer, Memo::Method]
14
- attr_reader :parameters_memo #: Hash[Integer, Memo::Parameter]
15
-
16
- # @rbs return: void
17
- def initialize
18
- @def_parents_memo = {}
19
- @methods_memo = {}
20
- @parameters_memo = {}
21
- end
22
-
23
- # @rbs offset_diff: OffsetDiff
24
- # @rbs return: void
25
- def succ(offset_diff)
26
- [@methods_memo, @parameters_memo, @def_parents_memo].each do |offset_node_memo|
27
- new_offset_node_memo = {}
28
- offset_node_memo.each_value do |node_memo|
29
- node_memo.succ(offset_diff)
30
- new_offset_node_memo[node_memo.offset] = node_memo
31
- end
32
- offset_node_memo.replace(new_offset_node_memo)
33
- end
34
- self
35
- end
36
-
37
- # @rbs def_parent_node: Node::DefParentNode
38
- # @rbs return: Memo::DefParent
39
- def def_parent_memo(def_parent_node)
40
- @def_parents_memo[def_parent_node.offset] ||= Memo::DefParent.new(def_parent_node)
41
- end
42
-
43
- # @rbs def_node: Node::DefNode
44
- # @rbs return: Memo::Method
45
- def method_memo(def_node)
46
- @methods_memo[def_node.offset] ||= Memo::Method.new(def_node)
47
- end
48
-
49
- # @rbs node: Node
50
- # @rbs return: Memo::Parameter
51
- def parameter_memo(node)
52
- memo = @parameters_memo[node.offset] ||= Memo::Parameter.new(node.offset)
53
- def_node = node.def_node_at(node.offset)
54
- raise RubyModKit::Error unless def_node.is_a?(Node::DefNode)
55
-
56
- method_memo(def_node).add_parameter(memo)
57
- end
58
-
59
- class << self
60
- # @rbs type: String
61
- # @rbs return: String
62
- def unify_type(type)
63
- type[/\A\(([^()]*)\)\z/, 1] || type
64
- end
65
- end
6
+ # The namespace of transpiler memo.
7
+ module Memo
66
8
  end
67
9
  end
68
10
 
69
11
  require_relative "memo/offset_memo"
70
- require_relative "memo/def_parent"
71
- require_relative "memo/ivar"
72
- require_relative "memo/method"
73
- require_relative "memo/parameter"
12
+ require_relative "memo/def_parent_memo"
13
+ require_relative "memo/ivar_memo"
14
+ require_relative "memo/method_memo"
15
+ require_relative "memo/overload_memo"
16
+ require_relative "memo/parameter_memo"
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rbs_inline: enabled
4
+
5
+ module RubyModKit
6
+ # The class for bundling memos.
7
+ class MemoPad
8
+ # @rbs @def_parents_memo: Hash[Integer, Memo::DefParentMemo]
9
+ # @rbs @methods_memo: Hash[Integer, Memo::MethodMemo]
10
+ # @rbs @parameters_memo: Hash[Integer, Memo::ParameterMemo]
11
+ # @rbs @overloads_memo: Hash[Integer, Memo::OverloadMemo]
12
+
13
+ attr_reader :def_parents_memo #: Hash[Integer, Memo::DefParentMemo]
14
+ attr_reader :methods_memo #: Hash[Integer, Memo::MethodMemo]
15
+ attr_reader :parameters_memo #: Hash[Integer, Memo::ParameterMemo]
16
+ attr_reader :overloads_memo #: Hash[Integer, Memo::OverloadMemo]
17
+
18
+ # @rbs return: void
19
+ def initialize
20
+ @def_parents_memo = {}
21
+ @methods_memo = {}
22
+ @parameters_memo = {}
23
+ @overloads_memo = {}
24
+ end
25
+
26
+ # @rbs offset_diff: OffsetDiff
27
+ # @rbs return: void
28
+ def succ(offset_diff)
29
+ [@methods_memo, @parameters_memo, @def_parents_memo, @overloads_memo].each do |offset_node_memo|
30
+ new_offset_node_memo = {}
31
+ offset_node_memo.each_value do |node_memo|
32
+ node_memo.succ(offset_diff)
33
+ new_offset_node_memo[node_memo.offset] = node_memo
34
+ end
35
+ offset_node_memo.replace(new_offset_node_memo)
36
+ end
37
+ self
38
+ end
39
+
40
+ # @rbs def_parent_node: Node::DefParentNode
41
+ # @rbs return: Memo::DefParentMemo
42
+ def def_parent_memo(def_parent_node)
43
+ @def_parents_memo[def_parent_node.offset] ||= Memo::DefParentMemo.new(def_parent_node)
44
+ end
45
+
46
+ # @rbs def_node: Node::DefNode
47
+ # @rbs return: Memo::MethodMemo
48
+ def method_memo(def_node)
49
+ @methods_memo[def_node.offset] ||= Memo::MethodMemo.new(def_node)
50
+ end
51
+
52
+ # @rbs offset: Integer
53
+ # @rbs name: Symbol
54
+ # @rbs return: Memo::OverloadMemo
55
+ def overload_memo(offset, name)
56
+ @overloads_memo[offset] ||= Memo::OverloadMemo.new(offset, name)
57
+ end
58
+
59
+ # @rbs node: Node::BaseNode
60
+ # @rbs return: Memo::ParameterMemo
61
+ def parameter_memo(node)
62
+ memo = @parameters_memo[node.offset] ||= Memo::ParameterMemo.new(node.offset)
63
+ def_node = node.def_node_at(node.offset)
64
+ raise RubyModKit::Error unless def_node.is_a?(Node::DefNode)
65
+
66
+ method_memo(def_node).add_parameter(memo)
67
+ end
68
+ end
69
+ end
@@ -3,38 +3,19 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- # The class of transpiler mission.
6
+ # The base class of transpiler mission.
7
7
  class Mission
8
- # @rbs @offset: Integer
9
-
10
- attr_accessor :offset #: Integer
11
-
12
- # @rbs offset: Integer
13
- # @rbs return: void
14
- def initialize(offset)
15
- @offset = offset
16
- end
17
-
18
8
  # @rbs _generation: Generation
19
- # @rbs _root_node: Node
9
+ # @rbs _root_node: Node::ProgramNode
20
10
  # @rbs _parse_result: Prism::ParseResult
21
- # @rbs _memo: Memo
11
+ # @rbs _memo_pad: MemoPad
22
12
  # @rbs return: void
23
- def perform(_generation, _root_node, _parse_result, _memo)
13
+ def perform(_generation, _root_node, _parse_result, _memo_pad)
24
14
  raise RubyModKit::Error, "Unexpected type #{self.class}"
25
15
  end
26
16
 
27
17
  # @rbs offset_diff: OffsetDiff
28
18
  # @rbs return: void
29
- def succ(offset_diff)
30
- @offset = offset_diff[@offset]
31
- end
19
+ def succ(offset_diff); end
32
20
  end
33
21
  end
34
-
35
- require_relative "mission/ivar_arg"
36
- require_relative "mission/type_attr"
37
- require_relative "mission/type_parameter"
38
- require_relative "mission/type_return"
39
- require_relative "mission/fix_parse_error"
40
- require_relative "mission/overload"
@@ -0,0 +1,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rbs_inline: enabled
4
+
5
+ module RubyModKit
6
+ module Node
7
+ # The class of transpile node.
8
+ class BaseNode
9
+ # @rbs @location: Prism::Location
10
+ # @rbs @children: Array[Node::BaseNode]
11
+ # @rbs @ancestors: Array[Node::BaseNode]
12
+ # @rbs @prev: Node::BaseNode | nil
13
+
14
+ attr_reader :location #: Prism::Location
15
+ attr_reader :prev #: Node::BaseNode | nil
16
+
17
+ # @rbs return: void
18
+ def initialize
19
+ @location = prism_node.location
20
+ end
21
+
22
+ # @rbs return: Array[Node::BaseNode]
23
+ def children
24
+ return @children if @children
25
+
26
+ prev = nil
27
+ @children = prism_node.child_nodes.compact.map do |prism_child_node|
28
+ prev = Node.wrap(prism_child_node, parent: self, prev: prev)
29
+ end
30
+ end
31
+
32
+ # @rbs return: Array[Node::BaseNode]
33
+ def ancestors
34
+ return @ancestors if @ancestors
35
+
36
+ parent = @parent
37
+ @ancestors = if parent
38
+ [parent] + parent.ancestors
39
+ else
40
+ []
41
+ end
42
+ end
43
+
44
+ # @rbs return: Symbol
45
+ def name
46
+ raise(RubyModKit::Error, "Expected ParameterNode but #{self.class}:#{prism_node.inspect}")
47
+ end
48
+
49
+ # @rbs offset: Integer
50
+ # @rbs return: Node::BaseNode | nil
51
+ def node_at(offset)
52
+ return nil unless include?(offset)
53
+
54
+ child = children.find { _1.include?(offset) }
55
+ child&.node_at(offset) || self
56
+ end
57
+
58
+ # @rbs offset: Integer
59
+ # @rbs return: Node::StatementsNode | nil
60
+ def statements_node_at(offset)
61
+ node = node_at(offset) || return
62
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::StatementsNode) }
63
+ nil
64
+ end
65
+
66
+ # @rbs offset: Integer
67
+ # @rbs return: Node::DefNode | nil
68
+ def def_node_at(offset)
69
+ node = node_at(offset) || return
70
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::DefNode) }
71
+ nil
72
+ end
73
+
74
+ # @rbs offset: Integer
75
+ # @rbs return: Node::ParameterNode | nil
76
+ def parameter_node_at(offset)
77
+ node = node_at(offset) || return
78
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::ParameterNode) }
79
+ nil
80
+ end
81
+
82
+ # @rbs offset: Integer
83
+ # @rbs return: Node::DefParentNode | nil
84
+ def def_parent_node_at(offset)
85
+ node = node_at(offset) || return
86
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::DefParentNode) }
87
+ nil
88
+ end
89
+
90
+ # @rbs offset: Integer
91
+ # @rbs return: bool
92
+ def include?(offset)
93
+ self.offset <= offset && offset <= prism_node.location.end_offset
94
+ end
95
+
96
+ # @rbs return: Prism::Node & Prism::_Node
97
+ def prism_node
98
+ raise RubyModKit::Error
99
+ end
100
+
101
+ # @rbs return: Integer
102
+ def offset
103
+ location.start_offset
104
+ end
105
+
106
+ # @rbs return: String
107
+ def inspect
108
+ str = +"#<#{self.class} "
109
+ first = true
110
+ instance_variables.each do |ivar_name|
111
+ case ivar_name
112
+ when :@children, :@ancestors, :@parent
113
+ next
114
+ end
115
+
116
+ if first
117
+ first = false
118
+ else
119
+ str << ", "
120
+ end
121
+ str << "#{ivar_name}="
122
+ value = instance_variable_get(ivar_name)
123
+ str << (
124
+ case value
125
+ when Prism::Node
126
+ "#<#{value.class} location=#{value.location.inspect}>"
127
+ else
128
+ value.inspect
129
+ end
130
+ )
131
+ end
132
+ str << ">"
133
+ str
134
+ end
135
+ end
136
+ end
137
+ end
@@ -3,23 +3,27 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler method call node
8
- class CallNode < Node
8
+ class CallNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::CallNode
10
10
  # @rbs @name: Symbol
11
- # @rbs @parent: Node
11
+ # @rbs @parent: Node::BaseNode
12
+ # @rbs @prev: Node::BaseNode | nil
12
13
 
13
14
  attr_reader :prism_node #: Prism::CallNode
14
15
  attr_reader :name #: Symbol
15
- attr_reader :parent #: Node
16
+ attr_reader :parent #: Node::BaseNode
17
+ attr_reader :prev #: Node::BaseNode | nil
16
18
 
17
19
  # @rbs prism_node: Prism::CallNode
18
- # @rbs parent: Node
20
+ # @rbs parent: Node::BaseNode
21
+ # @rbs prev: Node::BaseNode | nil
19
22
  # @rbs return: void
20
- def initialize(prism_node, parent:)
23
+ def initialize(prism_node, parent:, prev: nil)
21
24
  @prism_node = prism_node
22
25
  @parent = parent
26
+ @prev = prev
23
27
  raise RubyModKit::Error unless prism_node.is_a?(Prism::CallNode)
24
28
 
25
29
  @name = prism_node.name.to_sym
@@ -3,21 +3,25 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler program node
8
- class DefNode < Node
8
+ class DefNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::DefNode
10
- # @rbs @parent: Node
10
+ # @rbs @parent: Node::BaseNode
11
+ # @rbs @prev: Node::BaseNode | nil
11
12
 
12
13
  attr_reader :prism_node #: Prism::DefNode
13
- attr_reader :parent #: Node
14
+ attr_reader :parent #: Node::BaseNode
15
+ attr_reader :prev #: Node::BaseNode | nil
14
16
 
15
17
  # @rbs prism_node: Prism::DefNode
16
- # @rbs parent: Node
18
+ # @rbs parent: Node::BaseNode
19
+ # @rbs prev: Node::BaseNode | nil
17
20
  # @rbs return: void
18
- def initialize(prism_node, parent:)
21
+ def initialize(prism_node, parent:, prev: nil)
19
22
  @prism_node = prism_node
20
23
  @parent = parent
24
+ @prev = prev
21
25
  raise RubyModKit::Error unless prism_node.is_a?(Prism::DefNode)
22
26
 
23
27
  super()
@@ -3,34 +3,38 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler program node
8
- class DefParentNode < Node
8
+ class DefParentNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::ClassNode | Prism::ModuleNode
10
10
  # @rbs @body_node: nil | Node::StatementsNode
11
- # @rbs @parent: Node
11
+ # @rbs @parent: Node::BaseNode
12
+ # @rbs @prev: Node::BaseNode | nil
12
13
 
13
14
  attr_reader :prism_node #: Prism::ClassNode | Prism::ModuleNode
14
- attr_reader :body_node #: nil | Node::StatementsNode
15
- attr_reader :parent #: Node
15
+ attr_reader :parent #: Node::BaseNode
16
+ attr_reader :prev #: Node::BaseNode | nil
16
17
 
17
18
  # @rbs prism_node: Prism::ClassNode | Prism::ModuleNode
18
- # @rbs parent: Node
19
+ # @rbs parent: Node::BaseNode
20
+ # @rbs prev: Node::BaseNode | nil
19
21
  # @rbs return: void
20
- def initialize(prism_node, parent:)
22
+ def initialize(prism_node, parent:, prev: nil)
21
23
  @prism_node = prism_node
22
24
  @parent = parent
25
+ @prev = prev
23
26
  raise RubyModKit::Error if !prism_node.is_a?(Prism::ClassNode) && !prism_node.is_a?(Prism::ModuleNode)
24
27
 
25
28
  super()
26
29
  end
27
30
 
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
31
+ # @rbs return: nil | Node::StatementsNode
32
+ 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
34
38
  end
35
39
  end
36
40
  end
@@ -3,26 +3,30 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler program node
8
- class ParameterNode < Node
8
+ class ParameterNode < Node::BaseNode
9
+ # @rbs @prism_node: prism_node
10
+ # @rbs @parent: Node::BaseNode
11
+ # @rbs @prev: Node::BaseNode | nil
12
+
9
13
  # @rbs!
10
14
  # type prism_node = Prism::RequiredParameterNode | Prism::OptionalKeywordParameterNode
11
15
  # | Prism::OptionalParameterNode | Prism::RequiredKeywordParameterNode
12
16
  # | Prism::RestParameterNode
13
17
 
14
- # @rbs @prism_node: prism_node
15
- # @rbs @parent: Node
16
-
17
18
  attr_reader :prism_node #: prism_node
18
- attr_reader :parent #: Node
19
+ attr_reader :parent #: Node::BaseNode
20
+ attr_reader :prev #: Node::BaseNode | nil
19
21
 
20
22
  # @rbs prism_node: prism_node
21
- # @rbs parent: Node
23
+ # @rbs parent: Node::BaseNode
24
+ # @rbs prev: Node::BaseNode | nil
22
25
  # @rbs return: void
23
- def initialize(prism_node, parent:)
26
+ def initialize(prism_node, parent:, prev: nil)
24
27
  @prism_node = prism_node
25
28
  @parent = parent
29
+ @prev = prev
26
30
  case prism_node
27
31
  when Prism::RequiredParameterNode, Prism::OptionalKeywordParameterNode,
28
32
  Prism::OptionalParameterNode, Prism::RequiredKeywordParameterNode,
@@ -3,9 +3,9 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler program node
8
- class ProgramNode < Node
8
+ class ProgramNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::ProgramNode
10
10
 
11
11
  attr_reader :prism_node #: Prism::ProgramNode
@@ -3,21 +3,25 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler program node
8
- class StatementsNode < Node
8
+ class StatementsNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::StatementsNode
10
- # @rbs @parent: Node
10
+ # @rbs @parent: Node::BaseNode
11
+ # @rbs @prev: Node::BaseNode | nil
11
12
 
12
13
  attr_reader :prism_node #: Prism::StatementsNode
13
- attr_reader :parent #: Node
14
+ attr_reader :parent #: Node::BaseNode
15
+ attr_reader :prev #: Node::BaseNode | nil
14
16
 
15
17
  # @rbs prism_node: Prism::StatementsNode
16
- # @rbs parent: Node
18
+ # @rbs parent: Node::BaseNode
19
+ # @rbs prev: Node::BaseNode | nil
17
20
  # @rbs return: void
18
- def initialize(prism_node, parent:)
21
+ def initialize(prism_node, parent:, prev: nil)
19
22
  @prism_node = prism_node
20
23
  @parent = parent
24
+ @prev = prev
21
25
  raise RubyModKit::Error unless prism_node.is_a?(Prism::StatementsNode)
22
26
 
23
27
  super()
@@ -3,21 +3,25 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler program node
8
- class SymbolNode < Node
8
+ class SymbolNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::SymbolNode
10
- # @rbs @parent: Node
10
+ # @rbs @parent: Node::BaseNode
11
+ # @rbs @prev: Node::BaseNode | nil
11
12
 
12
13
  attr_reader :prism_node #: Prism::SymbolNode
13
- attr_reader :parent #: Node
14
+ attr_reader :parent #: Node::BaseNode
15
+ attr_reader :prev #: Node::BaseNode | nil
14
16
 
15
17
  # @rbs prism_node: Prism::SymbolNode
16
- # @rbs parent: Node
18
+ # @rbs parent: Node::BaseNode
19
+ # @rbs prev: Node::BaseNode | nil
17
20
  # @rbs return: void
18
- def initialize(prism_node, parent:)
21
+ def initialize(prism_node, parent:, prev: nil)
19
22
  @prism_node = prism_node
20
23
  @parent = parent
24
+ @prev = prev
21
25
  raise RubyModKit::Error unless prism_node.is_a?(Prism::SymbolNode)
22
26
 
23
27
  super()
@@ -3,21 +3,25 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Node
6
+ module Node
7
7
  # Transpiler program node
8
- class UntypedNode < Node
8
+ class UntypedNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::Node
10
- # @rbs @parent: Node
10
+ # @rbs @parent: Node::BaseNode
11
+ # @rbs @prev: Node::BaseNode | nil
11
12
 
12
13
  attr_reader :prism_node #: Prism::Node
13
- attr_reader :parent #: Node
14
+ attr_reader :parent #: Node::BaseNode
15
+ attr_reader :prev #: Node::BaseNode | nil
14
16
 
15
17
  # @rbs prism_node: Prism::Node
16
- # @rbs parent: Node
18
+ # @rbs parent: Node::BaseNode
19
+ # @rbs prev: Node::BaseNode | nil
17
20
  # @rbs return: void
18
- def initialize(prism_node, parent:)
21
+ def initialize(prism_node, parent:, prev: nil)
19
22
  @prism_node = prism_node
20
23
  @parent = parent
24
+ @prev = prev
21
25
  super()
22
26
  end
23
27
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rbs_inline: enabled
4
+
5
+ require_relative "call_node"
6
+ require_relative "def_node"
7
+ require_relative "def_parent_node"
8
+ require_relative "parameter_node"
9
+ require_relative "statements_node"
10
+ require_relative "symbol_node"
11
+ require_relative "untyped_node"
12
+
13
+ module RubyModKit
14
+ # The namespace of transpile node.
15
+ module Node
16
+ class << self
17
+ # @rbs prism_node: Prism::Node
18
+ # @rbs parent: Node::BaseNode
19
+ # @rbs prev: Node::BaseNode | nil
20
+ # @rbs return: Node::BaseNode
21
+ def wrap(prism_node, parent:, prev: nil)
22
+ case prism_node
23
+ when Prism::CallNode
24
+ Node::CallNode.new(prism_node, parent: parent, prev: prev)
25
+ when Prism::DefNode
26
+ Node::DefNode.new(prism_node, parent: parent, prev: prev)
27
+ when Prism::ClassNode, Prism::ModuleNode
28
+ Node::DefParentNode.new(prism_node, parent: parent, prev: prev)
29
+ when Prism::RequiredParameterNode, Prism::OptionalKeywordParameterNode,
30
+ Prism::OptionalParameterNode, Prism::RequiredKeywordParameterNode,
31
+ Prism::RestParameterNode
32
+ Node::ParameterNode.new(prism_node, parent: parent, prev: prev)
33
+ when Prism::StatementsNode
34
+ Node::StatementsNode.new(prism_node, parent: parent, prev: prev)
35
+ when Prism::SymbolNode
36
+ Node::SymbolNode.new(prism_node, parent: parent, prev: prev)
37
+ else
38
+ Node::UntypedNode.new(prism_node, parent: parent, prev: prev)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end