ruby_mod_kit 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby_mod_kit.yml +5 -0
  3. data/lib/ruby_mod_kit/cli.rb +17 -2
  4. data/lib/ruby_mod_kit/config.rb +53 -0
  5. data/lib/ruby_mod_kit/core_ext/eval.rb +6 -0
  6. data/lib/ruby_mod_kit/core_ext/load.rb +12 -4
  7. data/lib/ruby_mod_kit/core_ext.rb +2 -2
  8. data/lib/ruby_mod_kit/corrector.rb +20 -0
  9. data/lib/ruby_mod_kit/corrector_manager.rb +64 -0
  10. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +40 -0
  11. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +42 -0
  12. data/lib/ruby_mod_kit/feature/instance_variable_parameter.rb +27 -0
  13. data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +77 -0
  14. data/lib/ruby_mod_kit/feature/overload.rb +19 -0
  15. data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +52 -0
  16. data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +84 -0
  17. data/lib/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rb +49 -0
  18. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +46 -0
  19. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +29 -0
  20. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +41 -0
  21. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +36 -0
  22. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +30 -0
  23. data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +32 -0
  24. data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +43 -0
  25. data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +69 -0
  26. data/lib/ruby_mod_kit/feature/type.rb +31 -0
  27. data/lib/ruby_mod_kit/feature.rb +18 -0
  28. data/lib/ruby_mod_kit/generation.rb +76 -29
  29. data/lib/ruby_mod_kit/memo/def_parent_memo.rb +36 -0
  30. data/lib/ruby_mod_kit/memo/{ivar.rb → ivar_memo.rb} +19 -3
  31. data/lib/ruby_mod_kit/memo/{method.rb → method_memo.rb} +7 -7
  32. data/lib/ruby_mod_kit/memo/offset_memo.rb +1 -1
  33. data/lib/ruby_mod_kit/memo/overload_memo.rb +47 -0
  34. data/lib/ruby_mod_kit/memo/{parameter.rb → parameter_memo.rb} +3 -3
  35. data/lib/ruby_mod_kit/memo.rb +7 -66
  36. data/lib/ruby_mod_kit/memo_pad.rb +72 -0
  37. data/lib/ruby_mod_kit/mission.rb +3 -25
  38. data/lib/ruby_mod_kit/node/base_node.rb +155 -0
  39. data/lib/ruby_mod_kit/node/call_node.rb +11 -7
  40. data/lib/ruby_mod_kit/node/def_node.rb +11 -7
  41. data/lib/ruby_mod_kit/node/def_parent_node.rb +25 -14
  42. data/lib/ruby_mod_kit/node/parameter_node.rb +13 -9
  43. data/lib/ruby_mod_kit/node/program_node.rb +8 -3
  44. data/lib/ruby_mod_kit/node/statements_node.rb +11 -7
  45. data/lib/ruby_mod_kit/node/symbol_node.rb +12 -7
  46. data/lib/ruby_mod_kit/node/untyped_node.rb +11 -7
  47. data/lib/ruby_mod_kit/node/wrap.rb +43 -0
  48. data/lib/ruby_mod_kit/node.rb +4 -150
  49. data/lib/ruby_mod_kit/version.rb +1 -1
  50. data/lib/ruby_mod_kit.rb +27 -8
  51. data/ruby_mod_kit.gemspec +7 -1
  52. data/sig/generated/ruby_mod_kit/cli.rbs +5 -0
  53. data/sig/generated/ruby_mod_kit/config.rbs +21 -0
  54. data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +3 -0
  55. data/sig/generated/ruby_mod_kit/core_ext/load.rbs +7 -4
  56. data/sig/generated/ruby_mod_kit/corrector.rbs +14 -0
  57. data/sig/generated/ruby_mod_kit/corrector_manager.rbs +22 -0
  58. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +18 -0
  59. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +14 -0
  60. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter.rbs +14 -0
  61. data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +21 -0
  62. data/sig/generated/ruby_mod_kit/feature/overload.rbs +11 -0
  63. data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +24 -0
  64. data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +33 -0
  65. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rbs +21 -0
  66. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +16 -0
  67. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +16 -0
  68. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +16 -0
  69. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +16 -0
  70. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +16 -0
  71. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline.rbs +13 -0
  72. data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +18 -0
  73. data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +19 -0
  74. data/sig/generated/ruby_mod_kit/feature/type.rbs +14 -0
  75. data/sig/generated/ruby_mod_kit/feature.rbs +12 -0
  76. data/sig/generated/ruby_mod_kit/generation.rbs +44 -13
  77. data/sig/generated/ruby_mod_kit/memo/def_parent_memo.rbs +24 -0
  78. data/sig/generated/ruby_mod_kit/memo/{ivar.rbs → ivar_memo.rbs} +19 -3
  79. data/sig/generated/ruby_mod_kit/memo/{method.rbs → method_memo.rbs} +8 -8
  80. data/sig/generated/ruby_mod_kit/memo/offset_memo.rbs +1 -1
  81. data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +34 -0
  82. data/sig/generated/ruby_mod_kit/memo/{parameter.rbs → parameter_memo.rbs} +3 -3
  83. data/sig/generated/ruby_mod_kit/memo_pad.rbs +50 -0
  84. data/sig/generated/ruby_mod_kit/mission.rbs +2 -13
  85. data/sig/generated/ruby_mod_kit/node/base_node.rbs +75 -0
  86. data/sig/generated/ruby_mod_kit/node/call_node.rbs +11 -6
  87. data/sig/generated/ruby_mod_kit/node/def_node.rbs +11 -6
  88. data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +17 -10
  89. data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +13 -8
  90. data/sig/generated/ruby_mod_kit/node/program_node.rbs +5 -2
  91. data/sig/generated/ruby_mod_kit/node/statements_node.rbs +11 -6
  92. data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +13 -6
  93. data/sig/generated/ruby_mod_kit/node/untyped_node.rbs +11 -6
  94. data/sig/generated/ruby_mod_kit/node/wrap.rbs +12 -0
  95. data/sig/generated/ruby_mod_kit.rbs +10 -3
  96. data/sig/yaml.rbs +3 -0
  97. metadata +63 -30
  98. data/lib/ruby_mod_kit/memo/def_parent.rb +0 -27
  99. data/lib/ruby_mod_kit/mission/fix_parse_error.rb +0 -216
  100. data/lib/ruby_mod_kit/mission/ivar_arg.rb +0 -42
  101. data/lib/ruby_mod_kit/mission/overload.rb +0 -73
  102. data/lib/ruby_mod_kit/mission/type_attr.rb +0 -75
  103. data/lib/ruby_mod_kit/mission/type_parameter.rb +0 -39
  104. data/lib/ruby_mod_kit/mission/type_return.rb +0 -33
  105. data/lib/ruby_mod_kit/transpiler.rb +0 -20
  106. data/sig/generated/examples/user.rbs +0 -60
  107. data/sig/generated/ruby_mod_kit/memo/def_parent.rbs +0 -20
  108. data/sig/generated/ruby_mod_kit/memo/located.rbs +0 -14
  109. data/sig/generated/ruby_mod_kit/memo/parameter_type.rbs +0 -14
  110. data/sig/generated/ruby_mod_kit/memo.rbs +0 -41
  111. data/sig/generated/ruby_mod_kit/mission/fix_parse_error.rbs +0 -73
  112. data/sig/generated/ruby_mod_kit/mission/ivar_arg.rbs +0 -19
  113. data/sig/generated/ruby_mod_kit/mission/overload.rbs +0 -20
  114. data/sig/generated/ruby_mod_kit/mission/type_attr.rbs +0 -18
  115. data/sig/generated/ruby_mod_kit/mission/type_parameter.rbs +0 -18
  116. data/sig/generated/ruby_mod_kit/mission/type_return.rbs +0 -18
  117. data/sig/generated/ruby_mod_kit/node.rbs +0 -63
  118. data/sig/generated/ruby_mod_kit/transpiler.rbs +0 -11
