Module: SyntaxTree::Parentheses
- Defined in:
- lib/syntax_tree/node.rb
Overview
If you have a modifier statement (for instance a modifier if statement or a modifier while loop) there are times when you need to wrap the entire statement in parentheses. This occurs when you have something like:
foo[:foo] =
if
baz
end
Normally we would shorten this to an inline version, which would result in:
foo[:foo] = baz if
but this actually has different semantic meaning. The first example will result in a nil being inserted into the hash for the :foo key, whereas the second example will result in an empty hash because the if statement applies to the entire assignment.
We can fix this in a couple of ways. We can use the then keyword, as in:
foo[:foo] = if then baz end
But this isn’t used very often. We can also just leave it as is with the multi-line version, but for a short predicate and short value it looks verbose. The last option and the one used here is to add parentheses on both sides of the expression, as in:
foo[:foo] = (baz if )
This approach maintains the nice conciseness of the inline version, while keeping the correct semantic meaning.
Constant Summary collapse
Class Method Summary collapse
Class Method Details
.break(q) ⇒ Object
8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 |
# File 'lib/syntax_tree/node.rb', line 8191 def self.break(q) return yield unless NODES.include?(q.parent.class) q.text("(") q.indent do q.breakable_empty yield end q.breakable_empty q.text(")") end |
.flat(q) ⇒ Object
8183 8184 8185 8186 8187 8188 8189 |
# File 'lib/syntax_tree/node.rb', line 8183 def self.flat(q) return yield unless NODES.include?(q.parent.class) q.text("(") yield q.text(")") end |