'Basically to process ``atom`` nodes. The parser sometimes doesn\'t
generate the node (because it has just one child). In that case an atom
might be a name or a literal as well.'

def eval_atom(self, context, atom):

    if (atom.type == 'name'):
        stmt = atom.get_definition()
        if (stmt.type == 'comp_for'):
            stmt = tree.search_ancestor(stmt, ('expr_stmt', 'lambdef', 'funcdef', 'classdef'))
        if ((stmt is None) or (stmt.type != 'expr_stmt')):
            stmt = atom
        return context.py__getattribute__(name_or_str=atom, position=stmt.start_pos, search_global=True)
    elif isinstance(atom, tree.Literal):
        string = parser_utils.safe_literal_eval(atom.value)
        return set([compiled.create(self, string)])
    else:
        c = atom.children
        if (c[0].type == 'string'):
            types = self.eval_atom(context, c[0])
            for string in c[1:]:
                right = self.eval_atom(context, string)
                types = precedence.calculate(self, context, types, '+', right)
            return types
        elif ((c[0] == '(') and (not (len(c) == 2)) and (not ((c[1].type == 'testlist_comp') and (len(c[1].children) > 1)))):
            return self.eval_element(context, c[1])
        try:
            comp_for = c[1].children[1]
        except (IndexError, AttributeError):
            pass
        else:
            if (comp_for == ':'):
                try:
                    comp_for = c[1].children[3]
                except IndexError:
                    pass
            if (comp_for.type == 'comp_for'):
                return set([iterable.Comprehension.from_atom(self, context, atom)])
        array_node = c[1]
        try:
            array_node_c = array_node.children
        except AttributeError:
            array_node_c = []
        if ((c[0] == '{') and ((array_node == '}') or (':' in array_node_c))):
            context = iterable.DictLiteralContext(self, context, atom)
        else:
            context = iterable.SequenceLiteralContext(self, context, atom)
        return set([context])
