def _check_public_functions(self, primary_header, all_headers):
public_symbols = {}<EOL>declared_only_symbols = {}<EOL>if primary_header:<EOL><INDENT>for name, symbol in primary_header.public_symbols.items():<EOL><INDENT>if isinstance(symbol, ast.Function):<EOL><INDENT>public_symbols[name] = symbol<EOL><DEDENT><DEDENT>declared_only_symbols = dict.fromkeys(public_symbols, True)<EOL><DEDENT>for node in self.ast_list:<EOL><INDENT>if not isinstance(node, ast.Function):<EOL><INDENT>continue<EOL><DEDENT>if isinstance(node, ast.Method):<EOL><INDENT>names = [n.name for n in node.in_class]<EOL>if names != self.symbol_table.get_namespace(names):<EOL><INDENT>continue<EOL><DEDENT><DEDENT>if not (node.is_definition() and node.is_exportable()):<EOL><INDENT>continue<EOL><DEDENT>name = node.name<EOL>if name in public_symbols:<EOL><INDENT>declared_only_symbols[name] = False<EOL><DEDENT>else:<EOL><INDENT>self._find_public_function_warnings(node,<EOL>name,<EOL>primary_header,<EOL>all_headers)<EOL><DEDENT><DEDENT>for name, declared_only in declared_only_symbols.items():<EOL><INDENT>if declared_only:<EOL><INDENT>node = public_symbols[name]<EOL>if node.templated_types is None:<EOL><INDENT>msg = "<STR_LIT>".format(name)<EOL>self._add_warning(msg, node, primary_header.filename)<EOL><DEDENT><DEDENT><DEDENT>
Verify all the public functions are also declared in a header
        file.