_push_to_list(lst : [str], func_name : str, char : str, line : int, offset : int,
                        first_arg_pos :int , first_item : int, in_list_literal : bool,
                        lead_spaces : int, options : str)

    Called when an opening bracket is encountered. A hash containing the
    necessary data to pin point errors and the indentation level is stored in
    the list and the list returned.

def _push_to_list(lst, func_name, char, line, offset,
                  first_arg_pos, first_item, in_list_literal,
                  lead_spaces, options=None):
    """ _push_to_list(lst : [str], func_name : str, char : str, line : int, offset : int,
                        first_arg_pos :int , first_item : int, in_list_literal : bool,
                        lead_spaces : int, options : str)

    Called when an opening bracket is encountered. A hash containing the
    necessary data to pin point errors and the indentation level is stored in
    the list and the list returned.
    """
    opts = parse_options(options)
    keywords = add_keywords(opts)
    pos_hash = {'character': char,
                'line_number': line,
                'bracket_pos': offset,
                'indent_level': offset + first_arg_pos,  # the default value, e.g in normal function
                'func_name': func_name,
                'spaces': 0}

    is_macro = is_macro_name(func_name, opts.dialect)
    two_spacer = is_macro or keywords[func_name] in [KEYWORD1, KEYWORD4]

    if in_list_literal or char == '{' or (char == '[' and opts.dialect == 'clojure'):
        # found quoted list or clojure hashmap/vector
        pos_hash['indent_level'] = first_item

    elif keywords[func_name] == KEYWORD2:
        # We only make the if-clause stand out if not in uniform mode
        pos_hash['indent_level'] = lead_spaces + ((offset + opts.indent_size * 2)
                                                  if not opts.uniform
                                                  else (offset + opts.indent_size))

    elif func_name != '':
        if two_spacer:
            pos_hash['indent_level'] = lead_spaces + offset + opts.indent_size
        elif keywords[func_name] == KEYWORD3:
            pos_hash['indent_level'] = lead_spaces + offset + (2 * opts.indent_size)

    lst.append(pos_hash)
    try:
        # A hack to make flets and labels in Lisp not indent like
        # functions. The 'labels' indentation may not be exactly
        # perfect.
        parent_func = lst[-3]['func_name']
        # Make 'special' indentation occur only in a Clojure binding block([]) for
        # letfns
        non_bind_block = opts.dialect == 'clojure' and lst[-2]['character'] != '['
        if keywords[parent_func] == KEYWORD4 and not non_bind_block:
            lst[-1]['indent_level'] = offset + opts.indent_size
    except IndexError:
        pass
    return lst