class I18n::Processes::Scanners::RubyAstCallFinder
Public Class Methods
new(receiver_messages:)
click to toggle source
@param receiver_messages [Set<Pair<[nil, AST::Node>, Symbol>>] The receiver-message pairs to look for.
Calls superclass method
# File lib/i18n/processes/scanners/ruby_ast_call_finder.rb, line 10 def initialize(receiver_messages:) super() @message_receivers = receiver_messages.each_with_object({}) do |(receiver, message), t| (t[message] ||= []) << receiver end end
Public Instance Methods
collect_calls(root_node) { |send_node, method_name| ... }
click to toggle source
@param root_node (see find_calls
) @yieldparam (see find_calls
) @return [Array<block return values excluding nils>]
# File lib/i18n/processes/scanners/ruby_ast_call_finder.rb, line 30 def collect_calls(root_node) results = [] find_calls root_node do |send_node, method_name| result = yield send_node, method_name results << result if result end results end
find_calls(root_node, &block)
click to toggle source
@param root_node [Parser::AST:Node] @yieldparam send_node [Parser::AST:Node] @yieldparam method_name [nil, String] the surrounding method's name.
# File lib/i18n/processes/scanners/ruby_ast_call_finder.rb, line 20 def find_calls(root_node, &block) @callback = block process root_node ensure @callback = nil end
handler_missing(node)
click to toggle source
# File lib/i18n/processes/scanners/ruby_ast_call_finder.rb, line 57 def handler_missing(node) node.children.each { |child| process(child) if child.is_a?(::Parser::AST::Node) } nil end
on_def(node)
click to toggle source
# File lib/i18n/processes/scanners/ruby_ast_call_finder.rb, line 39 def on_def(node) @method_name = node.children[0] handler_missing node ensure @method_name = nil end
on_send(send_node)
click to toggle source
# File lib/i18n/processes/scanners/ruby_ast_call_finder.rb, line 46 def on_send(send_node) receiver = send_node.children[0] message = send_node.children[1] valid_receivers = @message_receivers[message] # use `any?` because `include?` checks type equality, but the receiver is a Parser::AST::Node != AST::Node. @callback.call(send_node, @method_name) if valid_receivers && valid_receivers.any? { |r| r == receiver } # always invoke handler_missing to get nested translations in children handler_missing send_node nil end