class RailsOpenapiGen::Parsers::Jbuilder::Processors::CompositeProcessor

def initialize(file_path, property_parser)

Parameters:
  • property_parser (PropertyCommentParser) -- Parser for property comments
  • file_path (String) -- Path to current file
def initialize(file_path, property_parser)
  super(file_path, property_parser)
  # Initialize sub-processors
  @array_processor = ArrayProcessor.new(file_path, property_parser)
  @object_processor = ObjectProcessor.new(file_path, property_parser)
  @property_processor = PropertyProcessor.new(file_path, property_parser)
  @partial_processor = PartialProcessor.new(file_path, property_parser)
end

def merge_processor_results(processor)

Returns:
  • (void) -

Parameters:
  • processor (BaseProcessor) -- Sub-processor to merge results from
def merge_processor_results(processor)
  # Use getter methods to ensure arrays exist
  properties.concat(processor.properties)
  partials.concat(processor.partials)
  # Clear the sub-processor's results by calling private clear methods
  processor.send(:clear_results)
end

def on_block(node)

Returns:
  • (void) -

Parameters:
  • node (Parser::AST::Node) -- Block node
def on_block(node)
  send_node, args_node, body = node.children
  receiver, method_name, = send_node.children
  if CallDetectors::CacheCallDetector.cache_call?(receiver, method_name) ||
     CallDetectors::CacheCallDetector.cache_if_call?(receiver, method_name)
    # This is json.cache! or json.cache_if! block - just process the block contents
    process(body) if body
  elsif CallDetectors::JsonCallDetector.json_property?(receiver, method_name) && method_name != :array!
    # Check if this is an array iteration block (has block arguments)
    if args_node && args_node.type == :args && args_node.children.any?
      # This is an array iteration block like json.tags @tags do |tag|
      @array_processor.on_block(node)
      merge_processor_results(@array_processor)
    else
      # This is a nested object block like json.profile do
      @object_processor.on_block(node)
      merge_processor_results(@object_processor)
    end
  elsif CallDetectors::ArrayCallDetector.array_call?(receiver, method_name)
    # This is json.array! block
    @array_processor.on_block(node)
    merge_processor_results(@array_processor)
  else
    super
  end
end

def on_send(node)

Returns:
  • (void) -

Parameters:
  • node (Parser::AST::Node) -- Method call node
def on_send(node)
  receiver, method_name, = node.children
  # Skip Jbuilder helper methods - they are not JSON properties
  if CallDetectors::CacheCallDetector.cache_call?(receiver, method_name) ||
     CallDetectors::CacheCallDetector.cache_if_call?(receiver, method_name) ||
     CallDetectors::KeyFormatDetector.key_format?(receiver, method_name) ||
     CallDetectors::NullHandlingDetector.null_handling?(receiver, method_name) ||
     CallDetectors::ObjectManipulationDetector.object_manipulation?(receiver, method_name)
    super
  elsif CallDetectors::ArrayCallDetector.array_call?(receiver, method_name)
    @array_processor.on_send(node)
    merge_processor_results(@array_processor)
  elsif CallDetectors::PartialCallDetector.partial_call?(receiver, method_name)
    @partial_processor.on_send(node)
    merge_processor_results(@partial_processor)
  elsif CallDetectors::JsonCallDetector.json_property?(receiver, method_name)
    @property_processor.on_send(node)
    merge_processor_results(@property_processor)
  end
end