ruby_mod_kit 0.0.2 → 0.0.4

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