ruby_mod_kit 0.0.3 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby_mod_kit.yml +5 -0
- data/README.md +89 -0
- data/lib/ruby_mod_kit/cli.rb +17 -2
- data/lib/ruby_mod_kit/config.rb +53 -0
- data/lib/ruby_mod_kit/core_ext/eval.rb +6 -10
- data/lib/ruby_mod_kit/corrector.rb +4 -3
- data/lib/ruby_mod_kit/corrector_manager.rb +18 -18
- data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rb +5 -7
- data/lib/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rb +4 -11
- data/lib/ruby_mod_kit/feature/overload/overload_mission.rb +8 -12
- data/lib/ruby_mod_kit/feature/type/check/arguments/add_arguments_checker_mission.rb +56 -0
- data/lib/ruby_mod_kit/feature/type/check/arguments.rb +23 -0
- data/lib/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rb +20 -12
- data/lib/ruby_mod_kit/feature/type/parameter_arrow_corrector.rb +35 -19
- data/lib/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rb +49 -0
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rb +12 -7
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rb +7 -8
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rb +6 -9
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rb +9 -10
- data/lib/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rb +5 -7
- data/lib/ruby_mod_kit/feature/type/rbs_inline.rb +3 -0
- data/lib/ruby_mod_kit/feature/type/return_value_colon_corrector.rb +5 -6
- data/lib/ruby_mod_kit/feature/type/type_attr_mission.rb +13 -17
- data/lib/ruby_mod_kit/feature/type/yard/type_parameter_mission.rb +35 -0
- data/lib/ruby_mod_kit/feature/type/yard/type_return_mission.rb +30 -0
- data/lib/ruby_mod_kit/feature/type/yard.rb +31 -0
- data/lib/ruby_mod_kit/feature.rb +0 -6
- data/lib/ruby_mod_kit/generation.rb +83 -39
- data/lib/ruby_mod_kit/memo/ivar_memo.rb +4 -0
- data/lib/ruby_mod_kit/memo/overload_memo.rb +1 -0
- data/lib/ruby_mod_kit/memo/parameter_memo.rb +4 -2
- data/lib/ruby_mod_kit/memo.rb +0 -2
- data/lib/ruby_mod_kit/memo_pad.rb +9 -0
- data/lib/ruby_mod_kit/mission.rb +1 -8
- data/lib/ruby_mod_kit/node/base_node.rb +39 -12
- data/lib/ruby_mod_kit/node/begin_node.rb +31 -0
- data/lib/ruby_mod_kit/node/call_node.rb +1 -1
- data/lib/ruby_mod_kit/node/def_node.rb +1 -1
- data/lib/ruby_mod_kit/node/def_parent_node.rb +13 -6
- data/lib/ruby_mod_kit/node/parameter_node.rb +3 -3
- data/lib/ruby_mod_kit/node/program_node.rb +6 -1
- data/lib/ruby_mod_kit/node/statements_node.rb +1 -1
- data/lib/ruby_mod_kit/node/symbol_node.rb +2 -1
- data/lib/ruby_mod_kit/node/untyped_node.rb +1 -1
- data/lib/ruby_mod_kit/node/wrap.rb +3 -1
- data/lib/ruby_mod_kit/node.rb +1 -2
- data/lib/ruby_mod_kit/version.rb +1 -1
- data/lib/ruby_mod_kit.rb +11 -11
- data/ruby_mod_kit.gemspec +7 -1
- data/sig/generated/ruby_mod_kit/cli.rbs +5 -0
- data/sig/generated/ruby_mod_kit/config.rbs +21 -0
- data/sig/generated/ruby_mod_kit/core_ext/eval.rbs +4 -2
- data/sig/generated/ruby_mod_kit/corrector.rbs +4 -3
- data/sig/generated/ruby_mod_kit/corrector_manager.rbs +3 -7
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_corrector.rbs +1 -3
- data/sig/generated/ruby_mod_kit/feature/instance_variable_parameter/instance_variable_parameter_mission.rbs +1 -8
- data/sig/generated/ruby_mod_kit/feature/overload/overload_mission.rbs +1 -4
- data/sig/generated/ruby_mod_kit/feature/type/check/arguments/add_arguments_checker_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/check/arguments.rbs +15 -0
- data/sig/generated/ruby_mod_kit/feature/type/instance_variable_colon_corrector.rbs +7 -3
- data/sig/generated/ruby_mod_kit/feature/type/parameter_arrow_corrector.rbs +8 -9
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/add_magic_comment_mission.rbs +21 -0
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_attr_mission.rbs +1 -4
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_instance_variable_mission.rbs +1 -4
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_overload_mission.rbs +1 -4
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_parameter_mission.rbs +1 -4
- data/sig/generated/ruby_mod_kit/feature/type/rbs_inline/type_return_mission.rbs +1 -4
- data/sig/generated/ruby_mod_kit/feature/type/return_value_colon_corrector.rbs +1 -3
- data/sig/generated/ruby_mod_kit/feature/type/type_attr_mission.rbs +3 -4
- data/sig/generated/ruby_mod_kit/feature/type/yard/type_parameter_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/yard/type_return_mission.rbs +16 -0
- data/sig/generated/ruby_mod_kit/feature/type/yard.rbs +17 -0
- data/sig/generated/ruby_mod_kit/feature.rbs +0 -4
- data/sig/generated/ruby_mod_kit/generation.rbs +55 -15
- data/sig/generated/ruby_mod_kit/memo/ivar_memo.rbs +8 -0
- data/sig/generated/ruby_mod_kit/memo/overload_memo.rbs +2 -0
- data/sig/generated/ruby_mod_kit/memo/parameter_memo.rbs +6 -2
- data/sig/generated/ruby_mod_kit/memo_pad.rbs +8 -0
- data/sig/generated/ruby_mod_kit/mission.rbs +1 -8
- data/sig/generated/ruby_mod_kit/node/base_node.rbs +22 -8
- data/sig/generated/ruby_mod_kit/node/begin_node.rbs +26 -0
- data/sig/generated/ruby_mod_kit/node/def_parent_node.rbs +5 -0
- data/sig/generated/ruby_mod_kit/node/parameter_node.rbs +1 -1
- data/sig/generated/ruby_mod_kit/node/program_node.rbs +3 -0
- data/sig/generated/ruby_mod_kit/node/symbol_node.rbs +2 -0
- data/sig/generated/ruby_mod_kit.rbs +6 -3
- data/sig/yaml.rbs +3 -0
- metadata +21 -5
- data/sig/generated/ruby_mod_kit/memo.rbs +0 -7
- data/sig/generated/ruby_mod_kit/node.rbs +0 -7
@@ -5,7 +5,6 @@
|
|
5
5
|
module RubyModKit
|
6
6
|
# The class of transpiler generation.
|
7
7
|
class Generation
|
8
|
-
# @rbs @parse_result: Prism::ParseResult
|
9
8
|
# @rbs @script: String
|
10
9
|
# @rbs @missions: Array[Mission]
|
11
10
|
# @rbs @memo_pad: MemoPad
|
@@ -15,36 +14,46 @@ module RubyModKit
|
|
15
14
|
# @rbs @filename: String | nil
|
16
15
|
# @rbs @corrector_manager: CorrectorManager
|
17
16
|
# @rbs @features: Array[Feature]
|
17
|
+
# @rbs @config: Config
|
18
|
+
# @rbs @errors: Array[Prism::ParseError]
|
19
|
+
# @rbs @lines: Array[String]
|
20
|
+
# @rbs @offsets: Array[Integer]
|
21
|
+
# @rbs @source: String
|
18
22
|
|
19
|
-
attr_reader :parse_result #: Prism::ParseResult
|
20
23
|
attr_reader :script #: String
|
24
|
+
attr_reader :memo_pad #: MemoPad
|
25
|
+
attr_reader :root_node #: Node::ProgramNode
|
26
|
+
attr_reader :errors #: Array[Prism::ParseError]
|
27
|
+
attr_reader :lines #: Array[String]
|
28
|
+
attr_reader :offsets #: Array[Integer]
|
21
29
|
|
22
30
|
# @rbs script: String
|
23
31
|
# @rbs missions: Array[Mission]
|
24
32
|
# @rbs memo_pad: MemoPad | nil
|
25
33
|
# @rbs generation_num: Integer
|
34
|
+
# @rbs config: Config | nil
|
26
35
|
# @rbs filename: String | nil
|
27
36
|
# @rbs corrector_manager: CorrectorManager | nil
|
28
37
|
# @rbs features: Array[Feature] | nil
|
29
38
|
# @rbs return: void
|
30
|
-
def initialize(script, missions: [], memo_pad: nil, generation_num: 0,
|
39
|
+
def initialize(script, missions: [], memo_pad: nil, generation_num: 0, config: nil,
|
31
40
|
filename: nil, corrector_manager: nil, features: nil)
|
32
41
|
@script = script
|
33
42
|
@missions = missions
|
34
43
|
@generation_num = generation_num
|
35
44
|
@filename = filename
|
36
|
-
@
|
37
|
-
|
38
|
-
Feature::Overload.new,
|
39
|
-
Feature::Type.new,
|
40
|
-
Feature::Type::RbsInline.new,
|
41
|
-
].sort
|
45
|
+
@config = config || Config.new
|
46
|
+
@features = features || @config.features
|
42
47
|
|
43
48
|
@memo_pad = memo_pad || MemoPad.new
|
44
49
|
@corrector_manager = corrector_manager || CorrectorManager.new(@features)
|
45
50
|
@offset_diff = OffsetDiff.new
|
46
|
-
|
47
|
-
@
|
51
|
+
parse_result = Prism.parse(@script)
|
52
|
+
@errors = parse_result.errors
|
53
|
+
@lines = parse_result.source.lines
|
54
|
+
@offsets = parse_result.source.offsets
|
55
|
+
@source = @script.dup
|
56
|
+
@root_node = Node::ProgramNode.new(parse_result.value)
|
48
57
|
init_missions
|
49
58
|
end
|
50
59
|
|
@@ -66,14 +75,11 @@ module RubyModKit
|
|
66
75
|
|
67
76
|
# @rbs return: Generation
|
68
77
|
def succ
|
69
|
-
if @
|
78
|
+
if @errors.empty?
|
70
79
|
perform_missions
|
71
80
|
else
|
72
81
|
perform_corrector
|
73
82
|
end
|
74
|
-
@missions.each do |mission|
|
75
|
-
mission.succ(@offset_diff)
|
76
|
-
end
|
77
83
|
@memo_pad.succ(@offset_diff)
|
78
84
|
|
79
85
|
Generation.new(
|
@@ -84,6 +90,7 @@ module RubyModKit
|
|
84
90
|
filename: @filename,
|
85
91
|
corrector_manager: @corrector_manager,
|
86
92
|
features: @features,
|
93
|
+
config: @config,
|
87
94
|
)
|
88
95
|
end
|
89
96
|
|
@@ -94,7 +101,7 @@ module RubyModKit
|
|
94
101
|
|
95
102
|
# @rbs return: bool
|
96
103
|
def completed?
|
97
|
-
@
|
104
|
+
@errors.empty? && @missions.empty?
|
98
105
|
end
|
99
106
|
|
100
107
|
# @rbs src_offset: Integer
|
@@ -107,18 +114,10 @@ module RubyModKit
|
|
107
114
|
@offset_diff.insert(src_offset, diff)
|
108
115
|
end
|
109
116
|
|
110
|
-
# @rbs src_range: Range[Integer]
|
117
|
+
# @rbs src_range: Range[Integer | nil]
|
111
118
|
# @rbs return: String
|
112
119
|
def [](src_range)
|
113
|
-
|
114
|
-
@script[dst_range] || raise(RubyModKit::Error, "Invalid range")
|
115
|
-
end
|
116
|
-
|
117
|
-
# @rbs offset: Integer
|
118
|
-
# @rbs return: String
|
119
|
-
def line_by_offset(offset)
|
120
|
-
offset = @offset_diff[offset]
|
121
|
-
(@script.match(/.*\n?/, offset) && Regexp.last_match(0)) || raise(RubyModKit::Error)
|
120
|
+
@source[src_range] || raise(RubyModKit::Error, "Invalid range")
|
122
121
|
end
|
123
122
|
|
124
123
|
# @rbs (Integer) -> String
|
@@ -138,53 +137,97 @@ module RubyModKit
|
|
138
137
|
# @rbs line_num: Integer
|
139
138
|
# @rbs return: String
|
140
139
|
def line__overload0(line_num)
|
141
|
-
|
140
|
+
@lines[line_num] || raise(RubyModKit::Error)
|
142
141
|
end
|
143
142
|
|
144
143
|
# @rbs node: Node::BaseNode
|
145
144
|
# @rbs return: String
|
146
145
|
def line__overload1(node)
|
147
|
-
line(node.
|
146
|
+
line(node.location.start_line - 1)
|
148
147
|
end
|
149
148
|
|
150
149
|
# @rbs parse_error: Prism::ParseError
|
151
150
|
# @rbs return: String
|
152
151
|
def line__overload2(parse_error)
|
153
152
|
line(parse_error.location.start_line - 1)
|
153
|
+
rescue RubyModKit::Error
|
154
|
+
""
|
154
155
|
end
|
155
156
|
|
156
157
|
# @rbs (Integer) -> (Integer | nil)
|
158
|
+
# | (Node::BaseNode) -> (Integer | nil)
|
159
|
+
# | (Node::BaseNode, Integer) -> (Integer | nil)
|
157
160
|
# | (Prism::ParseError) -> (Integer | nil)
|
158
|
-
def
|
161
|
+
def line_offset(*args)
|
159
162
|
case args
|
160
163
|
in [Integer]
|
161
|
-
|
164
|
+
line_offset__overload0(*args)
|
165
|
+
in [Node::BaseNode]
|
166
|
+
line_offset__overload1(*args)
|
167
|
+
in [Node::BaseNode, Integer]
|
168
|
+
line_offset__overload2(*args)
|
162
169
|
in [Prism::ParseError]
|
163
|
-
|
170
|
+
line_offset__overload3(*args)
|
164
171
|
end
|
165
172
|
end
|
166
173
|
|
167
174
|
# @rbs line_num: Integer
|
168
175
|
# @rbs return: Integer | nil
|
169
|
-
def
|
170
|
-
|
176
|
+
def line_offset__overload0(line_num)
|
177
|
+
@offsets[line_num]
|
178
|
+
end
|
179
|
+
|
180
|
+
# @rbs node: Node::BaseNode
|
181
|
+
# @rbs return: Integer | nil
|
182
|
+
def line_offset__overload1(node)
|
183
|
+
line_offset(node, 0)
|
184
|
+
end
|
185
|
+
|
186
|
+
# @rbs node: Node::BaseNode
|
187
|
+
# @rbs line_offset: Integer
|
188
|
+
# @rbs return: Integer | nil
|
189
|
+
def line_offset__overload2(node, line_offset)
|
190
|
+
line_offset(node.location.start_line - 1 + line_offset)
|
171
191
|
end
|
172
192
|
|
173
193
|
# @rbs parse_error: Prism::ParseError
|
174
194
|
# @rbs return: Integer | nil
|
175
|
-
def
|
176
|
-
|
195
|
+
def line_offset__overload3(parse_error)
|
196
|
+
line_offset(parse_error.location.start_line - 1)
|
197
|
+
end
|
198
|
+
|
199
|
+
# @rbs (Integer) -> String
|
200
|
+
# | (Node::BaseNode) -> String
|
201
|
+
def line_indent(*args)
|
202
|
+
case args
|
203
|
+
in [Integer]
|
204
|
+
line_indent__overload0(*args)
|
205
|
+
in [Node::BaseNode]
|
206
|
+
line_indent__overload1(*args)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# @rbs line_num: Integer
|
211
|
+
# @rbs return: String
|
212
|
+
def line_indent__overload0(line_num)
|
213
|
+
line(line_num)[/\A[ \t]*/] || ""
|
214
|
+
end
|
215
|
+
|
216
|
+
# @rbs node: Node::BaseNode
|
217
|
+
# @rbs return: String
|
218
|
+
def line_indent__overload1(node)
|
219
|
+
line_indent(node.location.start_line - 1)
|
177
220
|
end
|
178
221
|
|
179
222
|
# @rbs return: void
|
180
223
|
def perform_corrector
|
181
|
-
@corrector_manager.perform(self
|
224
|
+
@corrector_manager.perform(self)
|
182
225
|
end
|
183
226
|
|
184
227
|
# @rbs return: void
|
185
228
|
def perform_missions
|
186
229
|
@missions.delete_if do |mission|
|
187
|
-
mission.perform(self
|
230
|
+
mission.perform(self) || break
|
188
231
|
end
|
189
232
|
end
|
190
233
|
|
@@ -197,9 +240,10 @@ module RubyModKit
|
|
197
240
|
class << self
|
198
241
|
# @rbs src: String
|
199
242
|
# @rbs filename: String | nil
|
243
|
+
# @rbs config: Config | nil
|
200
244
|
# @rbs return: Generation
|
201
|
-
def resolve(src, filename: nil)
|
202
|
-
generation = Generation.new(src.dup, filename: filename)
|
245
|
+
def resolve(src, filename: nil, config: nil)
|
246
|
+
generation = Generation.new(src.dup, filename: filename, config: config)
|
203
247
|
generation = generation.succ until generation.completed?
|
204
248
|
generation
|
205
249
|
end
|
@@ -11,11 +11,15 @@ module RubyModKit
|
|
11
11
|
# @rbs @offset: nil | Integer
|
12
12
|
# @rbs @indent: String
|
13
13
|
# @rbs @name: Symbol
|
14
|
+
# @rbs @visibility: nil | Symbol
|
15
|
+
# @rbs @separator: String
|
14
16
|
|
15
17
|
attr_reader :type #: nil | String
|
16
18
|
attr_reader :attr_kind #: nil | Symbol
|
17
19
|
attr_accessor :offset #: nil | Integer
|
18
20
|
attr_accessor :indent #: String
|
21
|
+
attr_accessor :visibility #: nil | Symbol
|
22
|
+
attr_accessor :separator #: String
|
19
23
|
|
20
24
|
# @rbs name: Symbol
|
21
25
|
# @rbs return: void
|
@@ -8,11 +8,13 @@ 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
19
|
UNTYPED = "untyped"
|
18
20
|
|
data/lib/ruby_mod_kit/memo.rb
CHANGED
@@ -9,11 +9,13 @@ module RubyModKit
|
|
9
9
|
# @rbs @methods_memo: Hash[Integer, Memo::MethodMemo]
|
10
10
|
# @rbs @parameters_memo: Hash[Integer, Memo::ParameterMemo]
|
11
11
|
# @rbs @overloads_memo: Hash[Integer, Memo::OverloadMemo]
|
12
|
+
# @rbs @flags: Hash[Symbol, bool]
|
12
13
|
|
13
14
|
attr_reader :def_parents_memo #: Hash[Integer, Memo::DefParentMemo]
|
14
15
|
attr_reader :methods_memo #: Hash[Integer, Memo::MethodMemo]
|
15
16
|
attr_reader :parameters_memo #: Hash[Integer, Memo::ParameterMemo]
|
16
17
|
attr_reader :overloads_memo #: Hash[Integer, Memo::OverloadMemo]
|
18
|
+
attr_accessor :flags #: Hash[Symbol, bool]
|
17
19
|
|
18
20
|
# @rbs return: void
|
19
21
|
def initialize
|
@@ -21,6 +23,7 @@ module RubyModKit
|
|
21
23
|
@methods_memo = {}
|
22
24
|
@parameters_memo = {}
|
23
25
|
@overloads_memo = {}
|
26
|
+
@flags = Hash.new(false)
|
24
27
|
end
|
25
28
|
|
26
29
|
# @rbs offset_diff: OffsetDiff
|
@@ -65,5 +68,11 @@ module RubyModKit
|
|
65
68
|
|
66
69
|
method_memo(def_node).add_parameter(memo)
|
67
70
|
end
|
71
|
+
|
72
|
+
# @rbs &block: (Memo::ParameterMemo) -> void
|
73
|
+
# @rbs return: void
|
74
|
+
def each_parameter_memo(&block)
|
75
|
+
parameters_memo.each_value(&block)
|
76
|
+
end
|
68
77
|
end
|
69
78
|
end
|
data/lib/ruby_mod_kit/mission.rb
CHANGED
@@ -6,16 +6,9 @@ module RubyModKit
|
|
6
6
|
# The base class of transpiler mission.
|
7
7
|
class Mission
|
8
8
|
# @rbs _generation: Generation
|
9
|
-
# @rbs _root_node: Node::ProgramNode
|
10
|
-
# @rbs _parse_result: Prism::ParseResult
|
11
|
-
# @rbs _memo_pad: MemoPad
|
12
9
|
# @rbs return: void
|
13
|
-
def perform(_generation
|
10
|
+
def perform(_generation)
|
14
11
|
raise RubyModKit::Error, "Unexpected type #{self.class}"
|
15
12
|
end
|
16
|
-
|
17
|
-
# @rbs offset_diff: OffsetDiff
|
18
|
-
# @rbs return: void
|
19
|
-
def succ(offset_diff); end
|
20
13
|
end
|
21
14
|
end
|
@@ -11,11 +11,12 @@ module RubyModKit
|
|
11
11
|
# @rbs @ancestors: Array[Node::BaseNode]
|
12
12
|
# @rbs @prev: Node::BaseNode | nil
|
13
13
|
|
14
|
-
attr_reader :location #: Prism::Location
|
15
14
|
attr_reader :prev #: Node::BaseNode | nil
|
16
15
|
|
17
|
-
# @rbs return:
|
18
|
-
def
|
16
|
+
# @rbs return: Prism::Location
|
17
|
+
def location
|
18
|
+
return @location if defined?(@location)
|
19
|
+
|
19
20
|
@location = prism_node.location
|
20
21
|
end
|
21
22
|
|
@@ -25,15 +26,22 @@ module RubyModKit
|
|
25
26
|
|
26
27
|
prev = nil
|
27
28
|
@children = prism_node.child_nodes.compact.map do |prism_child_node|
|
28
|
-
prev =
|
29
|
+
prev = wrap(prism_child_node, prev: prev)
|
29
30
|
end
|
30
31
|
end
|
31
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
|
+
|
32
40
|
# @rbs return: Array[Node::BaseNode]
|
33
41
|
def ancestors
|
34
42
|
return @ancestors if @ancestors
|
35
43
|
|
36
|
-
parent =
|
44
|
+
parent = self.parent
|
37
45
|
@ancestors = if parent
|
38
46
|
[parent] + parent.ancestors
|
39
47
|
else
|
@@ -41,6 +49,11 @@ module RubyModKit
|
|
41
49
|
end
|
42
50
|
end
|
43
51
|
|
52
|
+
# @rbs return: nil | BaseNode
|
53
|
+
def parent
|
54
|
+
raise(RubyModKit::Error)
|
55
|
+
end
|
56
|
+
|
44
57
|
# @rbs return: Symbol
|
45
58
|
def name
|
46
59
|
raise(RubyModKit::Error, "Expected ParameterNode but #{self.class}:#{prism_node.inspect}")
|
@@ -80,10 +93,14 @@ module RubyModKit
|
|
80
93
|
end
|
81
94
|
|
82
95
|
# @rbs offset: Integer
|
96
|
+
# @rbs allowed: Array[Class] | nil
|
83
97
|
# @rbs return: Node::DefParentNode | nil
|
84
|
-
def def_parent_node_at(offset)
|
98
|
+
def def_parent_node_at(offset, allowed: nil)
|
85
99
|
node = node_at(offset) || return
|
86
|
-
[node, *node.ancestors].each
|
100
|
+
[node, *node.ancestors].each do |ancestor_node|
|
101
|
+
return ancestor_node if ancestor_node.is_a?(Node::DefParentNode)
|
102
|
+
return nil if allowed && !allowed.include?(ancestor_node.class)
|
103
|
+
end
|
87
104
|
nil
|
88
105
|
end
|
89
106
|
|
@@ -93,16 +110,16 @@ module RubyModKit
|
|
93
110
|
self.offset <= offset && offset <= prism_node.location.end_offset
|
94
111
|
end
|
95
112
|
|
96
|
-
# @rbs return: Prism::Node & Prism::_Node
|
97
|
-
def prism_node
|
98
|
-
raise RubyModKit::Error
|
99
|
-
end
|
100
|
-
|
101
113
|
# @rbs return: Integer
|
102
114
|
def offset
|
103
115
|
location.start_offset
|
104
116
|
end
|
105
117
|
|
118
|
+
# @rbs return: String
|
119
|
+
def slice
|
120
|
+
location.slice
|
121
|
+
end
|
122
|
+
|
106
123
|
# @rbs return: String
|
107
124
|
def inspect
|
108
125
|
str = +"#<#{self.class} "
|
@@ -132,6 +149,16 @@ module RubyModKit
|
|
132
149
|
str << ">"
|
133
150
|
str
|
134
151
|
end
|
152
|
+
|
153
|
+
private
|
154
|
+
|
155
|
+
# :nocov:
|
156
|
+
# This is just for interface definition, must not be called
|
157
|
+
# @rbs return: Prism::Node & Prism::_Node
|
158
|
+
def prism_node
|
159
|
+
raise RubyModKit::Error
|
160
|
+
end
|
161
|
+
# :nocov:
|
135
162
|
end
|
136
163
|
end
|
137
164
|
end
|
@@ -0,0 +1,31 @@
|
|
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
|
+
def initialize(prism_node, parent:, prev: nil)
|
22
|
+
@prism_node = prism_node
|
23
|
+
@parent = parent
|
24
|
+
@prev = prev
|
25
|
+
raise RubyModKit::Error unless prism_node.is_a?(Prism::BeginNode)
|
26
|
+
|
27
|
+
super()
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -11,7 +11,7 @@ module RubyModKit
|
|
11
11
|
# @rbs @parent: Node::BaseNode
|
12
12
|
# @rbs @prev: Node::BaseNode | nil
|
13
13
|
|
14
|
-
attr_reader :prism_node #: Prism::CallNode
|
14
|
+
private attr_reader :prism_node #: Prism::CallNode
|
15
15
|
attr_reader :name #: Symbol
|
16
16
|
attr_reader :parent #: Node::BaseNode
|
17
17
|
attr_reader :prev #: Node::BaseNode | nil
|
@@ -10,7 +10,7 @@ module RubyModKit
|
|
10
10
|
# @rbs @parent: Node::BaseNode
|
11
11
|
# @rbs @prev: Node::BaseNode | nil
|
12
12
|
|
13
|
-
attr_reader :prism_node #: Prism::DefNode
|
13
|
+
private attr_reader :prism_node #: Prism::DefNode
|
14
14
|
attr_reader :parent #: Node::BaseNode
|
15
15
|
attr_reader :prev #: Node::BaseNode | nil
|
16
16
|
|
@@ -11,7 +11,7 @@ module RubyModKit
|
|
11
11
|
# @rbs @parent: Node::BaseNode
|
12
12
|
# @rbs @prev: Node::BaseNode | nil
|
13
13
|
|
14
|
-
attr_reader :prism_node #: Prism::ClassNode | Prism::ModuleNode
|
14
|
+
private attr_reader :prism_node #: Prism::ClassNode | Prism::ModuleNode
|
15
15
|
attr_reader :parent #: Node::BaseNode
|
16
16
|
attr_reader :prev #: Node::BaseNode | nil
|
17
17
|
|
@@ -28,13 +28,20 @@ module RubyModKit
|
|
28
28
|
super()
|
29
29
|
end
|
30
30
|
|
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
|
+
|
31
40
|
# @rbs return: nil | Node::StatementsNode
|
32
41
|
def body_node
|
33
|
-
|
34
|
-
|
35
|
-
body_node
|
36
|
-
body_node = nil unless body_node.is_a?(Node::StatementsNode)
|
37
|
-
@body_node = body_node
|
42
|
+
# body_node will be set in #children
|
43
|
+
children
|
44
|
+
@body_node
|
38
45
|
end
|
39
46
|
end
|
40
47
|
end
|
@@ -13,9 +13,9 @@ 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
|
-
attr_reader :prism_node #: prism_node
|
18
|
+
private attr_reader :prism_node #: prism_node
|
19
19
|
attr_reader :parent #: Node::BaseNode
|
20
20
|
attr_reader :prev #: Node::BaseNode | nil
|
21
21
|
|
@@ -30,7 +30,7 @@ module RubyModKit
|
|
30
30
|
case prism_node
|
31
31
|
when Prism::RequiredParameterNode, Prism::OptionalKeywordParameterNode,
|
32
32
|
Prism::OptionalParameterNode, Prism::RequiredKeywordParameterNode,
|
33
|
-
Prism::RestParameterNode
|
33
|
+
Prism::RestParameterNode, Prism::BlockParameterNode
|
34
34
|
super()
|
35
35
|
else
|
36
36
|
raise RubyModKit::Error, "unexpected prism node #{prism_node.class}"
|
@@ -8,7 +8,7 @@ module RubyModKit
|
|
8
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
|
@@ -10,7 +10,7 @@ module RubyModKit
|
|
10
10
|
# @rbs @parent: Node::BaseNode
|
11
11
|
# @rbs @prev: Node::BaseNode | nil
|
12
12
|
|
13
|
-
attr_reader :prism_node #: Prism::StatementsNode
|
13
|
+
private attr_reader :prism_node #: Prism::StatementsNode
|
14
14
|
attr_reader :parent #: Node::BaseNode
|
15
15
|
attr_reader :prev #: Node::BaseNode | nil
|
16
16
|
|
@@ -9,8 +9,9 @@ module RubyModKit
|
|
9
9
|
# @rbs @prism_node: Prism::SymbolNode
|
10
10
|
# @rbs @parent: Node::BaseNode
|
11
11
|
# @rbs @prev: Node::BaseNode | nil
|
12
|
+
# @rbs @value: nil | Symbol
|
12
13
|
|
13
|
-
attr_reader :prism_node #: Prism::SymbolNode
|
14
|
+
private attr_reader :prism_node #: Prism::SymbolNode
|
14
15
|
attr_reader :parent #: Node::BaseNode
|
15
16
|
attr_reader :prev #: Node::BaseNode | nil
|
16
17
|
|
@@ -10,7 +10,7 @@ module RubyModKit
|
|
10
10
|
# @rbs @parent: Node::BaseNode
|
11
11
|
# @rbs @prev: Node::BaseNode | nil
|
12
12
|
|
13
|
-
attr_reader :prism_node #: Prism::Node
|
13
|
+
private attr_reader :prism_node #: Prism::Node
|
14
14
|
attr_reader :parent #: Node::BaseNode
|
15
15
|
attr_reader :prev #: Node::BaseNode | nil
|
16
16
|
|
@@ -20,6 +20,8 @@ module RubyModKit
|
|
20
20
|
# @rbs return: Node::BaseNode
|
21
21
|
def wrap(prism_node, parent:, prev: nil)
|
22
22
|
case prism_node
|
23
|
+
when Prism::BeginNode
|
24
|
+
Node::BeginNode.new(prism_node, parent: parent, prev: prev)
|
23
25
|
when Prism::CallNode
|
24
26
|
Node::CallNode.new(prism_node, parent: parent, prev: prev)
|
25
27
|
when Prism::DefNode
|
@@ -28,7 +30,7 @@ module RubyModKit
|
|
28
30
|
Node::DefParentNode.new(prism_node, parent: parent, prev: prev)
|
29
31
|
when Prism::RequiredParameterNode, Prism::OptionalKeywordParameterNode,
|
30
32
|
Prism::OptionalParameterNode, Prism::RequiredKeywordParameterNode,
|
31
|
-
Prism::RestParameterNode
|
33
|
+
Prism::RestParameterNode, Prism::BlockParameterNode
|
32
34
|
Node::ParameterNode.new(prism_node, parent: parent, prev: prev)
|
33
35
|
when Prism::StatementsNode
|
34
36
|
Node::StatementsNode.new(prism_node, parent: parent, prev: prev)
|
data/lib/ruby_mod_kit/node.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# rbs_inline: enabled
|
4
|
-
|
5
3
|
module RubyModKit
|
6
4
|
# The namespace of transpile node.
|
7
5
|
module Node
|
@@ -9,6 +7,7 @@ module RubyModKit
|
|
9
7
|
end
|
10
8
|
|
11
9
|
require_relative "node/base_node"
|
10
|
+
require_relative "node/begin_node"
|
12
11
|
require_relative "node/symbol_node"
|
13
12
|
require_relative "node/def_parent_node"
|
14
13
|
require_relative "node/call_node"
|
data/lib/ruby_mod_kit/version.rb
CHANGED