def full_name(decl, with_defaults=True):
if None is decl:<EOL><INDENT>raise RuntimeError("<STR_LIT>")<EOL><DEDENT>if with_defaults:<EOL><INDENT>if not decl.cache.full_name:<EOL><INDENT>path = declaration_path(decl)<EOL>if path == ["<STR_LIT>"]:<EOL><INDENT>decl.cache.full_name = "<STR_LIT>"<EOL><DEDENT>else:<EOL><INDENT>decl.cache.full_name = full_name_from_declaration_path(path)<EOL><DEDENT><DEDENT>return decl.cache.full_name<EOL><DEDENT>else:<EOL><INDENT>if not decl.cache.full_partial_name:<EOL><INDENT>path = partial_declaration_path(decl)<EOL>if path == ["<STR_LIT>"]:<EOL><INDENT>decl.cache.full_partial_name = "<STR_LIT>"<EOL><DEDENT>else:<EOL><INDENT>decl.cache.full_partial_name =full_name_from_declaration_path(path)<EOL><DEDENT><DEDENT>return decl.cache.full_partial_name<EOL><DEDENT>
Returns declaration full qualified name.

If `decl` belongs to anonymous namespace or class, the function will return
C++ illegal qualified name.

Args:
    decl (declaration_t): declaration for which the full qualified name
                          should be calculated.

Returns:
    list[(str | basestring)]: full name of the declaration.