Add on_container_end() function to code generator to allow injection of children

This commit is contained in:
Jonathan Müller 2017-12-14 19:08:22 +01:00
commit 8eef31bba1
2 changed files with 22 additions and 0 deletions

View file

@ -230,6 +230,12 @@ namespace cppast
return gen_; return gen_;
} }
/// \effects Calls `on_container_end()`.
void container_end() const noexcept
{
gen_->on_container_end(*this, *e_);
}
/// \effects Call `do_indent()` followed by `do_write_newline()` (if `print_newline` is `true`). /// \effects Call `do_indent()` followed by `do_write_newline()` (if `print_newline` is `true`).
void indent(bool print_newline = true) const noexcept void indent(bool print_newline = true) const noexcept
{ {
@ -399,6 +405,15 @@ namespace cppast
(void)e; (void)e;
} }
/// \effects Will be invoked after all children of a container have been generated.
/// It can be used to inject additional children.
/// The base class version has no effect.
virtual void on_container_end(const output& out, const cpp_entity& e)
{
(void)out;
(void)e;
}
/// \effects Will be invoked when the indentation level should be increased by one. /// \effects Will be invoked when the indentation level should be increased by one.
/// The level change must be applied on the next call to `do_write_newline()`. /// The level change must be applied on the next call to `do_write_newline()`.
virtual void do_indent() = 0; virtual void do_indent() = 0;

View file

@ -88,6 +88,8 @@ namespace
if (!need_sep) if (!need_sep)
// file empty, write newl // file empty, write newl
output << newl; output << newl;
else
output.container_end();
} }
return static_cast<bool>(output); return static_cast<bool>(output);
} }
@ -173,6 +175,7 @@ namespace
output.indent(); output.indent();
write_container(output, ns, newl, cur_access); write_container(output, ns, newl, cur_access);
output.container_end();
output.unindent(); output.unindent();
output << punctuation("}") << newl; output << punctuation("}") << newl;
@ -285,6 +288,8 @@ namespace
if (need_sep) if (need_sep)
output << newl; output << newl;
output.container_end();
output.unindent(); output.unindent();
output << punctuation("};") << newl; output << punctuation("};") << newl;
} }
@ -426,6 +431,8 @@ namespace
} }
} }
output.container_end();
output.unindent(); output.unindent();
output << punctuation("};") << newl; output << punctuation("};") << newl;
} }