parser_node_ext 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile.lock +2 -1
- data/lib/parser_node_ext/version.rb +1 -1
- data/lib/parser_node_ext.rb +107 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b640f12cdf44e564f22af212354d86e2e76329cb796f68f843ba1ff151bfe1cc
|
4
|
+
data.tar.gz: 17cfcb04b5f079946160fffb800cd919654cf1a837d48629b7102e8941c88dfb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76d8308f1debc8b852d7a6d2bb3f065b6266dbd8a46d844f30135bc0f39ea755afcd7e3685ad25b85fc999bbe497daad1edfa35e26dc9961ba68d92da3d8b1ca
|
7
|
+
data.tar.gz: 1f1d833611f71a5c1c18e58444d799c5e3d491a50dea28495bf14113c47d11014aa7d955f3164a42d89b5c994dee3e911206d1e193e3e99be0d41140ce91e23c
|
data/CHANGELOG.md
ADDED
data/Gemfile.lock
CHANGED
data/lib/parser_node_ext.rb
CHANGED
@@ -203,6 +203,113 @@ module ParserNodeExt
|
|
203
203
|
raise Synvert::Core::MethodNotSupported, "keys is not handled for #{debug_info}"
|
204
204
|
end
|
205
205
|
end
|
206
|
+
|
207
|
+
# Check if :hash node contains specified key.
|
208
|
+
# @example
|
209
|
+
# node # s(:hash, s(:pair, s(:sym, :foo), s(:sym, :bar)))
|
210
|
+
# node.key?(:foo) # true
|
211
|
+
# @param [Symbol, String] key value.
|
212
|
+
# @return [Boolean] true if specified key exists.
|
213
|
+
# @raise [Synvert::Core::MethodNotSupported] if calls on other node.
|
214
|
+
def key?(key)
|
215
|
+
if :hash == type
|
216
|
+
children.any? { |pair_node| pair_node.key.to_value == key }
|
217
|
+
else
|
218
|
+
raise Synvert::Core::MethodNotSupported, "key? is not handled for #{debug_info}"
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
# Get :hash value node according to specified key.
|
223
|
+
# @example
|
224
|
+
# node # s(:hash, s(:pair, s(:sym, :foo), s(:sym, :bar)))
|
225
|
+
# node.hash_value(:foo) # s(:sym, :bar)
|
226
|
+
# @param [Symbol, String] key value.
|
227
|
+
# @return [Parser::AST::Node] hash value of node.
|
228
|
+
# @raise [Synvert::Core::MethodNotSupported] if calls on other node.
|
229
|
+
def hash_value(key)
|
230
|
+
if :hash == type
|
231
|
+
value_node = children.find { |pair_node| pair_node.key.to_value == key }
|
232
|
+
value_node&.value
|
233
|
+
else
|
234
|
+
raise Synvert::Core::MethodNotSupported, "hash_value is not handled for #{debug_info}"
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
# Return the exact value of node.
|
239
|
+
# It supports :array, :begin, :erange, :false, :float, :irange, :int, :str, :sym and :true nodes.
|
240
|
+
# @example
|
241
|
+
# node # s(:array, s(:str, "str"), s(:sym, :str))
|
242
|
+
# node.to_value # ['str', :str]
|
243
|
+
# @return [Object] exact value.
|
244
|
+
# @raise [Synvert::Core::MethodNotSupported] if calls on other node.
|
245
|
+
def to_value
|
246
|
+
case type
|
247
|
+
when :int, :float, :str, :sym
|
248
|
+
children.last
|
249
|
+
when :true
|
250
|
+
true
|
251
|
+
when :false
|
252
|
+
false
|
253
|
+
when :nil
|
254
|
+
nil
|
255
|
+
when :array
|
256
|
+
children.map(&:to_value)
|
257
|
+
when :irange
|
258
|
+
(children.first.to_value..children.last.to_value)
|
259
|
+
when :erange
|
260
|
+
(children.first.to_value...children.last.to_value)
|
261
|
+
when :begin
|
262
|
+
children.first.to_value
|
263
|
+
else
|
264
|
+
self
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
# Get the source code of node.
|
269
|
+
#
|
270
|
+
# @return [String] source code.
|
271
|
+
def to_source
|
272
|
+
loc.expression&.source
|
273
|
+
end
|
274
|
+
|
275
|
+
# Respond key value and source for hash node, e.g.
|
276
|
+
# @example
|
277
|
+
# node # s(:hash, s(:pair, s(:sym, :foo), s(:sym, :bar)))
|
278
|
+
# node.foo_value # :bar
|
279
|
+
# node.foo_source # ":bar"
|
280
|
+
def method_missing(method_name, *args, &block)
|
281
|
+
if :args == type && children.respond_to?(method_name)
|
282
|
+
return children.send(method_name, *args, &block)
|
283
|
+
elsif :hash == type && method_name.to_s.include?('_value')
|
284
|
+
key = method_name.to_s.sub('_value', '')
|
285
|
+
return hash_value(key.to_sym)&.to_value if key?(key.to_sym)
|
286
|
+
return hash_value(key.to_s)&.to_value if key?(key.to_s)
|
287
|
+
|
288
|
+
return nil
|
289
|
+
elsif :hash == type && method_name.to_s.include?('_source')
|
290
|
+
key = method_name.to_s.sub('_source', '')
|
291
|
+
return hash_value(key.to_sym)&.to_source if key?(key.to_sym)
|
292
|
+
return hash_value(key.to_s)&.to_source if key?(key.to_s)
|
293
|
+
|
294
|
+
return nil
|
295
|
+
end
|
296
|
+
|
297
|
+
super
|
298
|
+
end
|
299
|
+
|
300
|
+
def respond_to_missing?(method_name, *args)
|
301
|
+
if :args == type && children.respond_to?(method_name)
|
302
|
+
return true
|
303
|
+
elsif :hash == type && method_name.to_s.include?('_value')
|
304
|
+
key = method_name.to_s.sub('_value', '')
|
305
|
+
return true if key?(key.to_sym) || key?(key.to_s)
|
306
|
+
elsif :hash == type && method_name.to_s.include?('_source')
|
307
|
+
key = method_name.to_s.sub('_source', '')
|
308
|
+
return true if key?(key.to_sym) || key?(key.to_s)
|
309
|
+
end
|
310
|
+
|
311
|
+
super
|
312
|
+
end
|
206
313
|
end
|
207
314
|
end
|
208
315
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser_node_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Richard Huang
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-06-
|
11
|
+
date: 2022-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -33,6 +33,7 @@ extensions: []
|
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
35
|
- ".rspec"
|
36
|
+
- CHANGELOG.md
|
36
37
|
- Gemfile
|
37
38
|
- Gemfile.lock
|
38
39
|
- README.md
|