class SyntaxTree::LoopFormatter
Formats an Until or While node.
Attributes
keyword[R]
- String
-
the name of the keyword used for this loop
node[R]
- Until | While
-
the node that is being formatted
Public Class Methods
new(keyword, node)
click to toggle source
# File lib/syntax_tree/node.rb, line 11385 def initialize(keyword, node) @keyword = keyword @node = node end
Public Instance Methods
format(q)
click to toggle source
# File lib/syntax_tree/node.rb, line 11390 def format(q) # If we're in the modifier form and we're modifying a `begin`, then this # is a special case where we need to explicitly use the modifier form # because otherwise the semantic meaning changes. This looks like: # # begin # foo # end while bar # # Also, if the statement of the modifier includes an assignment, then we # can't know for certain that it won't impact the predicate, so we need to # force it to stay as it is. This looks like: # # foo = bar while foo # if node.modifier? && (statement = node.statements.body.first) && (statement.is_a?(Begin) || ContainsAssignment.call(statement)) q.format(statement) q.text(" #{keyword} ") q.format(node.predicate) elsif node.statements.empty? q.group do q.text("#{keyword} ") q.nest(keyword.length + 1) { q.format(node.predicate) } q.breakable_force q.text("end") end elsif ContainsAssignment.call(node.predicate) format_break(q) q.break_parent else q.group do q .if_break { format_break(q) } .if_flat do Parentheses.flat(q) do q.format(node.statements) q.text(" #{keyword} ") q.format(node.predicate) end end end end end