Class: SyntaxTree::ConditionalFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/syntax_tree/node.rb

Overview

Formats an If or Unless node.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(keyword, node) ⇒ ConditionalFormatter

Returns a new instance of ConditionalFormatter.



5089
5090
5091
5092
# File 'lib/syntax_tree/node.rb', line 5089

def initialize(keyword, node)
  @keyword = keyword
  @node = node
end

Instance Attribute Details

#keywordObject (readonly)

String

the keyword associated with this conditional



5084
5085
5086
# File 'lib/syntax_tree/node.rb', line 5084

def keyword
  @keyword
end

#nodeObject (readonly)

If | Unless

the node that is being formatted



5087
5088
5089
# File 'lib/syntax_tree/node.rb', line 5087

def node
  @node
end

Instance Method Details

#format(q) ⇒ Object



5094
5095
5096
5097
5098
5099
5100
5101
5102
5103
5104
5105
5106
5107
5108
5109
5110
5111
5112
5113
5114
5115
5116
5117
5118
5119
5120
5121
5122
5123
5124
# File 'lib/syntax_tree/node.rb', line 5094

def format(q)
  # If we can transform this node into a ternary, then we're going to print
  # a special version that uses the ternary operator if it fits on one line.
  if Ternaryable.call(q, node)
    format_ternary(q)
    return
  end

  # If the predicate of the conditional contains an assignment (in which
  # case we can't know for certain that that assignment doesn't impact the
  # statements inside the conditional) then we can't use the modifier form
  # and we must use the block form.
  if ContainsAssignment.call(node.predicate)
    format_break(q, force: true)
    return
  end

  if node.consequent || node.statements.empty? || contains_conditional?
    q.group { format_break(q, force: true) }
  else
    q.group do
      q.if_break { format_break(q, force: false) }.if_flat do
        Parentheses.flat(q) do
          q.format(node.statements)
          q.text(" #{keyword} ")
          q.format(node.predicate)
        end
      end
    end
  end
end