diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-10-29 11:59:49 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-10-29 11:59:49 +0800 |
commit | 0879111f1c8d287a394ca2c2c56c941ded0842ab (patch) | |
tree | b9a0ae56981adbe48742fa637cb42b4a570f569f /src | |
parent | 8fb7c0f7f70b286f09e513ea42de8f87314b53b7 (diff) | |
download | mrust-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.cpp | 35 |
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) |