diff options
author | Ted Kremenek <kremenek@apple.com> | 2012-02-14 02:46:00 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2012-02-14 02:46:00 +0000 |
commit | 8be51eab5ad34515d2a40dcdc8558128ca1800ad (patch) | |
tree | cdd3950decb93678c56ccf8cb492a9e1834b2394 /lib | |
parent | 6700d67925abd674ecddfc56948967f49b25bf39 (diff) |
Refactor DiagnosticRenderer and SDiagsRenderer to have some functionality
pulled into DiagnosticNoteRenderer, and common DiagnosticRenderer that
assumes that all custom diagnostic messages are notes. Also extend
DiagnosticRenderer to work with StoredDiagnostics in preparation for
subsequent changes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150455 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Frontend/DiagnosticRenderer.cpp | 31 | ||||
-rw-r--r-- | lib/Frontend/SerializedDiagnosticPrinter.cpp | 39 | ||||
-rw-r--r-- | lib/Frontend/TextDiagnostic.cpp | 2 |
3 files changed, 38 insertions, 34 deletions
diff --git a/lib/Frontend/DiagnosticRenderer.cpp b/lib/Frontend/DiagnosticRenderer.cpp index 548a4a833c..29f9ed5a7d 100644 --- a/lib/Frontend/DiagnosticRenderer.cpp +++ b/lib/Frontend/DiagnosticRenderer.cpp @@ -133,9 +133,9 @@ void DiagnosticRenderer::emitDiagnostic(SourceLocation Loc, StringRef Message, ArrayRef<CharSourceRange> Ranges, ArrayRef<FixItHint> FixItHints, - const Diagnostic *Info) { + DiagOrStoredDiag D) { - beginDiagnostic(Info, Level); + beginDiagnostic(D, Level); PresumedLoc PLoc = getDiagnosticPresumedLoc(SM, Loc); @@ -144,7 +144,7 @@ void DiagnosticRenderer::emitDiagnostic(SourceLocation Loc, emitIncludeStack(PLoc.getIncludeLoc(), Level); // Next, emit the actual diagnostic message. - emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, Info); + emitDiagnosticMessage(Loc, PLoc, Level, Message, Ranges, D); // Only recurse if we have a valid location. if (Loc.isValid()) { @@ -166,7 +166,14 @@ void DiagnosticRenderer::emitDiagnostic(SourceLocation Loc, LastLoc = Loc; LastLevel = Level; - endDiagnostic(Info, Level); + endDiagnostic(D, Level); +} + + +void DiagnosticRenderer::emitStoredDiagnostic(StoredDiagnostic &Diag) { + emitDiagnostic(Diag.getLocation(), Diag.getLevel(), Diag.getMessage(), + Diag.getRanges(), Diag.getFixIts(), + &Diag); } /// \brief Prints an include stack when appropriate for a particular @@ -304,3 +311,19 @@ void DiagnosticRenderer::emitMacroExpansionsAndCarets( Ranges, ArrayRef<FixItHint>()); } +DiagnosticNoteRenderer::~DiagnosticNoteRenderer() {} + +void DiagnosticNoteRenderer::emitIncludeLocation(SourceLocation Loc, + PresumedLoc PLoc) { + // Generate a note indicating the include location. + SmallString<200> MessageStorage; + llvm::raw_svector_ostream Message(MessageStorage); + Message << "in file included from " << PLoc.getFilename() << ':' + << PLoc.getLine() << ":"; + emitNote(Loc, Message.str()); +} + +void DiagnosticNoteRenderer::emitBasicNote(StringRef Message) { + emitNote(SourceLocation(), Message); +} + diff --git a/lib/Frontend/SerializedDiagnosticPrinter.cpp b/lib/Frontend/SerializedDiagnosticPrinter.cpp index 649f294bf8..7a8edf7f5c 100644 --- a/lib/Frontend/SerializedDiagnosticPrinter.cpp +++ b/lib/Frontend/SerializedDiagnosticPrinter.cpp @@ -48,7 +48,7 @@ typedef llvm::SmallVectorImpl<uint64_t> RecordDataImpl; class SDiagsWriter; -class SDiagsRenderer : public DiagnosticRenderer { +class SDiagsRenderer : public DiagnosticNoteRenderer { SDiagsWriter &Writer; RecordData &Record; public: @@ -56,7 +56,7 @@ public: const SourceManager &SM, const LangOptions &LangOpts, const DiagnosticOptions &DiagOpts) - : DiagnosticRenderer(SM, LangOpts, DiagOpts), + : DiagnosticNoteRenderer(SM, LangOpts, DiagOpts), Writer(Writer), Record(Record){} virtual ~SDiagsRenderer() {} @@ -67,27 +67,22 @@ protected: DiagnosticsEngine::Level Level, StringRef Message, ArrayRef<CharSourceRange> Ranges, - const Diagnostic *Info); + DiagOrStoredDiag D); virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level, ArrayRef<CharSourceRange> Ranges) {} - virtual void emitBasicNote(StringRef Message); - void emitNote(SourceLocation Loc, StringRef Message); - virtual void emitIncludeLocation(SourceLocation Loc, - PresumedLoc PLoc); - virtual void emitCodeContext(SourceLocation Loc, DiagnosticsEngine::Level Level, SmallVectorImpl<CharSourceRange>& Ranges, ArrayRef<FixItHint> Hints); - virtual void beginDiagnostic(const Diagnostic *Info, + virtual void beginDiagnostic(DiagOrStoredDiag D, DiagnosticsEngine::Level Level); - virtual void endDiagnostic(const Diagnostic *Info, + virtual void endDiagnostic(DiagOrStoredDiag D, DiagnosticsEngine::Level Level); }; @@ -505,14 +500,14 @@ SDiagsRenderer::emitDiagnosticMessage(SourceLocation Loc, DiagnosticsEngine::Level Level, StringRef Message, ArrayRef<clang::CharSourceRange> Ranges, - const Diagnostic *Info) { + DiagOrStoredDiag D) { // Emit the RECORD_DIAG record. Writer.Record.clear(); Writer.Record.push_back(RECORD_DIAG); Writer.Record.push_back(Level); Writer.AddLocToRecord(Loc, SM, PLoc, Record); - if (Info) { + if (const Diagnostic *Info = D.dyn_cast<const Diagnostic*>()) { // Emit the category string lazily and get the category ID. unsigned DiagID = DiagnosticIDs::getCategoryNumberForDiag(Info->getID()); Writer.Record.push_back(Writer.getEmitCategory(DiagID)); @@ -529,14 +524,14 @@ SDiagsRenderer::emitDiagnosticMessage(SourceLocation Loc, Writer.Record, Message); } -void SDiagsRenderer::beginDiagnostic(const Diagnostic *Info, +void SDiagsRenderer::beginDiagnostic(DiagOrStoredDiag D, DiagnosticsEngine::Level Level) { Writer.Stream.EnterSubblock(BLOCK_DIAG, 4); } -void SDiagsRenderer::endDiagnostic(const Diagnostic *Info, +void SDiagsRenderer::endDiagnostic(DiagOrStoredDiag D, DiagnosticsEngine::Level Level) { - if (Info && Level != DiagnosticsEngine::Note) + if (D && Level != DiagnosticsEngine::Note) return; Writer.Stream.ExitBlock(); } @@ -581,20 +576,6 @@ void SDiagsRenderer::emitNote(SourceLocation Loc, StringRef Message) { Writer.Stream.ExitBlock(); } -void SDiagsRenderer::emitIncludeLocation(SourceLocation Loc, - PresumedLoc PLoc) { - // Generate a note indicating the include location. - SmallString<200> MessageStorage; - llvm::raw_svector_ostream Message(MessageStorage); - Message << "in file included from " << PLoc.getFilename() << ':' - << PLoc.getLine() << ":"; - emitNote(Loc, Message.str()); -} - -void SDiagsRenderer::emitBasicNote(StringRef Message) { - emitNote(SourceLocation(), Message); -} - void SDiagsWriter::finish() { if (inNonNoteDiagnostic) { // Finish off any diagnostics we were in the process of emitting. diff --git a/lib/Frontend/TextDiagnostic.cpp b/lib/Frontend/TextDiagnostic.cpp index 5b8fd5675d..9f5dcb4838 100644 --- a/lib/Frontend/TextDiagnostic.cpp +++ b/lib/Frontend/TextDiagnostic.cpp @@ -339,7 +339,7 @@ TextDiagnostic::emitDiagnosticMessage(SourceLocation Loc, DiagnosticsEngine::Level Level, StringRef Message, ArrayRef<clang::CharSourceRange> Ranges, - const Diagnostic *Info) { + DiagOrStoredDiag D) { uint64_t StartOfLocationInfo = OS.tell(); // Emit the location of this particular diagnostic. |