Class: SyntaxTree::LoopFormatter
- Inherits:
-
Object
- Object
- SyntaxTree::LoopFormatter
- Defined in:
- lib/syntax_tree/node.rb
Overview
Formats an Until or While node.
Instance Attribute Summary collapse
-
#keyword ⇒ Object
readonly
- String
-
the name of the keyword used for this loop.
-
#node ⇒ Object
readonly
- Until | While
-
the node that is being formatted.
Instance Method Summary collapse
- #format(q) ⇒ Object
-
#initialize(keyword, node) ⇒ LoopFormatter
constructor
A new instance of LoopFormatter.
Constructor Details
#initialize(keyword, node) ⇒ LoopFormatter
Returns a new instance of LoopFormatter.
11209 11210 11211 11212 |
# File 'lib/syntax_tree/node.rb', line 11209 def initialize(keyword, node) @keyword = keyword @node = node end |
Instance Attribute Details
#keyword ⇒ Object (readonly)
- String
-
the name of the keyword used for this loop
11204 11205 11206 |
# File 'lib/syntax_tree/node.rb', line 11204 def keyword @keyword end |
#node ⇒ Object (readonly)
- Until | While
-
the node that is being formatted
11207 11208 11209 |
# File 'lib/syntax_tree/node.rb', line 11207 def node @node end |
Instance Method Details
#format(q) ⇒ Object
11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 |
# File 'lib/syntax_tree/node.rb', line 11214 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 |