 
   compileNode: (o) ->
     top  = del o, 'top'
+    @expression.parenthetical = true
     code = @expression.compile(o)
-    if @isStatement(o)
-      return (if top then @tab + code + ';' else code)
-    l    = code.length
-    code = code.substr(o, l-1) if code.substr(l-1, 1) is ';'
-    if @expression instanceof AssignNode then code else "(#{code})"
+    if @parenthetical or @isStatement o
+      return if top then @tab + code + ';' else code
+    "(#{code})"
 
 #### ForNode
 

    o.chainRoot = this unless o.chainRoot
    for arg in @args when arg instanceof SplatNode
      compilation = @compileSplat(o)
    unless compilation
      args = (arg.compile(o) for arg in @args).join(', ')
      compilation = if @isSuper then @compileSuper(args, o)
      else "#{@prefix()}#{@variable.compile(o)}(#{args})"
    if o.operation and @wrapped then "(#{compilation})" else compilation

  # `super()` is converted into a call against the superclass's implementation
  # of the current function.

  constructor: (@expression) ->

  compileNode: (o) ->
    test = ExistenceNode.compileTest(o, @expression)[0]
    if @parenthetical then test.substring(1, test.length - 1) else test

  # The meat of the **ExistenceNode** is in this static `compileTest` method
  # because other nodes like to check the existence of their variables as well.
