summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2017-10-29 11:59:49 +0800
committerJohn Hodge <tpg@ucc.asn.au>2017-10-29 11:59:49 +0800
commit0879111f1c8d287a394ca2c2c56c941ded0842ab (patch)
treeb9a0ae56981adbe48742fa637cb42b4a570f569f /src
parent8fb7c0f7f70b286f09e513ea42de8f87314b53b7 (diff)
downloadmrust-0879111f1c8d287a394ca2c2c56c941ded0842ab.tar.gz
Span - Tweak printing to print context (doesn't apply yet, because nothing provides context)
Diffstat (limited to 'src')
-rw-r--r--src/span.cpp35
1 files changed, 21 insertions, 14 deletions
diff --git a/src/span.cpp b/src/span.cpp
index 8d176671..d173ceb7 100644
--- a/src/span.cpp
+++ b/src/span.cpp
@@ -39,31 +39,38 @@ Span::Span():
//filename = FMT(":" << __builtin_return_address(0));
}
+namespace {
+ void print_span_message(const Span& sp, ::std::function<void(::std::ostream&)> tag, ::std::function<void(::std::ostream&)> msg)
+ {
+ auto& sink = ::std::cerr;
+ sink << sp.filename << ":" << sp.start_line << ": ";
+ tag(sink);
+ sink << ":";
+ msg(sink);
+ sink << ::std::endl;
+ const auto* parent = sp.outer_span.get();
+ while(parent)
+ {
+ sink << parent->filename << ":" << parent->start_line << ": note: From here" << ::std::endl;
+ parent = parent->outer_span.get();
+ }
+ }
+}
void Span::bug(::std::function<void(::std::ostream&)> msg) const
{
- ::std::cerr << this->filename << ":" << this->start_line << ": BUG:";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
+ print_span_message(*this, [](auto& os){os << "BUG";}, msg);
abort();
}
void Span::error(ErrorType tag, ::std::function<void(::std::ostream&)> msg) const {
- ::std::cerr << this->filename << ":" << this->start_line << ": error:" << tag <<":";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
+ print_span_message(*this, [&](auto& os){os << "error:" << tag;}, msg);
abort();
}
void Span::warning(WarningType tag, ::std::function<void(::std::ostream&)> msg) const {
- ::std::cerr << this->filename << ":" << this->start_line << ": warning:" << tag << ":";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
- //abort();
+ print_span_message(*this, [&](auto& os){os << "warning" << tag;}, msg);
}
void Span::note(::std::function<void(::std::ostream&)> msg) const {
- ::std::cerr << this->filename << ":" << this->start_line << ": note:";
- msg(::std::cerr);
- ::std::cerr << ::std::endl;
- //abort();
+ print_span_message(*this, [](auto& os){os << "note";}, msg);
}
::std::ostream& operator<<(::std::ostream& os, const Span& sp)