ruby_mod_kit 0.0.4 → 0.0.6

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 (110) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby_mod_kit.yml +1 -0
  3. data/.yardopts +3 -0
  4. data/README.md +89 -0
  5. data/examples/user.rb +4 -16
  6. data/lib/ruby_mod_kit/cli.rb +5 -0
  7. data/lib/ruby_mod_kit/config.rb +6 -1
  8. data/lib/ruby_mod_kit/core_ext/eval.rb +13 -10
  9. data/lib/ruby_mod_kit/core_ext/load.rb +10 -0
  10. data/lib/ruby_mod_kit/corrector.rb +8 -0
  11. data/lib/ruby_mod_kit/corrector_manager.rb +16 -6
  12. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +4 -0
  13. data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +3 -1
  14. data/lib/ruby_mod_kit/feature/instance_variable_parameter.rb +2 -0
  15. data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +44 -13
  16. data/lib/ruby_mod_kit/feature/overload.rb +1 -0
  17. data/lib/ruby_mod_kit/feature/type/check/arguments/add_arguments_checker_mission.rb +58 -0
  18. data/lib/ruby_mod_kit/feature/type/check/arguments.rb +25 -0
  19. data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +13 -4
  20. data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +41 -5
  21. data/lib/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rb +3 -0
  22. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +2 -0
  23. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +5 -2
  24. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +3 -2
  25. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +7 -4
  26. data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +3 -1
  27. data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +1 -0
  28. data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +5 -0
  29. data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +6 -9
  30. data/lib/ruby_mod_kit/feature/type/yard/type_parameter_mission.rb +37 -0
  31. data/lib/ruby_mod_kit/feature/type/yard/type_return_mission.rb +32 -0
  32. data/lib/ruby_mod_kit/feature/type/yard.rb +34 -0
  33. data/lib/ruby_mod_kit/feature/type.rb +2 -0
  34. data/lib/ruby_mod_kit/feature.rb +2 -0
  35. data/lib/ruby_mod_kit/generation.rb +67 -49
  36. data/lib/ruby_mod_kit/memo/def_parent_memo.rb +6 -0
  37. data/lib/ruby_mod_kit/memo/ivar_memo.rb +18 -8
  38. data/lib/ruby_mod_kit/memo/method_memo.rb +8 -1
  39. data/lib/ruby_mod_kit/memo/offset_memo.rb +4 -0
  40. data/lib/ruby_mod_kit/memo/overload_memo.rb +9 -1
  41. data/lib/ruby_mod_kit/memo/parameter_memo.rb +10 -3
  42. data/lib/ruby_mod_kit/memo_pad.rb +34 -0
  43. data/lib/ruby_mod_kit/mission.rb +2 -4
  44. data/lib/ruby_mod_kit/node/base_node.rb +43 -3
  45. data/lib/ruby_mod_kit/node/begin_node.rb +35 -0
  46. data/lib/ruby_mod_kit/node/call_node.rb +4 -0
  47. data/lib/ruby_mod_kit/node/def_node.rb +36 -0
  48. data/lib/ruby_mod_kit/node/def_parent_node.rb +10 -2
  49. data/lib/ruby_mod_kit/node/parameter_node.rb +7 -2
  50. data/lib/ruby_mod_kit/node/program_node.rb +3 -0
  51. data/lib/ruby_mod_kit/node/statements_node.rb +4 -0
  52. data/lib/ruby_mod_kit/node/symbol_node.rb +7 -2
  53. data/lib/ruby_mod_kit/node/untyped_node.rb +4 -0
  54. data/lib/ruby_mod_kit/node/wrap.rb +7 -1
  55. data/lib/ruby_mod_kit/node.rb +1 -0
  56. data/lib/ruby_mod_kit/offset_diff.rb +6 -0
  57. data/lib/ruby_mod_kit/version.rb +1 -1
  58. data/lib/ruby_mod_kit.rb +29 -8
  59. data/sig/generated/ruby_mod_kit/cli.rbs +5 -0
  60. data/sig/generated/ruby_mod_kit/config.rbs +7 -2
  61. data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +11 -2
  62. data/sig/generated/ruby_mod_kit/core_ext/load.rbs +10 -0
  63. data/sig/generated/ruby_mod_kit/corrector.rbs +8 -0
  64. data/sig/generated/ruby_mod_kit/corrector_manager.rbs +7 -1
  65. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +4 -0
  66. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +2 -0
  67. data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter.rbs +2 -0
  68. data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +3 -0
  69. data/sig/generated/ruby_mod_kit/feature/overload.rbs +1 -0
  70. data/sig/generated/ruby_mod_kit/feature/type/check/arguments/add_arguments_checker_mission.rbs +18 -0
  71. data/sig/generated/ruby_mod_kit/feature/type/check/arguments.rbs +17 -0
  72. data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +4 -0
  73. data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +19 -0
  74. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rbs +3 -0
  75. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +2 -0
  76. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +2 -0
  77. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +2 -0
  78. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +2 -0
  79. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +2 -0
  80. data/sig/generated/ruby_mod_kit/feature/type/rbs_inline.rbs +1 -0
  81. data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +4 -0
  82. data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +3 -0
  83. data/sig/generated/ruby_mod_kit/feature/type/yard/type_parameter_mission.rbs +18 -0
  84. data/sig/generated/ruby_mod_kit/feature/type/yard/type_return_mission.rbs +18 -0
  85. data/sig/generated/ruby_mod_kit/feature/type/yard.rbs +20 -0
  86. data/sig/generated/ruby_mod_kit/feature/type.rbs +2 -0
  87. data/sig/generated/ruby_mod_kit/feature.rbs +2 -0
  88. data/sig/generated/ruby_mod_kit/generation.rbs +46 -25
  89. data/sig/generated/ruby_mod_kit/memo/def_parent_memo.rbs +6 -0
  90. data/sig/generated/ruby_mod_kit/memo/ivar_memo.rbs +20 -8
  91. data/sig/generated/ruby_mod_kit/memo/method_memo.rbs +8 -1
  92. data/sig/generated/ruby_mod_kit/memo/offset_memo.rbs +4 -0
  93. data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +8 -0
  94. data/sig/generated/ruby_mod_kit/memo/parameter_memo.rbs +12 -3
  95. data/sig/generated/ruby_mod_kit/memo_pad.rbs +23 -0
  96. data/sig/generated/ruby_mod_kit/mission.rbs +2 -4
  97. data/sig/generated/ruby_mod_kit/node/base_node.rbs +36 -3
  98. data/sig/generated/ruby_mod_kit/node/begin_node.rbs +30 -0
  99. data/sig/generated/ruby_mod_kit/node/call_node.rbs +4 -0
  100. data/sig/generated/ruby_mod_kit/node/def_node.rbs +24 -0
  101. data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +11 -3
  102. data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +6 -1
  103. data/sig/generated/ruby_mod_kit/node/program_node.rbs +3 -0
  104. data/sig/generated/ruby_mod_kit/node/statements_node.rbs +4 -0
  105. data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +8 -3
  106. data/sig/generated/ruby_mod_kit/node/untyped_node.rbs +4 -0
  107. data/sig/generated/ruby_mod_kit/node/wrap.rbs +4 -0
  108. data/sig/generated/ruby_mod_kit/offset_diff.rbs +6 -0
  109. data/sig/generated/ruby_mod_kit.rbs +31 -6
  110. metadata +15 -2