@@ -3,15 +3,15 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Memo
6
+ module Memo
7
7
  # The memo for parameter type
8
- class Method < OffsetMemo
8
+ class MethodMemo < OffsetMemo
9
9
  # @rbs @name: Symbol
10
- # @rbs @parameters: Set[Memo::Parameter]
10
+ # @rbs @parameters: Set[Memo::ParameterMemo]
11
11
  # @rbs @type: String
12
12
 
13
13
  attr_reader :name #: Symbol
14
- attr_reader :parameters #: Set[Memo::Parameter]
14
+ attr_reader :parameters #: Set[Memo::ParameterMemo]
15
15
  attr_reader :type #: String
16
16
 
17
17
  UNTYPED = "untyped"
@@ -27,8 +27,8 @@ module RubyModKit
27
27
  super(node.offset)
28
28
  end
29
29
 
30
- # @rbs parameter_memo: Memo::Parameter
31
- # @rbs return: Memo::Parameter
30
+ # @rbs parameter_memo: Memo::ParameterMemo
31
+ # @rbs return: Memo::ParameterMemo
32
32
  def add_parameter(parameter_memo)
33
33
  @parameters << parameter_memo
34
34
  parameter_memo
@@ -42,7 +42,7 @@ module RubyModKit
42
42
  # @rbs type: String
