Class: SyntaxTree::BlockFormatter

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

Overview

Responsible for formatting either a BraceBlock or a DoBlock.

Defined Under Namespace

Classes: BlockOpenFormatter

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(node, block_open, block_close, statements) ⇒ BlockFormatter

Returns a new instance of BlockFormatter.



2824
2825
2826
2827
2828
2829
# File 'lib/syntax_tree.rb', line 2824

def initialize(node, block_open, block_close, statements)
  @node = node
  @block_open = block_open
  @block_close = block_close
  @statements = statements
end

Instance Attribute Details

#block_closeObject (readonly)

String

the string that closes the block



2819
2820
2821
# File 'lib/syntax_tree.rb', line 2819

def block_close
  @block_close
end

#block_openObject (readonly)

LBrace | Keyword

the node that opens the block



2816
2817
2818
# File 'lib/syntax_tree.rb', line 2816

def block_open
  @block_open
end

#nodeObject (readonly)

BraceBlock | DoBlock

the block node to be formatted



2813
2814
2815
# File 'lib/syntax_tree.rb', line 2813

def node
  @node
end

#statementsObject (readonly)

BodyStmt | Statements

the statements inside the block



2822
2823
2824
# File 'lib/syntax_tree.rb', line 2822

def statements
  @statements
end

Instance Method Details

#format(q) ⇒ Object



2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
# File 'lib/syntax_tree.rb', line 2831

def format(q)
  # If this is nested anywhere inside of a Command or CommandCall node, then
  # we can't change which operators we're using for the bounds of the block.
  break_opening, break_closing, flat_opening, flat_closing =
    if unchangeable_bounds?(q)
      [block_open.value, block_close, block_open.value, block_close]
    elsif forced_do_end_bounds?(q)
      %w[do end do end]
    elsif forced_brace_bounds?(q)
      %w[{ } { }]
    else
      %w[do end { }]
    end

  # If the receiver of this block a Command or CommandCall node, then there
  # are no parentheses around the arguments to that command, so we need to
  # break the block.
  receiver = q.parent.call
  if receiver.is_a?(Command) || receiver.is_a?(CommandCall)
    q.break_parent
    format_break(q, break_opening, break_closing)
    return
  end

  q.group do
    q.if_break { format_break(q, break_opening, break_closing) }.if_flat do
      format_flat(q, flat_opening, flat_closing)
    end
  end
end