@@ -12,6 +12,8 @@ module RubyModKit
12
12
 
13
13
  # @rbs def_parent_node: Node::DefParentNode
14
14
  # @rbs return: void
15
+ # @param def_parent_node [Node::DefParentNode]
16
+ # @return [void]
15
17
  def initialize(def_parent_node)
16
18
  @ivars_memo = {}
17
19
  super(def_parent_node.offset)
@@ -19,12 +21,16 @@ module RubyModKit
19
21
 
20
22
  # @rbs name: Symbol
21
23
  # @rbs return: Memo::IvarMemo
24
+ # @param name [Symbol]
25
+ # @return [Memo::IvarMemo]
22
26
  def ivar_memo(name)
23
27
  @ivars_memo[name] ||= Memo::IvarMemo.new(name)
24
28
  end
25
29
 
26
30
  # @rbs offset_diff: OffsetDiff
27
31
  # @rbs return: void
32
+ # @param offset_diff [OffsetDiff]
33
+ # @return [void]
28
34
  def succ(offset_diff)
29
35
  @ivars_memo.each_value do |ivar_memo|
30
36
  ivar_memo.succ(offset_diff)
@@ -6,21 +6,25 @@ module RubyModKit
6
6
  module Memo
7
7
  # The memo for parameter type
8
8
  class IvarMemo
