     #  (new CS.FunctionApplication @expression, args).g().p @line, @column
     #]
 
+    # Produce the right operand when the left operand is null or undefined
     [CS.ExistsOp, -> if @left.instanceof CS.Null, CS.Undefined then @right else this]
 
+    # Produce false when the expression is null or undefined
     [CS.UnaryExistsOp, -> if @expression.instanceof CS.Null, CS.Undefined then (new CS.Bool false).g() else this]
 
     # LogicalNotOp applied to a literal or !!

      this
    ]

    [CS.Conditional, (inScope) ->
      if isFalsey @condition
        block = @elseBlock

        else @right
    ]

    # Push assignments forward
    [CS.AssignOp, ->
      return this unless @expression.instanceof CS.SeqOp
      new CS.SeqOp @expression.left, new CS.AssignOp @assignee, @expression.right
    ]

    # A falsey condition with side effects -> the condition
    # A falsey condition without side effects -> the undefined value
    # A truthy condition without side effects -> a loop
    [CS.While, (inScope) ->
      if isFalsey @condition
        return if mayHaveSideEffects @condition, inScope
          @condition
        else
          if block?
            declarationsFor @block
          else
            (new CS.Undefined).g()
      if isTruthy @condition
        unless mayHaveSideEffects @condition, inScope
          return (new CS.Undefined).g() unless @block?
          return this if this instanceof CS.Loop
