     @updateBinaryExpression node
   UnaryExpression: (node) ->
     @updateVoidToUndefined node
+  LabeledStatement: (node, parent) ->
+    @warnAboutLabeledStatements node, parent
+  WithStatement: (node) ->
+    @syntaxError node, "'with' is not supported in CoffeeScript"
+  VariableDeclarator: (node, parent, skip) ->
+    @addExplicitUndefinedInitializer node, parent, skip
+
+  ###
+  # For VariableDeclarator with no initializers (`var a`), add `undefined` as the initializer.
+  ###
+
+  addExplicitUndefinedInitializer: (node, parent, skip) ->
+    unless node.init?
+      node.init = { type: 'Identifier', name: 'undefined' }
+      skip()
+    node
+
+  ###
+  # Produce warnings when using labels. It may be a JSON string being pasted,
+  # so produce a more helpful warning for that case.
+  ###
+
+  warnAboutLabeledStatements: (node, parent) ->
+    if parent.type is 'BlockStatement' and parent is @block
+      @syntaxError node, "Labeled statements are not supported (wrap your JSON in parentheses)"
+    else
+      @syntaxError node, "Labeled statements are not supported in CoffeeScirpt"
 
   ###
   # Updates `void 0` UnaryExpressions to `undefined` identifiers

  run: ->
    self = this
    @estraverse().replace @ast,
      enter: (node, parent) =>
        fn = self["#{node.type}"]
        if fn
          fn.apply self, [ node, parent, (=> @skip()), (=> @break()) ]

    delimit(declarators, @indent())

  VariableDeclarator: (node) ->
    [ @walk(node.id), ' = ', @walk(node.init), "\n" ]

  FunctionExpression: (node, ctx) ->
    params = @makeParams(node.params)

    expr = @indent (i) =>
