:param str source_code:
    :return: whether this source code snippet (e.g. one line) is complete/even w.r.t. opening/closing brackets
    :rtype: bool

def is_source_code_missing_open_brackets(source_code):
    """
    :param str source_code:
    :return: whether this source code snippet (e.g. one line) is complete/even w.r.t. opening/closing brackets
    :rtype: bool
    """
    open_brackets = "[{("
    close_brackets = "]})"
    last_close_bracket = [-1]  # stack
    counters = [0] * len(open_brackets)
    # Go in reverse order through the tokens.
    # Thus, we first should see the closing brackets, and then the matching opening brackets.
    for t_type, t_content in reversed(list(parse_py_statements(source_code))):
        if t_type != "op":
            continue  # we are from now on only interested in ops (including brackets)
        if t_content in open_brackets:
            idx = open_brackets.index(t_content)
            if last_close_bracket[-1] == idx:  # ignore if we haven't seen the closing one
                counters[idx] -= 1
                del last_close_bracket[-1]
        elif t_content in close_brackets:
            idx = close_brackets.index(t_content)
            counters[idx] += 1
            last_close_bracket += [idx]
    return not all([c == 0 for c in counters])