From c5d6df957c782fbf56bca4e4725718dd27eefdb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonathan=20M=C3=BCller?= Date: Tue, 11 Apr 2017 18:50:02 +0200 Subject: [PATCH] Remove parameter children from e.g. cpp_function_base Also template parameter children of cpp_template_template_parameter. Now accessible over named function, consistent with base classes, other template parameters etc. --- include/cppast/cpp_function.hpp | 24 ++++++++++++++--------- include/cppast/cpp_template_parameter.hpp | 19 +++++++++++------- src/code_generator.cpp | 4 ++-- src/visitor.cpp | 18 +++++------------ test/cpp_class_template.cpp | 2 +- test/cpp_function.cpp | 14 ++++++------- test/cpp_function_template.cpp | 12 ++++++------ test/cpp_member_function.cpp | 12 ++++++------ test/cpp_template_parameter.cpp | 17 ++++++++-------- 9 files changed, 63 insertions(+), 59 deletions(-) diff --git a/include/cppast/cpp_function.hpp b/include/cppast/cpp_function.hpp index caa889c..fffadbf 100644 --- a/include/cppast/cpp_function.hpp +++ b/include/cppast/cpp_function.hpp @@ -5,8 +5,8 @@ #ifndef CPPAST_CPP_FUNCTION_HPP_INCLUDED #define CPPAST_CPP_FUNCTION_HPP_INCLUDED +#include #include -#include #include #include #include @@ -64,12 +64,15 @@ namespace cppast /// Base class for all entities that are functions. /// /// It contains arguments and common flags. - class cpp_function_base - : public cpp_entity, - public cpp_entity_container, - public cpp_forward_declarable + class cpp_function_base : public cpp_entity, public cpp_forward_declarable { public: + /// \returns An iteratable object iterating over the [cppast::cpp_function__parameter]() entities. + detail::iteratable_intrusive_list parameters() const noexcept + { + return type_safe::ref(parameters_); + } + /// \returns The [cppast::cpp_function_body_kind](). /// \notes This matches the [cppast::cpp_forward_declarable]() queries. cpp_function_body_kind body_kind() const noexcept @@ -107,7 +110,9 @@ namespace cppast /// \effects Adds a parameter. void add_parameter(std::unique_ptr parameter) { - static_cast(*function).add_child(std::move(parameter)); + static_cast(*function).parameters_.push_back(*function, + std::move( + parameter)); } /// \effects Marks the function as variadic. @@ -168,9 +173,10 @@ namespace cppast } private: - std::unique_ptr noexcept_expr_; - cpp_function_body_kind body_; - bool variadic_; + detail::intrusive_list parameters_; + std::unique_ptr noexcept_expr_; + cpp_function_body_kind body_; + bool variadic_; }; /// A [cppast::cpp_entity]() modelling a C++ function. diff --git a/include/cppast/cpp_template_parameter.hpp b/include/cppast/cpp_template_parameter.hpp index a4a3ffa..cb0a3c6 100644 --- a/include/cppast/cpp_template_parameter.hpp +++ b/include/cppast/cpp_template_parameter.hpp @@ -8,8 +8,8 @@ #include #include +#include #include -#include #include namespace cppast @@ -170,9 +170,7 @@ namespace cppast using cpp_template_ref = basic_cpp_entity_ref; /// A [cppast::cpp_entity]() modelling a C++ template template parameter. - class cpp_template_template_parameter final - : public cpp_template_parameter, - public cpp_entity_container + class cpp_template_template_parameter final : public cpp_template_parameter { public: static cpp_entity_kind kind() noexcept; @@ -197,7 +195,7 @@ namespace cppast /// \effects Adds a parameter to the template. void add_parameter(std::unique_ptr param) { - parameter_->add_child(std::move(param)); + parameter_->parameters_.push_back(*parameter_, std::move(param)); } /// \effects Sets the default template. @@ -220,6 +218,12 @@ namespace cppast std::unique_ptr parameter_; }; + /// \returns An iteratable object containing the template parameters of the template template parameter. + detail::iteratable_intrusive_list parameters() const noexcept + { + return type_safe::ref(parameters_); + } + /// \returns The keyword used in the template parameter. cpp_template_keyword keyword() const noexcept { @@ -241,8 +245,9 @@ namespace cppast cpp_entity_kind do_get_entity_kind() const noexcept override; - type_safe::optional default_; - cpp_template_keyword keyword_; + detail::intrusive_list parameters_; + type_safe::optional default_; + cpp_template_keyword keyword_; }; /// An argument for a [cppast::cpp_template_parameter](). diff --git a/src/code_generator.cpp b/src/code_generator.cpp index 9851745..df58213 100644 --- a/src/code_generator.cpp +++ b/src/code_generator.cpp @@ -422,7 +422,7 @@ namespace void write_function_parameters(code_generator::output& output, const cpp_function_base& base) { output << punctuation("("); - auto need_sep = write_container(output, base, punctuation(",")); + auto need_sep = write_container(output, base.parameters(), punctuation(",")); if (base.is_variadic()) { if (need_sep) @@ -753,7 +753,7 @@ namespace if (output) { output << keyword("template") << punctuation("<"); - write_container(output, param, punctuation(",")); + write_container(output, param.parameters(), punctuation(",")); output << punctuation(">") << keyword(to_string(param.keyword())) << whitespace; if (param.is_variadic()) output << punctuation("..."); diff --git a/src/visitor.cpp b/src/visitor.cpp index 1a98e6f..79ddc9c 100644 --- a/src/visitor.cpp +++ b/src/visitor.cpp @@ -11,12 +11,9 @@ #include #include #include -#include #include #include -#include #include -#include #include using namespace cppast; @@ -61,16 +58,6 @@ bool detail::visit(const cpp_entity& e, detail::visitor_callback_t cb, void* fun return handle_container(e, cb, functor, last_child); case cpp_entity_kind::class_t: return handle_container(e, cb, functor, last_child); - case cpp_entity_kind::function_t: - return handle_container(e, cb, functor, last_child); - case cpp_entity_kind::member_function_t: - return handle_container(e, cb, functor, last_child); - case cpp_entity_kind::conversion_op_t: - return handle_container(e, cb, functor, last_child); - case cpp_entity_kind::constructor_t: - return handle_container(e, cb, functor, last_child); - case cpp_entity_kind::template_template_parameter_t: - return handle_container(e, cb, functor, last_child); case cpp_entity_kind::alias_template_t: return handle_container(e, cb, functor, last_child); case cpp_entity_kind::variable_template_t: @@ -97,10 +84,15 @@ bool detail::visit(const cpp_entity& e, detail::visitor_callback_t cb, void* fun case cpp_entity_kind::member_variable_t: case cpp_entity_kind::bitfield_t: case cpp_entity_kind::function_parameter_t: + case cpp_entity_kind::function_t: + case cpp_entity_kind::member_function_t: + case cpp_entity_kind::conversion_op_t: + case cpp_entity_kind::constructor_t: case cpp_entity_kind::destructor_t: case cpp_entity_kind::friend_t: case cpp_entity_kind::template_type_parameter_t: case cpp_entity_kind::non_type_template_parameter_t: + case cpp_entity_kind::template_template_parameter_t: case cpp_entity_kind::unexposed_t: return cb(functor, e, {visitor_info::leaf_entity, last_child}); diff --git a/test/cpp_class_template.cpp b/test/cpp_class_template.cpp index 44f24ea..6b98335 100644 --- a/test/cpp_class_template.cpp +++ b/test/cpp_class_template.cpp @@ -205,7 +205,7 @@ struct b<0, T> {}; *cpp_template_parameter_type::build( cpp_template_type_parameter_ref(cpp_entity_id(""), "T")))); - for (auto& param : mfunc) + for (auto& param : mfunc.parameters()) REQUIRE( equal_types(idx, param.type(), *cpp_template_parameter_type::build( diff --git a/test/cpp_function.cpp b/test/cpp_function.cpp index 732d114..ba7a835 100644 --- a/test/cpp_function.cpp +++ b/test/cpp_function.cpp @@ -77,7 +77,7 @@ void ns::l() if (func.name() == "a") { REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void))); - REQUIRE(count_children(func) == 0u); + REQUIRE(count_children(func.parameters()) == 0u); REQUIRE(!func.is_variadic()); } else if (func.name() == "b") @@ -85,7 +85,7 @@ void ns::l() REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_int))); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { if (param.name() == "a") { @@ -124,7 +124,7 @@ void ns::l() cpp_ref_lvalue))); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { if (param.name() == "a") { @@ -147,7 +147,7 @@ void ns::l() else if (func.name() == "d" || func.name() == "e" || func.name() == "f") { REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void))); - REQUIRE(count_children(func) == 0u); + REQUIRE(count_children(func.parameters()) == 0u); REQUIRE(!func.is_variadic()); REQUIRE(func.storage_class() == cpp_storage_class_none); REQUIRE(!func.is_constexpr()); @@ -172,7 +172,7 @@ void ns::l() || func.name() == "j") { REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void))); - REQUIRE(count_children(func) == 0u); + REQUIRE(count_children(func.parameters()) == 0u); REQUIRE(!func.is_variadic()); REQUIRE(!func.noexcept_condition()); check_body(func, cpp_function_declaration); @@ -201,7 +201,7 @@ void ns::l() else if (func.name() == "k" || func.name() == "l" || func.name() == "ns::l") { REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void))); - REQUIRE(count_children(func) == 0u); + REQUIRE(count_children(func.parameters()) == 0u); REQUIRE(!func.is_variadic()); REQUIRE(!func.noexcept_condition()); REQUIRE(!func.is_constexpr()); @@ -244,7 +244,7 @@ void foo::a() {} auto file = parse(idx, "static_cpp_function.cpp", code); auto count = test_visit(*file, [&](const cpp_function& func) { REQUIRE(!func.is_variadic()); - REQUIRE(count_children(func) == 0u); + REQUIRE(count_children(func.parameters()) == 0u); REQUIRE(func.storage_class() == cpp_storage_class_static); if (func.name() == "a" || func.name() == "foo::a") diff --git a/test/cpp_function_template.cpp b/test/cpp_function_template.cpp index 35c51cc..51071db 100644 --- a/test/cpp_function_template.cpp +++ b/test/cpp_function_template.cpp @@ -88,7 +88,7 @@ d::d(const int&); *cpp_template_parameter_type::build(parameter))); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { ++count; REQUIRE( @@ -117,7 +117,7 @@ d::d(const int&); auto type_parameter = cpp_template_type_parameter_ref(cpp_entity_id(""), "T"); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { ++count; REQUIRE(equal_types(idx, param.type(), @@ -161,7 +161,7 @@ d::d(const int&); auto parameter = cpp_template_type_parameter_ref(cpp_entity_id(""), "T"); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { ++count; REQUIRE( @@ -201,7 +201,7 @@ d::d(const int&); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_int))); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { ++count; REQUIRE( @@ -227,7 +227,7 @@ d::d(const int&); REQUIRE(equal_types(idx, func.return_type(), *builder.finish())); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { ++count; REQUIRE(equal_types(idx, param.type(), *cpp_builtin_type::build(cpp_int))); @@ -262,7 +262,7 @@ d::d(const int&); auto& func = static_cast(tfunc.function()); auto count = 0u; - for (auto& param : func) + for (auto& param : func.parameters()) { ++count; REQUIRE( diff --git a/test/cpp_member_function.cpp b/test/cpp_member_function.cpp index baadec0..19c06d2 100644 --- a/test/cpp_member_function.cpp +++ b/test/cpp_member_function.cpp @@ -51,7 +51,7 @@ struct bar : foo cpp_entity_index idx; auto file = parse(idx, "cpp_member_function.cpp", code); auto count = test_visit(*file, [&](const cpp_member_function& func) { - REQUIRE(count_children(func) == 0u); + REQUIRE(count_children(func.parameters()) == 0u); REQUIRE(!func.is_variadic()); REQUIRE(!func.is_constexpr()); REQUIRE(equal_types(idx, func.return_type(), *cpp_builtin_type::build(cpp_void))); @@ -166,7 +166,7 @@ struct foo cpp_entity_index idx; auto file = parse(idx, "cpp_conversion_op.cpp", code); auto count = test_visit(*file, [&](const cpp_conversion_op& op) { - REQUIRE(count_children(op) == 0u); + REQUIRE(count_children(op.parameters()) == 0u); REQUIRE(!op.is_variadic()); REQUIRE(op.body_kind() == cpp_function_declaration); REQUIRE(op.ref_qualifier() == cpp_ref_none); @@ -241,7 +241,7 @@ struct foo REQUIRE(!cont.is_variadic()); REQUIRE(cont.name() == "foo"); - if (count_children(cont) == 0u) + if (count_children(cont.parameters()) == 0u) { REQUIRE(cont.noexcept_condition()); REQUIRE( @@ -252,14 +252,14 @@ struct foo REQUIRE(!cont.is_constexpr()); REQUIRE(cont.body_kind() == cpp_function_defaulted); } - else if (count_children(cont) == 1u) + else if (count_children(cont.parameters()) == 1u) { REQUIRE(!cont.noexcept_condition()); REQUIRE(cont.is_explicit()); REQUIRE(!cont.is_constexpr()); REQUIRE(cont.body_kind() == cpp_function_declaration); } - else if (count_children(cont) == 2u) + else if (count_children(cont.parameters()) == 2u) { REQUIRE(!cont.noexcept_condition()); REQUIRE(!cont.is_explicit()); @@ -302,7 +302,7 @@ struct d : c auto file = parse({}, "cpp_destructor.cpp", code); auto count = test_visit(*file, [&](const cpp_destructor& dtor) { - REQUIRE(count_children(dtor) == 0u); + REQUIRE(count_children(dtor.parameters()) == 0u); REQUIRE(!dtor.is_variadic()); if (dtor.name() == "~a") diff --git a/test/cpp_template_parameter.cpp b/test/cpp_template_parameter.cpp index adb01ed..5bc3f04 100644 --- a/test/cpp_template_parameter.cpp +++ b/test/cpp_template_parameter.cpp @@ -236,7 +236,7 @@ using d = void; REQUIRE(!param.default_template()); auto no = 0u; - for (auto& p_param : param) + for (auto& p_param : param.parameters()) { ++no; REQUIRE(p_param.name() == "T"); @@ -250,18 +250,18 @@ using d = void; REQUIRE(param.is_variadic()); REQUIRE(!param.default_template()); - auto cur = param.begin(); - REQUIRE(cur != param.end()); + auto cur = param.parameters().begin(); + REQUIRE(cur != param.parameters().end()); REQUIRE(cur->name().empty()); REQUIRE(cur->kind() == cpp_entity_kind::non_type_template_parameter_t); ++cur; - REQUIRE(cur != param.end()); + REQUIRE(cur != param.parameters().end()); REQUIRE(cur->name().empty()); REQUIRE(cur->kind() == cpp_entity_kind::template_type_parameter_t); ++cur; - REQUIRE(cur == param.end()); + REQUIRE(cur == param.parameters().end()); } else if (param.name() == "C") { @@ -276,7 +276,7 @@ using d = void; REQUIRE(entities[0]->name() == "def"); auto no = 0u; - for (auto& p_param : param) + for (auto& p_param : param.parameters()) { ++no; REQUIRE(p_param.name() == ""); @@ -297,13 +297,14 @@ using d = void; REQUIRE(entities[0]->name() == "a"); auto no = 0u; - for (auto& p_param : param) + for (auto& p_param : param.parameters()) { ++no; REQUIRE(p_param.name() == ""); REQUIRE(p_param.kind() == cpp_entity_kind::template_template_parameter_t); for (auto& p_p_param : - static_cast(p_param)) + static_cast(p_param) + .parameters()) { ++no; REQUIRE(p_p_param.name() == "");