 
   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
 

    op          = del o, 'operation'
    props       = if only then @properties[0...@properties.length - 1] else @properties
    o.chainRoot or= this
    baseline    = @base.compile o
    baseline    = "(#{baseline})" if @hasProperties() and (@base instanceof ObjectNode or @isNumber())
    complete    = @last = baseline

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

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