lean4-htt/src/library/message_buffer.cpp

107 lines
4 KiB
C++

/*
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Gabriel Ebner
*/
#include <string>
#include <vector>
#include "library/message_buffer.h"
namespace lean {
void message_buffer::start_bucket(message_bucket_id const &) {}
void message_buffer::report(message_bucket_id const &, message const &) {}
void message_buffer::finish_bucket(message_bucket_id const &, name_set const &) {}
bool message_buffer::is_bucket_valid(message_bucket_id const &) { return true; }
void message_buffer::report_info_manager(message_bucket_id const &, info_manager const &) {}
void stream_message_buffer::report(message_bucket_id const &, message const & msg) {
if (msg.get_severity() != INFORMATION) {
m_out << msg.get_file_name() << ":" << msg.get_pos().first << ":" << msg.get_pos().second << ": ";
switch (msg.get_severity()) {
case INFORMATION: break;
case WARNING: m_out << "warning: "; break;
case ERROR: m_out << "error: "; break;
}
if (!msg.get_caption().empty())
m_out << msg.get_caption() << ":\n";
}
m_out << msg.get_text() << "\n";
}
LEAN_THREAD_PTR(message_buffer, g_msg_buf);
scoped_message_buffer::scoped_message_buffer(message_buffer * buf) :
m_old(g_msg_buf) { g_msg_buf = buf; }
scoped_message_buffer::~scoped_message_buffer() { g_msg_buf = m_old; }
message_buffer & get_global_message_buffer() {
if (g_msg_buf) {
return *g_msg_buf;
} else {
throw exception("global message buffer not initialized");
}
}
LEAN_THREAD_PTR(scope_message_context, g_msg_ctx);
message_bucket_id get_global_msg_bucket_id() {
return get_scope_message_context().get_bucket_id();
}
void report_message(message const & msg) {
get_global_message_buffer().report(get_global_msg_bucket_id(), msg);
}
void report_info_manager(info_manager const & infom) {
get_global_message_buffer().report_info_manager(get_global_msg_bucket_id(), infom);
}
scope_message_context & get_scope_message_context() {
if (g_msg_ctx) {
return *g_msg_ctx;
} else {
throw exception("message context not initialized");
}
}
scope_message_context::scope_message_context(message_bucket_id const & bucket) :
scope_message_context(bucket, {}) {}
scope_message_context::scope_message_context(message_bucket_id const & bucket,
name_set const & sub_buckets_to_reuse) :
m_old(g_msg_ctx), m_bucket(bucket), m_sub_buckets(sub_buckets_to_reuse) {
g_msg_ctx = this;
get_global_message_buffer().start_bucket(m_bucket);
DEBUG_CODE(m_sub_buckets.for_each([=] (name const & b) {
lean_assert(b.get_prefix() == m_bucket.m_bucket); });)
}
scope_message_context::scope_message_context() :
scope_message_context(g_msg_ctx->new_sub_bucket()) {}
scope_message_context::scope_message_context(std::string const & sub_name) :
scope_message_context(g_msg_ctx->new_sub_bucket(sub_name)) {}
scope_message_context::scope_message_context(std::string const & sub_name, name_set const & sub_buckets_to_reuse) :
scope_message_context(g_msg_ctx->new_sub_bucket(sub_name), sub_buckets_to_reuse) {}
scope_message_context::~scope_message_context() {
get_global_message_buffer().finish_bucket(m_bucket, m_sub_buckets);
g_msg_ctx = m_old;
}
message_bucket_id scope_message_context::new_sub_bucket() {
unsigned i = m_sub_buckets.size();
name n;
do { n = name(m_bucket.m_bucket, i++); } while (m_sub_buckets.contains(n));
m_sub_buckets.insert(n);
return { n, m_bucket.m_version };
}
message_bucket_id scope_message_context::new_sub_bucket(std::string const & s) {
name n(m_bucket.m_bucket, s.c_str());
if (m_sub_buckets.contains(n)) {
unsigned i = 0;
name n_new;
do { n_new = n.append_after(i++); } while (m_sub_buckets.contains(n_new));
n = n_new;
}
m_sub_buckets.insert(n);
return message_bucket_id { n, m_bucket.m_version };
}
}