Class: Fast::Find
- Inherits:
-
Object
show all
- Defined in:
- lib/fast.rb
Overview
Find is the top level class that respond to #match?(node) interface. It matches recurively and check deeply depends of the token type.
Direct Known Subclasses
All, Any, Capture, FindFromArgument, FindString, FindWithCapture, InstanceMethodCall, Maybe, MethodCall, Not, Parent
Instance Attribute Summary collapse
Instance Method Summary
collapse
Constructor Details
#initialize(token) ⇒ Find
Returns a new instance of Find.
315
316
317
|
# File 'lib/fast.rb', line 315
def initialize(token)
self.token = token
end
|
Instance Attribute Details
#token ⇒ Object
Returns the value of attribute token.
314
315
316
|
# File 'lib/fast.rb', line 314
def token
@token
end
|
Instance Method Details
#==(other) ⇒ Object
362
363
364
365
366
|
# File 'lib/fast.rb', line 362
def ==(other)
return false if other.nil? || !other.respond_to?(:token)
token == other.token
end
|
#compare_symbol_or_head(expression, node) ⇒ Object
337
338
339
340
341
342
343
344
345
346
|
# File 'lib/fast.rb', line 337
def compare_symbol_or_head(expression, node)
case node
when Parser::AST::Node
node.type == expression.to_sym
when String
node == expression.to_s
else
node == expression
end
end
|
#debug(expression, node, match) ⇒ Object
354
355
356
|
# File 'lib/fast.rb', line 354
def debug(expression, node, match)
puts "#{expression} == #{node} # => #{match}"
end
|
#debug_match_recursive(expression, node) ⇒ Object
348
349
350
351
352
|
# File 'lib/fast.rb', line 348
def debug_match_recursive(expression, node)
match = original_match_recursive(expression, node)
debug(expression, node, match)
match
end
|
#match?(node) ⇒ Boolean
319
320
321
|
# File 'lib/fast.rb', line 319
def match?(node)
match_recursive(valuate(token), node)
end
|
#match_recursive(expression, node) ⇒ Object
323
324
325
326
327
328
329
330
331
332
333
334
335
|
# File 'lib/fast.rb', line 323
def match_recursive(expression, node)
case expression
when Proc then expression.call(node)
when Find then expression.match?(node)
when Symbol then compare_symbol_or_head(expression, node)
when Enumerable
expression.each_with_index.all? do |exp, i|
match_recursive(exp, i.zero? ? node : node.children[i - 1])
end
else
node == expression
end
end
|
#to_s ⇒ Object
358
359
360
|
# File 'lib/fast.rb', line 358
def to_s
"f[#{[*token].map(&:to_s).join(', ')}]"
end
|