// Copyright (C) 2017 Jonathan Müller // This file is subject to the license terms in the LICENSE file // found in the top-level directory of this distribution. #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace cppast; namespace { template bool handle_container(const cpp_entity& e, detail::visitor_callback_t cb, void* functor) { auto& container = static_cast(e); auto handle_children = cb(functor, container, visitor_info::container_entity_enter); if (handle_children) { for (auto& child : container) if (!detail::visit(child, cb, functor)) return false; } return cb(functor, container, visitor_info::container_entity_exit); } } bool detail::visit(const cpp_entity& e, detail::visitor_callback_t cb, void* functor) { switch (e.kind()) { case cpp_entity_kind::file_t: return handle_container(e, cb, functor); case cpp_entity_kind::language_linkage_t: return handle_container(e, cb, functor); case cpp_entity_kind::namespace_t: return handle_container(e, cb, functor); case cpp_entity_kind::enum_t: return handle_container(e, cb, functor); case cpp_entity_kind::class_t: return handle_container(e, cb, functor); case cpp_entity_kind::function_t: return handle_container(e, cb, functor); case cpp_entity_kind::member_function_t: return handle_container(e, cb, functor); case cpp_entity_kind::conversion_op_t: return handle_container(e, cb, functor); case cpp_entity_kind::constructor_t: return handle_container(e, cb, functor); case cpp_entity_kind::template_template_parameter_t: return handle_container(e, cb, functor); case cpp_entity_kind::alias_template_t: return handle_container(e, cb, functor); case cpp_entity_kind::function_template_t: return handle_container(e, cb, functor); case cpp_entity_kind::function_template_specialization_t: return handle_container(e, cb, functor); case cpp_entity_kind::class_template_t: return handle_container(e, cb, functor); case cpp_entity_kind::class_template_specialization_t: return handle_container(e, cb, functor); case cpp_entity_kind::namespace_alias_t: case cpp_entity_kind::using_directive_t: case cpp_entity_kind::using_declaration_t: case cpp_entity_kind::type_alias_t: case cpp_entity_kind::enum_value_t: case cpp_entity_kind::access_specifier_t: case cpp_entity_kind::base_class_t: case cpp_entity_kind::variable_t: case cpp_entity_kind::member_variable_t: case cpp_entity_kind::bitfield_t: case cpp_entity_kind::function_parameter_t: case cpp_entity_kind::destructor_t: case cpp_entity_kind::template_type_parameter_t: case cpp_entity_kind::non_type_template_parameter_t: return cb(functor, e, visitor_info::leaf_entity); case cpp_entity_kind::count: break; } DEBUG_UNREACHABLE(detail::assert_handler{}); return true; }