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.



1904
1905
1906
1907
1908
1909
# File 'lib/syntax_tree/node.rb', line 1904

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



1899
1900
1901
# File 'lib/syntax_tree/node.rb', line 1899

def block_close
  @block_close
end

#block_openObject (readonly)

LBrace | Keyword

the node that opens the block



1896
1897
1898
# File 'lib/syntax_tree/node.rb', line 1896

def block_open
  @block_open
end

#nodeObject (readonly)

BraceBlock | DoBlock

the block node to be formatted



1893
1894
1895
# File 'lib/syntax_tree/node.rb', line 1893

def node
  @node
end

#statementsObject (readonly)

BodyStmt | Statements

the statements inside the block



1902
1903
1904
# File 'lib/syntax_tree/node.rb', line 1902

def statements
  @statements
end

Instance Method Details

#format(q) ⇒ Object



1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
# File 'lib/syntax_tree/node.rb', line 1911

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