     condO    = merge o
     o.indent = @idt 1
     o.top    = true
-    ifPart   = "if (#{ @compileCondition condO }) {\n#{ @body.compile o }\n#{@tab}}"
+    ifPart   = "if (#{ @condition.compileBare condO }) {\n#{ @body.compile o }\n#{@tab}}"
     ifPart   = @tab + ifPart unless child
     return ifPart unless @elseBody
-    ifPart + if @isChain
-      ' else ' + @elseBodyNode().compile merge o, indent: @tab, chainChild: true
+    ifPart + ' else ' + if @isChain
+       @elseBodyNode().compile merge o, indent: @tab, chainChild: true
     else
-      " else {\n#{ @elseBody.compile(o) }\n#{@tab}}"
+      "{\n#{ @elseBody.compile o }\n#{@tab}}"
 
   # Compile the If as a conditional operator.
   compileExpression: (o) ->
-    @bodyNode().tags.operation = @condition.tags.operation = yes
-    @elseBodyNode().tags.operation = yes if @elseBody
-    ifPart      = @condition.compile(o) + ' ? ' + @bodyNode().compile(o)
-    elsePart    = if @elseBody then @elseBodyNode().compile(o) else 'undefined'
-    code        = "#{ifPart} : #{elsePart}"
+    code = @condition.compile(o)      + ' ? ' +
+           @bodyNode().compileBare(o) + ' : ' +
+           @elseBodyNode()?.compileBare o
     if @tags.operation or @soakNode then "(#{code})" else code
 
   unfoldSoak: -> @soakNode and this

    if @value instanceof Code and match = @METHOD_DEF.exec name
      @value.name  = match[2]
      @value.klass = match[1]
    val = @value.compile o
    return "#{name}: #{val}" if @context is 'object'
    o.scope.find name unless isValue and (@variable.hasProperties() or @variable.namespaced)
    val = name + " #{ @context or '=' } " + val

  isStatement: (o) ->
    @statement or= o?.top or @bodyNode().isStatement(o) or @elseBodyNode()?.isStatement(o)

  compileNode: (o) ->
    if @isStatement o then @compileStatement o else @compileExpression o

