]> granicus.if.org Git - clang/commitdiff
Refactor DiagnosticRenderer and SDiagsRenderer to have some functionality
authorTed Kremenek <kremenek@apple.com>
Tue, 14 Feb 2012 02:46:00 +0000 (02:46 +0000)
committerTed Kremenek <kremenek@apple.com>
Tue, 14 Feb 2012 02:46:00 +0000 (02:46 +0000)
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

include/clang/Frontend/DiagnosticRenderer.h
include/clang/Frontend/TextDiagnostic.h
lib/Frontend/DiagnosticRenderer.cpp
lib/Frontend/SerializedDiagnosticPrinter.cpp
lib/Frontend/TextDiagnostic.cpp

index fc9131b4bd7457356e16d6446b95396beaae37d9..5ad88a8a5364701a51ac5f97b9716b6acfd18f4e 100644 (file)
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/LLVM.h"
 #include "clang/Basic/SourceLocation.h"
+#include "llvm/ADT/PointerUnion.h"
 
 namespace clang {
-  class DiagnosticOptions;
-  class LangOptions;
-  class SourceManager;
 
+class DiagnosticOptions;
+class LangOptions;
+class SourceManager;
+
+typedef llvm::PointerUnion<const Diagnostic *,
+                           const StoredDiagnostic *> DiagOrStoredDiag;
+  
 /// \brief Class to encapsulate the logic for formatting a diagnostic message.
 ///  Actual "printing" logic is implemented by subclasses.
 ///
@@ -71,7 +76,7 @@ protected:
                                      DiagnosticsEngine::Level Level,
                                      StringRef Message,
                                      ArrayRef<CharSourceRange> Ranges,
-                                     const Diagnostic *Info) = 0;
+                                     DiagOrStoredDiag Info) = 0;
   
   virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc,
                                  DiagnosticsEngine::Level Level,
@@ -86,9 +91,9 @@ protected:
   
   virtual void emitIncludeLocation(SourceLocation Loc, PresumedLoc PLoc) = 0;
   
-  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) {}
 
   
@@ -117,7 +122,28 @@ public:
   void emitDiagnostic(SourceLocation Loc, DiagnosticsEngine::Level Level,
                       StringRef Message, ArrayRef<CharSourceRange> Ranges,
                       ArrayRef<FixItHint> FixItHints,
-                      const Diagnostic *Info = 0);
+                      DiagOrStoredDiag D = (Diagnostic *)0);
+
+  void emitStoredDiagnostic(StoredDiagnostic &Diag);
+};
+  
+/// Subclass of DiagnosticRender that turns all subdiagostics into explicit
+/// notes.  It is up to subclasses to further define the behavior.
+class DiagnosticNoteRenderer : public DiagnosticRenderer {
+public:
+  DiagnosticNoteRenderer(const SourceManager &SM,
+                         const LangOptions &LangOpts,
+                         const DiagnosticOptions &DiagOpts)
+    : DiagnosticRenderer(SM, LangOpts, DiagOpts) {}
+  
+  virtual ~DiagnosticNoteRenderer();
+  
+  virtual void emitBasicNote(StringRef Message);
+    
+  virtual void emitIncludeLocation(SourceLocation Loc,
+                                   PresumedLoc PLoc);
+  
+  virtual void emitNote(SourceLocation Loc, StringRef Message) = 0;
 };
 } // end clang namespace
 #endif
index 4c71752c6fa4d39f52159616537416a9f3629ae6..519d3b61ce70ca3a46d29e13847ebfff65f87b63 100644 (file)
@@ -81,7 +81,7 @@ protected:
                                      DiagnosticsEngine::Level Level,
                                      StringRef Message,
                                      ArrayRef<CharSourceRange> Ranges,
-                                     const Diagnostic *Info);
+                                     DiagOrStoredDiag D);
 
   virtual void emitDiagnosticLoc(SourceLocation Loc, PresumedLoc PLoc,
                                  DiagnosticsEngine::Level Level,
index 548a4a833cee22ffb053e977dd4a57ed08b88ac0..29f9ed5a7d47be8891490354210f11ba32b86208 100644 (file)
@@ -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);  
+}
+
index 649f294bf87ac878dfa1df6e88c98dc1f7ba790e..7a8edf7f5c5b1186228a9a3d00f48474278b774d 100644 (file)
@@ -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.
index 5b8fd5675d7735ede50b8a55f1b6c6eec19abfec..9f5dcb48380317e4b1754306d853a6ae63359f2a 100644 (file)
@@ -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.