class I18n::Tasks::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/tasks/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/tasks/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/tasks/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/tasks/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/tasks/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/tasks/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&.any? { |r| r == receiver }
  # always invoke handler_missing to get nested translations in children
  handler_missing send_node
  nil
end