43
43
  # @rbs return: void
44
44
  def type=(type)
45
- @type = Memo.unify_type(type)
45
+ @type = RubyModKit.unify_type(type)
46
46
  end
47
47
  end
48
48
  end
@@ -3,7 +3,7 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Memo
6
+ module Memo
7
7
  # The base class for located memo
8
8
  class OffsetMemo
9
9
  # @rbs @offset: Integer
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rbs_inline: enabled
4
+
5
+ module RubyModKit
6
+ module Memo
7
+ # The memo for parameter type
8
+ class OverloadMemo < OffsetMemo
9
+ # @rbs @name: Symbol
10
+ # @rbs @overload_types: [[Array[String], String]]
11
+ # @rbs @offset_corrected: bool
12
+ # @rbs @offset: Integer
13
+
14
+ attr_reader :name #: Symbol
15
+ attr_reader :overload_types #: [[Array[String], String]]
16
+
17
+ # @rbs offset: Integer
18
+ # @rbs name: Symbol
19
+ # @rbs return: void
20
+ def initialize(offset, name)
21
+ @name = name
22
+ @overload_types = []
23
+ @offset_corrected = false
24
+ super(offset)
25
+ end
26
+
27
+ # @rbs root_node: Node::ProgramNode
28
+ # @rbs return: Integer
29
+ def correct_offset(root_node)
30
+ return @offset if @offset_corrected
31
+
32
+ node = root_node.def_node_at(@offset)&.prev
33
+ raise RubyModKit::Error unless node.is_a?(Node::DefNode)
34
+
35
+ @offset_corrected = true
36
+ @offset = node.offset
37
+ end
38
+
39
+ # @rbs parameter_types: Array[String]
40
+ # @rbs return_value_type: String
41
+ # @rbs return: void
42
+ def add_overload_type(parameter_types, return_value_type)
43
+ @overload_types << [parameter_types, return_value_type]
44
+ end
45
+ end
46
+ end
47
+ end
@@ -3,9 +3,9 @@
3
3
  # rbs_inline: enabled
4
4
 
5
5
  module RubyModKit
6
- class Memo
6
+ module Memo
7
7
  # The memo for parameter type
8
- class Parameter < OffsetMemo
8
+ class ParameterMemo < OffsetMemo
9
9
  # @rbs @type: String
10
10
  # @rbs @ivar_parameter: bool
11
11
  # @rbs @qualifier: String
@@ -32,7 +32,7 @@ module RubyModKit
32
32
  # @rbs type: String
33
33
  # @rbs return: void
34
34
  def type=(type)
35
- @type = Memo.unify_type(type)
35
+ @type = RubyModKit.unify_type(type)
36
36
  end
37
37
  end
38
38
  end
@@ -1,73 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rbs_inline: enabled
4
-
5
3
  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
4
+ # The namespace of transpiler memo.
5
+ module Memo
66
6
  end
67
7
  end
68
8
 
69
9
  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"
