aboutsummaryrefslogtreecommitdiff
path: root/lib/Frontend/TextDiagnosticPrinter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Frontend/TextDiagnosticPrinter.cpp')
-rw-r--r--lib/Frontend/TextDiagnosticPrinter.cpp32
1 files changed, 23 insertions, 9 deletions
diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp
index 074d4134a6..30d2c6392b 100644
--- a/lib/Frontend/TextDiagnosticPrinter.cpp
+++ b/lib/Frontend/TextDiagnosticPrinter.cpp
@@ -43,8 +43,7 @@ const unsigned WordWrapIndentation = 6;
TextDiagnosticPrinter::TextDiagnosticPrinter(raw_ostream &os,
const DiagnosticOptions &diags,
bool _OwnsOutputStream)
- : OS(os), LangOpts(0), DiagOpts(&diags),
- LastCaretDiagnosticWasNote(0),
+ : OS(os), LangOpts(0), DiagOpts(&diags), LastLevel(),
OwnsOutputStream(_OwnsOutputStream) {
}
@@ -498,15 +497,23 @@ class TextDiagnostic {
/// root locations rather than diagnostic locations.
SourceLocation LastIncludeLoc;
+ /// \brief The level of the last diagnostic emitted.
+ ///
+ /// The level of the last diagnostic emitted. Used to detect level changes
+ /// which change the amount of information displayed.
+ DiagnosticsEngine::Level LastLevel;
+
public:
TextDiagnostic(raw_ostream &OS,
const SourceManager &SM,
const LangOptions &LangOpts,
const DiagnosticOptions &DiagOpts,
FullSourceLoc LastLoc = FullSourceLoc(),
- FullSourceLoc LastIncludeLoc = FullSourceLoc())
+ FullSourceLoc LastIncludeLoc = FullSourceLoc(),
+ DiagnosticsEngine::Level LastLevel
+ = DiagnosticsEngine::Level())
: OS(OS), SM(SM), LangOpts(LangOpts), DiagOpts(DiagOpts),
- LastLoc(LastLoc), LastIncludeLoc(LastIncludeLoc) {
+ LastLoc(LastLoc), LastIncludeLoc(LastIncludeLoc), LastLevel(LastLevel) {
if (LastLoc.isValid() && &SM != &LastLoc.getManager())
this->LastLoc = SourceLocation();
if (LastIncludeLoc.isValid() && &SM != &LastIncludeLoc.getManager())
@@ -519,6 +526,9 @@ public:
/// \brief Get the last emitted include stack location.
SourceLocation getLastIncludeLoc() const { return LastIncludeLoc; }
+ /// \brief Get the last diagnostic level.
+ DiagnosticsEngine::Level getLastLevel() const { return LastLevel; }
+
void Emit(SourceLocation Loc, DiagnosticsEngine::Level Level,
StringRef Message, ArrayRef<CharSourceRange> Ranges,
ArrayRef<FixItHint> FixItHints,
@@ -550,7 +560,7 @@ public:
// multiple times if one loc has multiple diagnostics.
if (DiagOpts.ShowCarets &&
(Loc != LastLoc || !Ranges.empty() || !FixItHints.empty() ||
- (LastCaretDiagnosticWasNote && Level != DiagnosticsEngine::Note))) {
+ (LastLevel == DiagnosticsEngine::Note && Level != LastLevel))) {
// Get the ranges into a local array we can hack on.
SmallVector<CharSourceRange, 20> MutableRanges(Ranges.begin(),
Ranges.end());
@@ -566,6 +576,7 @@ public:
}
LastLoc = Loc;
+ LastLevel = Level;
}
/// \brief Emit the caret and underlining text.
@@ -1279,18 +1290,21 @@ void TextDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level,
"Unexpected diagnostic with no source manager");
const SourceManager &SM = Info.getSourceManager();
TextDiagnostic TextDiag(OS, SM, *LangOpts, *DiagOpts,
- LastLoc, LastIncludeLoc);
+ LastLoc, LastIncludeLoc, LastLevel);
TextDiag.Emit(Info.getLocation(), Level, DiagMessageStream.str(),
Info.getRanges(),
llvm::makeArrayRef(Info.getFixItHints(),
- Info.getNumFixItHints()),
- LastCaretDiagnosticWasNote);
+ Info.getNumFixItHints()));
// Cache the LastLoc from the TextDiagnostic printing.
+ // FIXME: Rather than this, we should persist a TextDiagnostic object across
+ // diagnostics until the SourceManager changes. That will allow the
+ // TextDiagnostic object to form a 'session' of output where we can
+ // reasonably collapse redundant information.
LastLoc = FullSourceLoc(TextDiag.getLastLoc(), SM);
LastIncludeLoc = FullSourceLoc(TextDiag.getLastIncludeLoc(), SM);
- LastCaretDiagnosticWasNote = (Level == DiagnosticsEngine::Note);
+ LastLevel = TextDiag.getLastLevel();
OS.flush();
}