       @children.push @else_body: exprs
     this
 
-  # If the else_body is an IfNode itself, then we've got an if-else chain.
+  # If the `else_body` is an **IfNode** itself, then we've got an *if-else* chain.
   is_chain: ->
     @chain ||= @else_body and @else_body instanceof IfNode
 
-  # The IfNode only compiles into a statement if either of the bodies needs
-  # to be a statement.
+  # The **IfNode** only compiles into a statement if either of its bodies needs
+  # to be a statement. Otherwise a ternary is safe.
   is_statement: ->
     @statement ||= !!(@comment or @tags.statement or @body.is_statement() or (@else_body and @else_body.is_statement()))
 

  top_sensitive: ->
    true

  compile_node: (o) ->
    top_level:      del(o, 'top') and not o.returns
    range:          @source instanceof ValueNode and @source.base instanceof RangeNode and not @source.properties.length


# Tabs are two spaces for pretty printing.
TAB: '  '

# Trim out all trailing whitespace, so that the generated code plays nice
# with Git.
TRAILING_WHITESPACE: /\s+$/gm

# Keep this identifier regex in sync with the Lexer.
IDENTIFIER: /^[a-zA-Z$_](\w|\$)*$/

# Utility Functions
# -----------------

# Merge objects, returning a fresh copy with attributes from both sides.
# Used every time `compile` is called, to allow properties in the options hash
# to propagate down the tree without polluting other branches.
merge: (options, overrides) ->
  fresh: {}
  (fresh[key]: val) for key, val of options