9
- # @rbs @type: nil | String
10
- # @rbs @attr_kind: nil | Symbol
11
- # @rbs @offset: nil | Integer
9
+ # @rbs @type: String | nil
10
+ # @rbs @attr_kind: Symbol | nil
11
+ # @rbs @offset: Integer | nil
12
12
  # @rbs @indent: String
13
13
  # @rbs @name: Symbol
14
- # @rbs @visibility: nil | Symbol
14
+ # @rbs @visibility: Symbol | nil
15
+ # @rbs @separator: String
15
16
 
16
- attr_reader :type #: nil | String
17
- attr_reader :attr_kind #: nil | Symbol
18
- attr_accessor :offset #: nil | Integer
17
+ attr_reader :type #: String | nil
18
+ attr_reader :attr_kind #: Symbol | nil
19
+ attr_accessor :offset #: Integer | nil
19
20
  attr_accessor :indent #: String
20
- attr_accessor :visibility #: nil | Symbol
21
+ attr_accessor :visibility #: Symbol | nil
22
+ attr_accessor :separator #: String
21
23
 
22
24
  # @rbs name: Symbol
23
25
  # @rbs return: void
26
+ # @param name [Symbol]
27
+ # @return [void]
24
28
  def initialize(name)
25
29
  @name = name
26
30
  @indent = ""
@@ -28,12 +32,16 @@ module RubyModKit
28
32
 
29
33
  # @rbs type: String
30
34
  # @rbs return: void
35
+ # @param type [String]
36
+ # @return [void]
31
37
  def type=(type)
32
38
  @type = RubyModKit.unify_type(type)
33
39
  end
34
40
 
35
41
  # @rbs kind: Symbol | String
36
42
  # @rbs return: void
43
+ # @param kind [Symbol, String]
44
+ # @return [void]
37
45
  def attr_kind=(kind)
38
46
  case kind.to_sym
39
47
  when :attr_reader, :reader, :getter
@@ -47,6 +55,8 @@ module RubyModKit
47
55
 
48
56
  # @rbs offset_diff: OffsetDiff
49
57
  # @rbs return: void
58
+ # @param offset_diff [OffsetDiff]
59
+ # @return [void]
50
60
  def succ(offset_diff)
51
61
  offset = @offset
52
62
  return unless offset
@@ -14,10 +14,12 @@ module RubyModKit
14
14
  attr_reader :parameters #: Set[Memo::ParameterMemo]
15
15
  attr_reader :type #: String
16
16
 
17
- UNTYPED = "untyped"
17
+ UNTYPED = "untyped" #: String
18
18
 
19
19
  # @rbs node: Node::DefNode
20
20
  # @rbs return: void
21
+ # @param node [Node::DefNode]
22
+ # @return [void]
21
23
  def initialize(node)
22
24
  @type = UNTYPED
23
25
  @parameters = Set.new
@@ -29,18 +31,23 @@ module RubyModKit
29
31
 
30
32
  # @rbs parameter_memo: Memo::ParameterMemo
31
33
  # @rbs return: Memo::ParameterMemo
34
+ # @param parameter_memo [Memo::ParameterMemo]
35
+ # @return [Memo::ParameterMemo]
32
36
  def add_parameter(parameter_memo)
33
37
  @parameters << parameter_memo
34
38
  parameter_memo
35
39
  end
36
40
 
37
41
  # @rbs return: bool
42
+ # @return [Boolean]
38
43
  def untyped?
39
44
  @type == UNTYPED
40
45
  end
41
46
 
42
47
  # @rbs type: String
43
48
  # @rbs return: void
49
+ # @param type [String]
50
+ # @return [void]
44
51
  def type=(type)
45
52
  @type = RubyModKit.unify_type(type)
46
53
  end
@@ -12,12 +12,16 @@ module RubyModKit
12
12
 
13
13
  # @rbs offset: Integer
14
14
  # @rbs return: void
15
+ # @param offset [Integer]
16
+ # @return [void]
15
17
  def initialize(offset)
16
18
  @offset = offset
17
19
  end
18
20
 
19
21
  # @rbs offset_diff: OffsetDiff
20
22
  # @rbs return: void
23
+ # @param offset_diff [OffsetDiff]
24
+ # @return [void]
21
25
  def succ(offset_diff)
