Add debug logging facility

This commit is contained in:
Jonathan Müller 2017-04-06 12:09:29 +02:00
commit da5b46fdb7
4 changed files with 27 additions and 0 deletions

View file

@ -66,6 +66,7 @@ namespace cppast
/// The severity of a [cppast::diagnostic](). /// The severity of a [cppast::diagnostic]().
enum class severity enum class severity
{ {
debug, //< A debug diagnostic that is just for debugging purposes.
warning, //< A warning that doesn't impact AST generation. warning, //< A warning that doesn't impact AST generation.
error, //< A non-critical error that does impact AST generation but not critically. error, //< A non-critical error that does impact AST generation but not critically.
critical, //< A critical error where AST generation isn't possible. critical, //< A critical error where AST generation isn't possible.
@ -77,6 +78,8 @@ namespace cppast
{ {
switch (s) switch (s)
{ {
case severity::debug:
return "debug";
case severity::warning: case severity::warning:
return "warning"; return "warning";
case severity::error: case severity::error:

View file

@ -43,10 +43,23 @@ namespace cppast
return error_; return error_;
} }
/// \effects Sets whether or not the logger prints debugging diagnostics.
void set_verbose(bool value) noexcept
{
verbose_ = value;
}
/// \returns Whether or not the logger prints debugging diagnostics.
bool is_verbose() const noexcept
{
return verbose_;
}
private: private:
virtual bool do_log(const char* source, const diagnostic& d) const = 0; virtual bool do_log(const char* source, const diagnostic& d) const = 0;
mutable std::atomic<bool> error_; mutable std::atomic<bool> error_;
bool verbose_ = false;
}; };
/// A [cppast::diagnostic_logger]() that logs to `stderr`. /// A [cppast::diagnostic_logger]() that logs to `stderr`.

View file

@ -74,6 +74,15 @@ std::unique_ptr<cpp_entity> detail::parse_entity(const detail::parse_context& co
const CXCursor& cur, const CXCursor& cur,
const CXCursor& parent_cur) try const CXCursor& parent_cur) try
{ {
if (context.logger->is_verbose())
{
auto message = detail::format("parsing cursor of type '",
detail::get_cursor_kind_spelling(cur).c_str(), "'");
context.logger->log("libclang parser",
diagnostic{std::move(message), detail::make_location(cur),
severity::debug});
}
auto kind = clang_getCursorKind(cur); auto kind = clang_getCursorKind(cur);
switch (kind) switch (kind)
{ {

View file

@ -15,6 +15,8 @@ bool diagnostic_logger::log(const char* source, const diagnostic& d) const
{ {
if (d.severity == severity::error) if (d.severity == severity::error)
error_ = true; error_ = true;
else if (!verbose_ && d.severity == severity::debug)
return false;
return do_log(source, d); return do_log(source, d);
} }