ruby_mod_kit 0.0.4 → 0.0.6

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