22
26
  @offset = offset_diff[@offset]
23
27
  end
@@ -17,6 +17,9 @@ module RubyModKit
17
17
  # @rbs offset: Integer
18
18
  # @rbs name: Symbol
19
19
  # @rbs return: void
20
+ # @param offset [Integer]
21
+ # @param name [Symbol]
22
+ # @return [void]
20
23
  def initialize(offset, name)
21
24
  @name = name
22
25
  @overload_types = []
@@ -26,10 +29,12 @@ module RubyModKit
26
29
 
27
30
  # @rbs root_node: Node::ProgramNode
28
31
  # @rbs return: Integer
32
+ # @param root_node [Node::ProgramNode]
33
+ # @return [Integer]
29
34
  def correct_offset(root_node)
30
35
  return @offset if @offset_corrected
31
36
 
32
- node = root_node.def_node_at(@offset)&.prev
37
+ node = root_node.def_node_at(@offset)
33
38
  raise RubyModKit::Error unless node.is_a?(Node::DefNode)
34
39
 
35
40
  @offset_corrected = true
@@ -39,6 +44,9 @@ module RubyModKit
39
44
  # @rbs parameter_types: Array[String]
40
45
  # @rbs return_value_type: String
41
46
  # @rbs return: void
47
+ # @param parameter_types [Array<String>]
48
+ # @param return_value_type [String]
49
+ # @return [void]
42
50
  def add_overload_type(parameter_types, return_value_type)
43
51
  @overload_types << [parameter_types, return_value_type]
44
52
  end
@@ -8,16 +8,20 @@ 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
- UNTYPED = "untyped"
19
+ UNTYPED = "untyped" #: String
18
20
 
19
21
  # @rbs offset: Integer
20
22
  # @rbs return: void
23
+ # @param offset [Integer]
24
+ # @return [void]
21
25
  def initialize(offset)
22
26
  @type = UNTYPED
23
27
  @ivar_parameter = false
@@ -25,12 +29,15 @@ module RubyModKit
25
29
  end
26
30
 
27
31
  # @rbs return: bool
32
+ # @return [Boolean]
28
33
  def untyped?
29
34
  @type == UNTYPED
30
35
  end
31
36
 
32
37
  # @rbs type: String
33
38
  # @rbs return: void
39
+ # @param type [String]
40
+ # @return [void]
34
41
  def type=(type)
35
42
  @type = RubyModKit.unify_type(type)
36
43
  end
@@ -18,6 +18,7 @@ module RubyModKit
18
18
  attr_accessor :flags #: Hash[Symbol, bool]
19
19
 
20
20
  # @rbs return: void
21
+ # @return [void]
21
22
  def initialize
22
23
  @def_parents_memo = {}
23
24
  @methods_memo = {}
@@ -28,6 +29,8 @@ module RubyModKit
28
29
 
29
30
  # @rbs offset_diff: OffsetDiff
30
31
  # @rbs return: void
32
+ # @param offset_diff [OffsetDiff]
33
+ # @return [void]
31
34
  def succ(offset_diff)
32
35
  [@methods_memo, @parameters_memo, @def_parents_memo, @overloads_memo].each do |offset_node_memo|
33
36
  new_offset_node_memo = {}
@@ -42,12 +45,16 @@ module RubyModKit
42
45
 
43
46
  # @rbs def_parent_node: Node::DefParentNode
44
47
  # @rbs return: Memo::DefParentMemo
48
+ # @param def_parent_node [Node::DefParentNode]
49
+ # @return [Memo::DefParentMemo]
45
50
  def def_parent_memo(def_parent_node)
46
51
  @def_parents_memo[def_parent_node.offset] ||= Memo::DefParentMemo.new(def_parent_node)
47
52
  end
48
53
 
49
54
  # @rbs def_node: Node::DefNode
50
55
  # @rbs return: Memo::MethodMemo
56
+ # @param def_node [Node::DefNode]
57
+ # @return [Memo::MethodMemo]
51
58
  def method_memo(def_node)
52
59
  @methods_memo[def_node.offset] ||= Memo::MethodMemo.new(def_node)
53
60
  end
@@ -55,12 +62,17 @@ module RubyModKit
55
62
  # @rbs offset: Integer
56
63
  # @rbs name: Symbol