10
+ require_relative "memo/def_parent_memo"
11
+ require_relative "memo/ivar_memo"
12
+ require_relative "memo/method_memo"
13
+ require_relative "memo/overload_memo"
14
+ require_relative "memo/parameter_memo"
@@ -0,0 +1,72 @@
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
+ # @rbs @flags: Hash[Symbol, bool]
13
+
14
+ attr_reader :def_parents_memo #: Hash[Integer, Memo::DefParentMemo]
15
+ attr_reader :methods_memo #: Hash[Integer, Memo::MethodMemo]
16
+ attr_reader :parameters_memo #: Hash[Integer, Memo::ParameterMemo]
17
+ attr_reader :overloads_memo #: Hash[Integer, Memo::OverloadMemo]
18
+ attr_accessor :flags #: Hash[Symbol, bool]
19
+
20
+ # @rbs return: void
21
+ def initialize
22
+ @def_parents_memo = {}
23
+ @methods_memo = {}
24
+ @parameters_memo = {}
25
+ @overloads_memo = {}
26
+ @flags = Hash.new(false)
27
+ end
28
+
29
+ # @rbs offset_diff: OffsetDiff
30
+ # @rbs return: void
31
+ def succ(offset_diff)
32
+ [@methods_memo, @parameters_memo, @def_parents_memo, @overloads_memo].each do |offset_node_memo|
33
+ new_offset_node_memo = {}
34
+ offset_node_memo.each_value do |node_memo|
35
+ node_memo.succ(offset_diff)
36
+ new_offset_node_memo[node_memo.offset] = node_memo
37
+ end
38
+ offset_node_memo.replace(new_offset_node_memo)
39
+ end
40
+ self
41
+ end
42
+
43
+ # @rbs def_parent_node: Node::DefParentNode
44
+ # @rbs return: Memo::DefParentMemo
45
+ def def_parent_memo(def_parent_node)
46
+ @def_parents_memo[def_parent_node.offset] ||= Memo::DefParentMemo.new(def_parent_node)
47
+ end
48
+
49
+ # @rbs def_node: Node::DefNode
50
+ # @rbs return: Memo::MethodMemo
51
+ def method_memo(def_node)
52
+ @methods_memo[def_node.offset] ||= Memo::MethodMemo.new(def_node)
53
+ end
54
+
55
+ # @rbs offset: Integer
56
+ # @rbs name: Symbol
57
+ # @rbs return: Memo::OverloadMemo
58
+ def overload_memo(offset, name)
59
+ @overloads_memo[offset] ||= Memo::OverloadMemo.new(offset, name)
60
+ end
61
+
62
+ # @rbs node: Node::BaseNode
63
+ # @rbs return: Memo::ParameterMemo
64
+ def parameter_memo(node)
65
+ memo = @parameters_memo[node.offset] ||= Memo::ParameterMemo.new(node.offset)
66
+ def_node = node.def_node_at(node.offset)
67
+ raise RubyModKit::Error unless def_node.is_a?(Node::DefNode)
68
+
69
+ method_memo(def_node).add_parameter(memo)
70
+ end
71
+ end
72
+ end
@@ -3,38 +3,16 @@
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
20
- # @rbs _parse_result: Prism::ParseResult
21
- # @rbs _memo: Memo
22
9
  # @rbs return: void
23
- def perform(_generation, _root_node, _parse_result, _memo)
10
+ def perform(_generation)
24
11
  raise RubyModKit::Error, "Unexpected type #{self.class}"
25
12
  end
26
13
 
27
14
  # @rbs offset_diff: OffsetDiff
28
15
  # @rbs return: void
29
- def succ(offset_diff)
30
- @offset = offset_diff[@offset]
31
- end
16
+ def succ(offset_diff); end
32
17
  end
