         options.precedence = prec
         options.ancestors.unshift ast
         "#{op}#{generate ast.expr, options}"
+
       when 'UnaryExistsOp', 'PostIncrementOp', 'PostDecrementOp', 'Spread'
         op = operators[ast.className]
         prec = precedence[ast.className]

        left = parens left if needsParensWhenOnLeft ast.left
        right = generate ast.right, options
        "#{left} #{op} #{right}"
      when 'UnaryPlusOp', 'UnaryNegateOp', 'LogicalNotOp', 'BitNotOp', 'DoOp', 'TypeofOp', 'PreIncrementOp', 'PreDecrementOp'
        op = operators[ast.className]
        prec = precedence[ast.className]

    parentClassName = parent?.className
    usedAsExpression = parent? and parentClassName isnt 'Block'
    src = switch ast.className

      when 'Program'
        options.ancestors.unshift ast
        generate ast.block, options

      when 'Block'
        options.ancestors.unshift ast
        sep = '\n'
        sep = "#{sep}\n" if parentClassName is 'Program'
        (generate s, options for s in ast.statements).join sep

      when 'Identifier'
        ast.data

      when 'Int'
        absNum = if ast.data < 0 then -ast.data else ast.data
        # if number is a power of two (at least 2^4) or hex is a shorter
