     @last: parts[parts.length - 1]
     @source: if parts.length > 1 then parts[0...(parts.length - 1)].join('') else null
     code: parts.join('').replace(/\)\(\)\)/, '()))')
-    return code unless soaked
-    '(' + code + ')'
+    if op and soaked then '(' + code + ')' else code
 
 }
 

    @CHAINABLE.indexOf(@operator) >= 0

  compile_node: (o) ->
    return @compile_chain(o)      if @is_chainable() and @first.unwrap() instanceof OpNode and @first.unwrap().is_chainable()
    return @compile_assignment(o) if @ASSIGNMENT.indexOf(@operator) >= 0
    return @compile_unary(o)      if @is_unary()

Node::compile: (o) ->
  @options: merge o or {}
  @indent:  o.indent
  del @options, 'operation' unless @operation_sensitive()
  top:      if @top_sensitive() then @options.top else del @options, 'top'
  closure:  @is_statement() and not @is_statement_only() and not top and
            not @options.returns and not (this instanceof CommentNode) and