57
64
  # @rbs return: Memo::OverloadMemo
65
+ # @param offset [Integer]
66
+ # @param name [Symbol]
67
+ # @return [Memo::OverloadMemo]
58
68
  def overload_memo(offset, name)
59
69
  @overloads_memo[offset] ||= Memo::OverloadMemo.new(offset, name)
60
70
  end
61
71
 
62
72
  # @rbs node: Node::BaseNode
63
73
  # @rbs return: Memo::ParameterMemo
74
+ # @param node [Node::BaseNode]
75
+ # @return [Memo::ParameterMemo]
64
76
  def parameter_memo(node)
65
77
  memo = @parameters_memo[node.offset] ||= Memo::ParameterMemo.new(node.offset)
66
78
  def_node = node.def_node_at(node.offset)
@@ -68,5 +80,27 @@ module RubyModKit
68
80
 
69
81
  method_memo(def_node).add_parameter(memo)
70
82
  end
83
+
84
+ # @rbs (Memo::ParameterMemo) -> void
85
+ # | (Memo::MethodMemo) -> void
86
+ def delete(*args)
87
+ case args
88
+ in [Memo::ParameterMemo => parameter_memo]
89
+ @parameters_memo.delete(parameter_memo.offset)
90
+ in [Memo::MethodMemo => method_memo]
91
+ method_memo.parameters.each do |parameter_memo| # rubocop:disable Lint/ShadowingOuterLocalVariable
92
+ delete(parameter_memo)
93
+ end
94
+ @methods_memo.delete(method_memo.offset)
95
+ end
96
+ end
97
+
98
+ # @rbs &block: (Memo::ParameterMemo) -> void
99
+ # @rbs return: void
100
+ # @param block [(Memo::ParameterMemo) -> void]
101
+ # @return [void]
102
+ def each_parameter_memo(&block)
103
+ parameters_memo.each_value(&block)
104
+ end
71
105
  end
72
106
  end
@@ -7,12 +7,10 @@ module RubyModKit
7
7
  class Mission
8
8
  # @rbs _generation: Generation
9
9
  # @rbs return: void
10
+ # @param _generation [Generation]
11
+ # @return [void]
10
12
  def perform(_generation)
11
13
  raise RubyModKit::Error, "Unexpected type #{self.class}"
12
14
  end
13
-
14
- # @rbs offset_diff: OffsetDiff
15
- # @rbs return: void
16
- def succ(offset_diff); end
17
15
  end
18
16
  end
@@ -14,6 +14,7 @@ module RubyModKit
14
14
  attr_reader :prev #: Node::BaseNode | nil
15
15
 
16
16
  # @rbs return: Prism::Location
17
+ # @return [Prism::Location]
17
18
  def location
18
19
  return @location if defined?(@location)
19
20
 
@@ -21,6 +22,7 @@ module RubyModKit
21
22
  end
22
23
 
23
24
  # @rbs return: Array[Node::BaseNode]
25
+ # @return [Array<Node::BaseNode>]
24
26
  def children
25
27
  return @children if @children
26
28
 
@@ -33,11 +35,15 @@ module RubyModKit
33
35
  # @rbs prism_node: Prism::Node
34
36
  # @rbs prev: Node::BaseNode | nil
35
37
  # @rbs return: Node::BaseNode
38
+ # @param prism_node [Prism::Node]
39
+ # @param prev [Node::BaseNode, nil]
40
+ # @return [Node::BaseNode]
36
41
  def wrap(prism_node, prev: nil)
37
42
  Node.wrap(prism_node, parent: self, prev: prev)
38
43
  end
39
44
 
40
45
  # @rbs return: Array[Node::BaseNode]
46
+ # @return [Array<Node::BaseNode>]
41
47
  def ancestors
42
48
  return @ancestors if @ancestors
43
49
 
@@ -49,18 +55,22 @@ module RubyModKit
49
55
  end
50
56
  end
51
57
 
52
- # @rbs return: nil | BaseNode
58
+ # @rbs return: BaseNode | nil
59
+ # @return [BaseNode, nil]
53
60
  def parent
54
61
  raise(RubyModKit::Error)
55
62
  end
56
63
 
57
64
  # @rbs return: Symbol
65
+ # @return [Symbol]
58
66
  def name
59
67
  raise(RubyModKit::Error, "Expected ParameterNode but #{self.class}:#{prism_node.inspect}")
