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.



6324
6325
6326
6327
# File 'lib/syntax_tree/node.rb', line 6324

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

Instance Attribute Details

#keywordObject (readonly)

String

the keyword associated with this conditional



6319
6320
6321
# File 'lib/syntax_tree/node.rb', line 6319

def keyword
  @keyword
end

#nodeObject (readonly)

If | Unless

the node that is being formatted



6322
6323
6324
# File 'lib/syntax_tree/node.rb', line 6322

def node
  @node
end

Instance Method Details

#format(q) ⇒ Object



6329
6330
6331
6332
6333
6334
6335
6336
6337
6338
6339
6340
6341
6342
6343
6344
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
6360
6361
6362
6363
6364
6365
6366
6367
6368
6369
6370
6371
6372
6373
6374
6375
6376
# File 'lib/syntax_tree/node.rb', line 6329

def format(q)
  if node.modifier?
    statement = node.statements.body[0]

    if ContainsAssignment.call(statement) || q.parent.is_a?(In)
      q.group { format_flat(q) }
    else
      q.group do
        q
          .if_break { format_break(q, force: false) }
          .if_flat { format_flat(q) }
      end
    end
  else
    # 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
end