lib/crispr/mutations/ternary.rb



# frozen_string_literal: true

require_relative "base"

module Crispr
  module Mutations
    # Mutates ternary expressions like `cond ? a : b`
    class Ternary < Base
      # Returns mutated AST nodes for ternary expressions.
      #
      # @param node [Parser::AST::Node] the AST node to inspect
      # @return [Array<Parser::AST::Node>] mutated nodes
      def mutations_for(node)
        return [] unless node.is_a?(Parser::AST::Node)
        return [] unless node.type == :if
        return [] unless node.loc.respond_to?(:question) && node.loc.question

        cond, if_branch, else_branch = node.children
        [
          if_branch,
          else_branch,
          cond,
          Parser::AST::Node.new(:if, [cond, else_branch, if_branch]) # swap branches
        ].compact
      end
    end
  end
end