60
68
  end
61
69
 
62
70
  # @rbs offset: Integer
63
71
  # @rbs return: Node::BaseNode | nil
72
+ # @param offset [Integer]
73
+ # @return [Node::BaseNode, nil]
64
74
  def node_at(offset)
65
75
  return nil unless include?(offset)
66
76
 
@@ -70,6 +80,8 @@ module RubyModKit
70
80
 
71
81
  # @rbs offset: Integer
72
82
  # @rbs return: Node::StatementsNode | nil
83
+ # @param offset [Integer]
84
+ # @return [Node::StatementsNode, nil]
73
85
  def statements_node_at(offset)
74
86
  node = node_at(offset) || return
75
87
  [node, *node.ancestors].each { return _1 if _1.is_a?(Node::StatementsNode) }
@@ -78,6 +90,8 @@ module RubyModKit
78
90
 
79
91
  # @rbs offset: Integer
80
92
  # @rbs return: Node::DefNode | nil
93
+ # @param offset [Integer]
94
+ # @return [Node::DefNode, nil]
81
95
  def def_node_at(offset)
82
96
  node = node_at(offset) || return
83
97
  [node, *node.ancestors].each { return _1 if _1.is_a?(Node::DefNode) }
@@ -86,6 +100,8 @@ module RubyModKit
86
100
 
87
101
  # @rbs offset: Integer
88
102
  # @rbs return: Node::ParameterNode | nil
103
+ # @param offset [Integer]
104
+ # @return [Node::ParameterNode, nil]
89
105
  def parameter_node_at(offset)
90
106
  node = node_at(offset) || return
91
107
  [node, *node.ancestors].each { return _1 if _1.is_a?(Node::ParameterNode) }
@@ -93,25 +109,48 @@ module RubyModKit
93
109
  end
94
110
 
95
111
  # @rbs offset: Integer
112
+ # @rbs allowed: Array[Class] | nil
96
113
  # @rbs return: Node::DefParentNode | nil
97
- def def_parent_node_at(offset)
114
+ # @param offset [Integer]
115
+ # @param allowed [Array<Class>, nil]
116
+ # @return [Node::DefParentNode, nil]
117
+ def def_parent_node_at(offset, allowed: nil)
98
118
  node = node_at(offset) || return
99
- [node, *node.ancestors].each { return _1 if _1.is_a?(Node::DefParentNode) }
119
+ [node, *node.ancestors].each do |ancestor_node|
120
+ return ancestor_node if ancestor_node.is_a?(Node::DefParentNode)
121
+ return nil if allowed && !allowed.include?(ancestor_node.class)
122
+ end
100
123
  nil
101
124
  end
102
125
 
103
126
  # @rbs offset: Integer
104
127
  # @rbs return: bool
128
+ # @param offset [Integer]
129
+ # @return [Boolean]
105
130
  def include?(offset)
106
131
  self.offset <= offset && offset <= prism_node.location.end_offset
107
132
  end
108
133
 
109
134
  # @rbs return: Integer
135
+ # @return [Integer]
110
136
  def offset
111
137
  location.start_offset
112
138
  end
113
139
 
140
+ # @rbs return: Integer
141
+ # @return [Integer]
142
+ def end_offset
143
+ location.end_offset
144
+ end
145
+
146
+ # @rbs return: String
147
+ # @return [String]
148
+ def slice
149
+ location.slice
150
+ end
151
+
114
152
  # @rbs return: String
153
+ # @return [String]
115
154
  def inspect
116
155
  str = +"#<#{self.class} "
117
156
  first = true
@@ -146,6 +185,7 @@ module RubyModKit
146
185
  # :nocov:
147
186
  # This is just for interface definition, must not be called
148
187
  # @rbs return: Prism::Node & Prism::_Node
188
+ # @return [Prism::Node & Prism::_Node]
149
189
  def prism_node
150
190
  raise RubyModKit::Error
151
191
  end
@@ -0,0 +1,35 @@
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
+ # @param prism_node [Prism::BeginNode]
22
+ # @param parent [Node::BaseNode]
23
+ # @param prev [Node::BaseNode, nil]
24
+ # @return [void]
25
+ def initialize(prism_node, parent:, prev: nil)
26
+ @prism_node = prism_node
27
+ @parent = parent
28
+ @prev = prev
29
+ raise RubyModKit::Error unless prism_node.is_a?(Prism::BeginNode)
30
+
31
+ super()
32
+ end
33
+ end
34
+ end
35
+ end
@@ -20,6 +20,10 @@ module RubyModKit
20
20
  # @rbs parent: Node::BaseNode