33
18
  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,155 @@
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 :prev #: Node::BaseNode | nil
15
+
16
+ # @rbs return: Prism::Location
17
+ def location
18
+ return @location if defined?(@location)
19
+
20
+ @location = prism_node.location
21
+ end
22
+
23
+ # @rbs return: Array[Node::BaseNode]
24
+ def children
25
+ return @children if @children
26
+
27
+ prev = nil
28
+ @children = prism_node.child_nodes.compact.map do |prism_child_node|
29
+ prev = wrap(prism_child_node, prev: prev)
30
+ end
31
+ end
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
+
40
+ # @rbs return: Array[Node::BaseNode]
41
+ def ancestors
42
+ return @ancestors if @ancestors
43
+
44
+ parent = self.parent
45
+ @ancestors = if parent
46
+ [parent] + parent.ancestors
47
+ else
48
+ []
49
+ end
50
+ end
51
+
52
+ # @rbs return: nil | BaseNode
53
+ def parent
54
+ raise(RubyModKit::Error)
55
+ end
56
+
57
+ # @rbs return: Symbol
58
+ def name
59
+ raise(RubyModKit::Error, "Expected ParameterNode but #{self.class}:#{prism_node.inspect}")
60
+ end
61
+
62
+ # @rbs offset: Integer
63
+ # @rbs return: Node::BaseNode | nil
64
+ def node_at(offset)
65
+ return nil unless include?(offset)
66
+
67
+ child = children.find { _1.include?(offset) }
68
+ child&.node_at(offset) || self
69
+ end
70
+
71
+ # @rbs offset: Integer
72
+ # @rbs return: Node::StatementsNode | nil
73
+ def statements_node_at(offset)
74
+ node = node_at(offset) || return
75
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::StatementsNode) }
76
+ nil
77
+ end
78
+
79
+ # @rbs offset: Integer
80
+ # @rbs return: Node::DefNode | nil
81
+ def def_node_at(offset)
82
+ node = node_at(offset) || return
83
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::DefNode) }
84
+ nil
85
+ end
86
+
87
+ # @rbs offset: Integer
88
+ # @rbs return: Node::ParameterNode | nil
89
+ def parameter_node_at(offset)
90
+ node = node_at(offset) || return
91
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::ParameterNode) }
92
+ nil
93
+ end
94
+
95
+ # @rbs offset: Integer
96
+ # @rbs return: Node::DefParentNode | nil
97
+ def def_parent_node_at(offset)
98
+ node = node_at(offset) || return
99
+ [node, *node.ancestors].each { return _1 if _1.is_a?(Node::DefParentNode) }
100
+ nil
101
+ end
102
+
103
+ # @rbs offset: Integer
104
+ # @rbs return: bool
105
+ def include?(offset)
106
+ self.offset <= offset && offset <= prism_node.location.end_offset
107
+ end
108
+
109
+ # @rbs return: Integer
110
+ def offset
111
+ location.start_offset
112
+ end
113
+
114
+ # @rbs return: String
115
+ def inspect
116
+ str = +"#<#{self.class} "
117
+ first = true
118
+ instance_variables.each do |ivar_name|
119
+ case ivar_name
120
+ when :@children, :@ancestors, :@parent
121
+ next
122
+ end
123
+
124
+ if first
125
+ first = false
126
+ else
127
+ str << ", "
128
+ end
129
+ str << "#{ivar_name}="
130
+ value = instance_variable_get(ivar_name)
131
+ str << (
132
+ case value
133
+ when Prism::Node
134
+ "#<#{value.class} location=#{value.location.inspect}>"
135
+ else
136
+ value.inspect
137
+ end
138
+ )
139
+ end
140
+ str << ">"
141
+ str
142
+ end
143
+
144
+ private
145
+
146
+ # :nocov:
147
+ # This is just for interface definition, must not be called
148
+ # @rbs return: Prism::Node & Prism::_Node
149
+ def prism_node
150
+ raise RubyModKit::Error
151
+ end
152
+ # :nocov:
153
+ end
154
+ end
155
+ 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
- attr_reader :prism_node #: Prism::CallNode
14
+ private 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
- attr_reader :prism_node #: Prism::DefNode
13
- attr_reader :parent #: Node
13
+ private attr_reader :prism_node #: Prism::DefNode
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,45 @@
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
- attr_reader :prism_node #: Prism::ClassNode | Prism::ModuleNode
14
- attr_reader :body_node #: nil | Node::StatementsNode
15
- attr_reader :parent #: Node
14
+ private attr_reader :prism_node #: Prism::ClassNode | Prism::ModuleNode
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 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
+
40
+ # @rbs return: nil | Node::StatementsNode
41
+ def body_node
42
+ # body_node will be set in #children
43
+ children
44
+ @body_node
34
45
  end
35
46
  end
36
47
  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
- attr_reader :prism_node #: prism_node
18
- attr_reader :parent #: Node
18
+ private attr_reader :prism_node #: prism_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,12 +3,12 @@
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
- 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