Class: SyntaxTree::BlockFormatter

Inherits:
Object
  • Object
show all
Defined in:
lib/syntax_tree/node.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.



1856
1857
1858
1859
1860
1861
# File 'lib/syntax_tree/node.rb', line 1856

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



1851
1852
1853
# File 'lib/syntax_tree/node.rb', line 1851

def block_close
  @block_close
end

#block_openObject (readonly)

LBrace | Keyword

the node that opens the block



1848
1849
1850
# File 'lib/syntax_tree/node.rb', line 1848

def block_open
  @block_open
end

#nodeObject (readonly)

BraceBlock | DoBlock

the block node to be formatted



1845
1846
1847
# File 'lib/syntax_tree/node.rb', line 1845

def node
  @node
end

#statementsObject (readonly)

BodyStmt | Statements

the statements inside the block



1854
1855
1856
# File 'lib/syntax_tree/node.rb', line 1854

def statements
  @statements
end

Instance Method Details

#format(q) ⇒ Object



1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
# File 'lib/syntax_tree/node.rb', line 1863

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