21
21
  # @rbs prev: Node::BaseNode | nil
22
22
  # @rbs return: void
23
+ # @param prism_node [Prism::CallNode]
24
+ # @param parent [Node::BaseNode]
25
+ # @param prev [Node::BaseNode, nil]
26
+ # @return [void]
23
27
  def initialize(prism_node, parent:, prev: nil)
24
28
  @prism_node = prism_node
25
29
  @parent = parent
@@ -9,6 +9,7 @@ module RubyModKit
9
9
  # @rbs @prism_node: Prism::DefNode
10
10
  # @rbs @parent: Node::BaseNode
11
11
  # @rbs @prev: Node::BaseNode | nil
12
+ # @rbs @body_node: Node::StatementsNode | Node::BeginNode | nil
12
13
 
13
14
  private attr_reader :prism_node #: Prism::DefNode
14
15
  attr_reader :parent #: Node::BaseNode
@@ -18,6 +19,10 @@ module RubyModKit
18
19
  # @rbs parent: Node::BaseNode
19
20
  # @rbs prev: Node::BaseNode | nil
20
21
  # @rbs return: void
22
+ # @param prism_node [Prism::DefNode]
23
+ # @param parent [Node::BaseNode]
24
+ # @param prev [Node::BaseNode, nil]
25
+ # @return [void]
21
26
  def initialize(prism_node, parent:, prev: nil)
22
27
  @prism_node = prism_node
23
28
  @parent = parent
@@ -28,34 +33,65 @@ module RubyModKit
28
33
  end
29
34
 
30
35
  # @rbs return: Symbol
36
+ # @return [Symbol]
31
37
  def name
32
38
  @prism_node.name
33
39
  end
34
40
 
35
41
  # @rbs return: Prism::Location | nil
42
+ # @return [Prism::Location, nil]
36
43
  def body_location
37
44
  prism_node.body&.location
38
45
  end
39
46
 
40
47
  # @rbs return: Prism::Location | nil
48
+ # @return [Prism::Location, nil]
41
49
  def lparen_loc
42
50
  @prism_node.lparen_loc
43
51
  end
44
52
 
45
53
  # @rbs return: Prism::Location | nil
54
+ # @return [Prism::Location, nil]
46
55
  def rparen_loc
47
56
  @prism_node.rparen_loc
48
57
  end
49
58
 
50
59
  # @rbs return: Prism::Location
60
+ # @return [Prism::Location]
51
61
  def name_loc
52
62
  @prism_node.name_loc
53
63
  end
54
64
 
55
65
  # @rbs return: Prism::Location | nil
66
+ # @return [Prism::Location, nil]
56
67
  def end_keyword_loc
57
68
  @prism_node.end_keyword_loc
58
69
  end
70
+
71
+ # @rbs prism_child_node: Prism::Node
72
+ # @rbs prev: Node::BaseNode | nil
73
+ # @rbs return: Node::BaseNode
74
+ # @param prism_child_node [Prism::Node]
75
+ # @param prev [Node::BaseNode, nil]
76
+ # @return [Node::BaseNode]
77
+ def wrap(prism_child_node, prev: nil)
78
+ child_node = super
79
+ if prism_child_node == @prism_node.body
80
+ case child_node
81
+ when Node::StatementsNode, Node::BeginNode
82
+ @body_node = child_node
83
+ end
84
+ end
85
+ child_node
86
+ end
87
+
88
+ # @rbs return: Node::StatementsNode | Node::BeginNode | nil
89
+ # @return [Node::StatementsNode, Node::BeginNode, nil]
90
+ def body_node
91
+ # body_node will be set in #children
92
+ children
93
+ @body_node
94
+ end
59
95
  end
60
96
  end
61
97
  end
@@ -7,7 +7,7 @@ module RubyModKit
7
7
  # Transpiler program node
8
8
  class DefParentNode < Node::BaseNode
9
9
  # @rbs @prism_node: Prism::ClassNode | Prism::ModuleNode
10
- # @rbs @body_node: nil | Node::StatementsNode
10
+ # @rbs @body_node: Node::StatementsNode | nil
11
11
  # @rbs @parent: Node::BaseNode
