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.
410
411
412
|
# File 'lib/fast.rb', line 410
def initialize(token)
self.token = token
end
|
Instance Attribute Details
#token ⇒ Object
Returns the value of attribute token.
409
410
411
|
# File 'lib/fast.rb', line 409
def token
@token
end
|
Instance Method Details
#==(other) ⇒ Object
457
458
459
460
461
|
# File 'lib/fast.rb', line 457
def ==(other)
return false if other.nil? || !other.respond_to?(:token)
token == other.token
end
|
#compare_symbol_or_head(expression, node) ⇒ Object
432
433
434
435
436
437
438
439
440
441
|
# File 'lib/fast.rb', line 432
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
449
450
451
|
# File 'lib/fast.rb', line 449
def debug(expression, node, match)
puts "#{expression} == #{node} # => #{match}"
end
|
#debug_match_recursive(expression, node) ⇒ Object
443
444
445
446
447
|
# File 'lib/fast.rb', line 443
def debug_match_recursive(expression, node)
match = original_match_recursive(expression, node)
debug(expression, node, match)
match
end
|
#match?(node) ⇒ Boolean
414
415
416
|
# File 'lib/fast.rb', line 414
def match?(node)
match_recursive(valuate(token), node)
end
|
#match_recursive(expression, node) ⇒ Object
418
419
420
421
422
423
424
425
426
427
428
429
430
|
# File 'lib/fast.rb', line 418
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
453
454
455
|
# File 'lib/fast.rb', line 453
def to_s
"f[#{[*token].map(&:to_s).join(', ')}]"
end
|