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
diff --git a/lib/Frontend/DiagnosticRenderer.cpp b/lib/Frontend/DiagnosticRenderer.cpp
index 548a4a8..29f9ed5 100644
--- a/lib/Frontend/DiagnosticRenderer.cpp
+++ b/lib/Frontend/DiagnosticRenderer.cpp
@@ -133,9 +133,9 @@
                                         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 @@
   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 @@
   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 @@
                  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);  
+}
+