12
12
  # @rbs @prev: Node::BaseNode | nil
13
13
 
@@ -19,6 +19,10 @@ module RubyModKit
19
19
  # @rbs parent: Node::BaseNode
20
20
  # @rbs prev: Node::BaseNode | nil
21
21
  # @rbs return: void
22
+ # @param prism_node [Prism::ClassNode, Prism::ModuleNode]
23
+ # @param parent [Node::BaseNode]
24
+ # @param prev [Node::BaseNode, nil]
25
+ # @return [void]
22
26
  def initialize(prism_node, parent:, prev: nil)
23
27
  @prism_node = prism_node
24
28
  @parent = parent
@@ -31,13 +35,17 @@ module RubyModKit
31
35
  # @rbs prism_child_node: Prism::Node
32
36
  # @rbs prev: Node::BaseNode | nil
33
37
  # @rbs return: Node::BaseNode
38
+ # @param prism_child_node [Prism::Node]
39
+ # @param prev [Node::BaseNode, nil]
40
+ # @return [Node::BaseNode]
34
41
  def wrap(prism_child_node, prev: nil)
35
42
  child_node = super
36
43
  @body_node = child_node if prism_child_node == @prism_node.body && child_node.is_a?(Node::StatementsNode)
37
44
  child_node
38
45
  end
39
46
 
40
- # @rbs return: nil | Node::StatementsNode
47
+ # @rbs return: Node::StatementsNode | nil
48
+ # @return [Node::StatementsNode, nil]
41
49
  def body_node
42
50
  # body_node will be set in #children
43
51
  children
@@ -13,7 +13,7 @@ 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
18
  private attr_reader :prism_node #: prism_node
19
19
  attr_reader :parent #: Node::BaseNode
@@ -23,6 +23,10 @@ module RubyModKit
23
23
  # @rbs parent: Node::BaseNode
24
24
  # @rbs prev: Node::BaseNode | nil
25
25
  # @rbs return: void
26
+ # @param prism_node [prism_node]
27
+ # @param parent [Node::BaseNode]
28
+ # @param prev [Node::BaseNode, nil]
29
+ # @return [void]
26
30
  def initialize(prism_node, parent:, prev: nil)
27
31
  @prism_node = prism_node
28
32
  @parent = parent
@@ -30,7 +34,7 @@ module RubyModKit
30
34
  case prism_node
31
35
  when Prism::RequiredParameterNode, Prism::OptionalKeywordParameterNode,
32
36
  Prism::OptionalParameterNode, Prism::RequiredKeywordParameterNode,
33
- Prism::RestParameterNode
37
+ Prism::RestParameterNode, Prism::BlockParameterNode
34
38
  super()
35
39
  else
36
40
  raise RubyModKit::Error, "unexpected prism node #{prism_node.class}"
@@ -38,6 +42,7 @@ module RubyModKit
38
42
  end
39
43
 
40
44
  # @rbs return: Symbol | nil
45
+ # @return [Symbol, nil]
41
46
  def name
42
47
  @prism_node.name
43
48
  end
@@ -12,6 +12,8 @@ module RubyModKit
12
12
 
13
13
  # @rbs prism_node: Prism::ProgramNode
14
14
  # @rbs return: void
15
+ # @param prism_node [Prism::ProgramNode]
16
+ # @return [void]
15
17
  def initialize(prism_node)
16
18
  @prism_node = prism_node
17
19
  raise RubyModKit::Error unless prism_node.is_a?(Prism::ProgramNode)
@@ -20,6 +22,7 @@ module RubyModKit
20
22
  end
21
23
 
22
24
  # @rbs return: nil
25
+ # @return [nil]
23
26
  def parent
24
27
  nil
25
28
  end
@@ -18,6 +18,10 @@ module RubyModKit
18
18
  # @rbs parent: Node::BaseNode
19
19
  # @rbs prev: Node::BaseNode | nil
20
20
  # @rbs return: void
21
+ # @param prism_node [Prism::StatementsNode]
22
+ # @param parent [Node::BaseNode]
23
+ # @param prev [Node::BaseNode, nil]
24
+ # @return [void]
21
25
  def initialize(prism_node, parent:, prev: nil)
22
26
  @prism_node = prism_node
23
27
  @parent = parent