module SyntaxTree::Ternaryable

def call(q, node)

def call(q, node)
  return false if ENV["STREE_FAST_FORMAT"] || q.disable_auto_ternary?
  # If this is a conditional inside of a parentheses as the only content,
  # then we don't want to transform it into a ternary. Presumably the user
  # wanted it to be an explicit conditional because there are parentheses
  # around it. So we'll just leave it in place.
  grandparent = q.grandparent
  if grandparent.is_a?(Paren) && (body = grandparent.contents.body) &&
       body.length == 1 && body.first == node
    return false
  end
  # Otherwise, we'll check the type of predicate. For certain nodes we
  # want to force it to not be a ternary, like if the predicate is an
  # assignment because it's hard to read.
  case node.predicate
  when Assign, Binary, Command, CommandCall, MAssign, OpAssign
    return false
  when Not
    return false unless node.predicate.parentheses?
  end
  # If there's no Else, then this can't be represented as a ternary.
  return false unless node.consequent.is_a?(Else)
  truthy_body = node.statements.body
  falsy_body = node.consequent.statements.body
  (truthy_body.length == 1) && ternaryable?(truthy_body.first) &&
    (falsy_body.length == 1) && ternaryable?(falsy_body.first)
end