Add a couple of code gnerator flags

This commit is contained in:
Jonathan Müller 2017-07-17 17:24:55 +02:00
commit ad2d0f34f9
3 changed files with 30 additions and 9 deletions

View file

@ -159,7 +159,9 @@ namespace cppast
exclude, //< Exclude the entire entity. exclude, //< Exclude the entire entity.
exclude_return, //< Exclude the return type of a function entity. exclude_return, //< Exclude the return type of a function entity.
exclude_target, //< Exclude the underlying entity of an alias (e.g. typedef). exclude_target, //< Exclude the underlying entity of an alias (e.g. typedef).
declaration, //< Only write declaration. exclude_noexcept_condition, //< Exclude the condition of a noexcept.`
declaration, //< Only write declaration.
/// For a macro, it won't show the replacement if this flag is set
_flag_set_size, //< \exclude _flag_set_size, //< \exclude
}; };
@ -193,7 +195,7 @@ namespace cppast
/// the other functions have no effects. /// the other functions have no effects.
explicit operator bool() const noexcept explicit operator bool() const noexcept
{ {
return options_ != exclude; return !options_.is_set(exclude);
} }
/// \returns The generation options. /// \returns The generation options.

View file

@ -92,7 +92,7 @@ namespace
output << preprocessor_token("(") << bracket_ws output << preprocessor_token("(") << bracket_ws
<< preprocessor_token(def.parameters().value()) << bracket_ws << preprocessor_token(def.parameters().value()) << bracket_ws
<< preprocessor_token(")"); << preprocessor_token(")");
if (!def.replacement().empty()) if (!def.replacement().empty() && !output.options().is_set(code_generator::declaration))
output << whitespace << preprocessor_token(def.replacement()) << newl; output << whitespace << preprocessor_token(def.replacement()) << newl;
else else
output << newl; output << newl;
@ -500,7 +500,14 @@ namespace
else else
{ {
output << keyword("noexcept") << punctuation("(") << bracket_ws; output << keyword("noexcept") << punctuation("(") << bracket_ws;
detail::write_expression(output, cond); // update check when expression gets exposed
if (cond.kind() == cpp_expression_kind::unexposed_t
&& static_cast<const cpp_unexposed_expression&>(cond).expression() == "false")
output << keyword("false");
else if (output.options().is_set(code_generator::exclude_noexcept_condition))
output.excluded(base);
else
detail::write_expression(output, cond);
output << bracket_ws << punctuation(")"); output << bracket_ws << punctuation(")");
} }
} }

View file

@ -147,7 +147,6 @@ struct foo{
} }
SECTION("exclude") SECTION("exclude")
{ {
// exclude all entities starting with `e`
class exclude_generator : public test_generator class exclude_generator : public test_generator
{ {
public: public:
@ -157,8 +156,13 @@ struct foo{
generation_options do_get_options(const cpp_entity& e) override generation_options do_get_options(const cpp_entity& e) override
{ {
if (e.name().front() == 'e') if (e.name().front() == 'e')
return code_generator::exclude; // exclude all entities starting with `e`
return {}; // add declaration flag to detect check for equality
return code_generator::exclude | code_generator::declaration;
else if (e.name() == "FOO")
// don't show macro replacement
return code_generator::declaration;
return code_generator::exclude_noexcept_condition;
} }
}; };
@ -167,8 +171,10 @@ void e();
void func(int a, int e, int c); void func(int a, int e, int c);
#define FOO hidden
template <typename e1, typename e2> template <typename e1, typename e2>
void tfunc(int a); void tfunc(int a) noexcept(false);
struct base {}; struct base {};
struct e_t {}; struct e_t {};
@ -192,11 +198,15 @@ public:
private: private:
int e3; int e3;
}; };
void func2() noexcept(0 == 1 && 42);
)"; )";
auto synopsis = R"(void func(int a,int c); auto synopsis = R"(void func(int a,int c);
void tfunc(int a); #define FOO
void tfunc(int a)noexcept(false);
struct base{ struct base{
}; };
@ -213,6 +223,8 @@ class foo{
public: public:
int c; int c;
}; };
void func2()noexcept(excluded);
)"; )";
auto file = parse({}, "code_generator_exclude.cpp", code); auto file = parse({}, "code_generator_exclude.cpp", code);