class RailsOpenapiGen::Parsers::Jbuilder::CallDetectors::ArrayCallDetector

Handles array generation in Jbuilder templates
Detects array calls (json.array!)

def array_call?(receiver, method_name)

Returns:
  • (Boolean) - True if this is an array call

Parameters:
  • method_name (Symbol) -- Method name
  • receiver (Parser::AST::Node, nil) -- Method receiver
def array_call?(receiver, method_name)
  method_name == :array! && json_receiver?(receiver)
end

def category

Returns:
  • (Symbol) - Detector category
def category
  :array
end

def description

Returns:
  • (String) - Description
def description
  "Array calls (json.array!)"
end

def extract_collection(args)

Returns:
  • (Parser::AST::Node, nil) - Collection node

Parameters:
  • args (Array) -- Method arguments
def extract_collection(args)
  args.find { |arg| arg.type != :hash }
end

def extract_options(args)

Returns:
  • (Parser::AST::Node, nil) - Options hash node

Parameters:
  • args (Array) -- Method arguments
def extract_options(args)
  args.find { |arg| arg.type == :hash }
end

def handles?(receiver, method_name, _args = [])

Returns:
  • (Boolean) - True if this is an array call

Parameters:
  • args (Array) -- Method arguments
  • method_name (Symbol) -- Method name
  • receiver (Parser::AST::Node, nil) -- Method receiver node
def handles?(receiver, method_name, _args = [])
  result = array_call?(receiver, method_name)
  if ENV['RAILS_OPENAPI_DEBUG']
    puts "🔍 DEBUG: ArrayCallDetector.handles? for #{method_name}"
    puts "   receiver: #{receiver.inspect}"
    puts "   method_name: #{method_name.inspect}"
    puts "   method_name == :array!: #{method_name == :array!}"
    puts "   json_receiver?: #{json_receiver?(receiver)}"
    puts "   result: #{result}"
  end
  result
end

def has_collection?(args)

Returns:
  • (Boolean) - True if array has collection

Parameters:
  • args (Array) -- Method arguments
def has_collection?(args)
  args.any? && !args.first.type == :hash
end

def has_options?(args)

Returns:
  • (Boolean) - True if array has options

Parameters:
  • args (Array) -- Method arguments
def has_options?(args)
  args.any? { |arg| arg.type == :hash }
end

def has_partial_key?(hash_node)

Returns:
  • (Boolean) - True if hash contains partial key

Parameters:
  • hash_node (Parser::AST::Node) -- Hash node to check
def has_partial_key?(hash_node)
  return false unless hash_node.type == :hash
  hash_node.children.any? do |pair|
    next false unless pair.type == :pair
    key, _value = pair.children
    key.type == :sym && key.children.first == :partial
  end
end

def priority

Returns:
  • (Integer) - Priority value
def priority
  20
end

def uses_partial?(args)

Returns:
  • (Boolean) - True if array uses partial

Parameters:
  • args (Array) -- Method arguments
def uses_partial?(args)
  options = extract_options(args)
  options && has_partial_key?(options)
end