]> granicus.if.org Git - clang/commitdiff
Genericize the qualtype formating callback to support any diag argument.
authorChris Lattner <sabre@nondot.org>
Sun, 23 Nov 2008 09:21:17 +0000 (09:21 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 23 Nov 2008 09:21:17 +0000 (09:21 +0000)
No functionality change.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59908 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/BugReporter.h
include/clang/Basic/Diagnostic.h
lib/Basic/Diagnostic.cpp
lib/Sema/Sema.cpp

index cc3011f8e02ab4565a3af7555a778864bd693062..945cca3ed0e395d19f7d5c5a1a7dbc341002d8a7 100644 (file)
@@ -337,8 +337,8 @@ public:
         break;
       case Diagnostic::ak_qualtype: {
         llvm::SmallString<64> Str;
-        Info.getDiags()->ConvertQualTypeToString(Info.getRawArg(i), 0, 0, 0, 0,
-                                                 Str);
+        Info.getDiags()->ConvertArgToString(Info.getArgKind(i),
+                                            Info.getRawArg(i), 0, 0, 0, 0, Str);
         R.addString(std::string(Str.begin(), Str.end()));
         break;
       }
index 981a559d165b6d5f1b1319f0f4ade107f39a3c16..144095f12952f616e103f9f957af91974210d208 100644 (file)
@@ -62,6 +62,15 @@ public:
     Ignored, Note, Warning, Error
   };
   
+  enum ArgumentKind {
+    ak_std_string,     // std::string
+    ak_c_string,       // const char *
+    ak_sint,           // int
+    ak_uint,           // unsigned
+    ak_identifierinfo, // IdentifierInfo
+    ak_qualtype        // QualType
+  };
+  
 private:  
   bool IgnoreAllWarnings;     // Ignore all warnings: -w
   bool WarningsAsErrors;      // Treat warnings like errors: 
@@ -84,12 +93,15 @@ private:
   /// CustomDiagInfo - Information for uniquing and looking up custom diags.
   diag::CustomDiagInfo *CustomDiagInfo;
 
-  /// QualTypeToString - A function pointer that converts QualType's to strings.
+  /// ArgToStringFn - A function pointer that converts an opaque diagnostic
+  /// argument to a strings.  This takes the modifiers and argument that was
+  /// present in the diagnostic.
   /// This is a hack to avoid a layering violation between libbasic and libsema.
-  typedef void (*QTToStringFnTy)(intptr_t QT, const char *Modifier, unsigned ML,
-                                 const char *Argument, unsigned ArgLen,
-                                 llvm::SmallVectorImpl<char> &Output);
-  QTToStringFnTy QualTypeToString;
+  typedef void (*ArgToStringFnTy)(ArgumentKind Kind, intptr_t Val,
+                                  const char *Modifier, unsigned ModifierLen,
+                                  const char *Argument, unsigned ArgumentLen,
+                                  llvm::SmallVectorImpl<char> &Output);
+  ArgToStringFnTy ArgToStringFn;
 public:
   explicit Diagnostic(DiagnosticClient *client = 0);
   ~Diagnostic();
@@ -157,16 +169,17 @@ public:
   unsigned getCustomDiagID(Level L, const char *Message);
   
   
-  /// ConvertQualTypeToString - This method converts a QualType (as an intptr_t)
-  /// into the string that represents it if possible.
-  void ConvertQualTypeToString(intptr_t QT, const char *Modifier, unsigned ML,
-                               const char *Argument, unsigned ArgLen,
-                               llvm::SmallVectorImpl<char> &Output) const {
-    QualTypeToString(QT, Modifier, ML, Argument, ArgLen, Output);
+  /// ConvertArgToString - This method converts a diagnostic argument (as an
+  /// intptr_t) into the string that represents it.
+  void ConvertArgToString(ArgumentKind Kind, intptr_t Val,
+                          const char *Modifier, unsigned ModLen,
+                          const char *Argument, unsigned ArgLen,
+                          llvm::SmallVectorImpl<char> &Output) const {
+    ArgToStringFn(Kind, Val, Modifier, ModLen, Argument, ArgLen, Output);
   }
   
-  void SetQualTypeToStringFn(QTToStringFnTy Fn) {
-    QualTypeToString = Fn;
+  void SetArgToStringFn(ArgToStringFnTy Fn) {
+    ArgToStringFn = Fn;
   }
   
   //===--------------------------------------------------------------------===//
@@ -246,15 +259,6 @@ private:
   /// ProcessDiag - This is the method used to report a diagnostic that is
   /// finally fully formed.
   void ProcessDiag();
-public:
-  enum ArgumentKind {
-    ak_std_string,     // std::string
-    ak_c_string,       // const char *
-    ak_sint,           // int
-    ak_uint,           // unsigned
-    ak_identifierinfo, // IdentifierInfo
-    ak_qualtype        // QualType
-  };
 };
 
 //===----------------------------------------------------------------------===//
index 8a897f57669ca4bd6b376869416d01b2556e44ab..fd65f75e0853ec897d3137c13eb2fc478cf15f85 100644 (file)
@@ -116,10 +116,11 @@ namespace clang {
 // Common Diagnostic implementation
 //===----------------------------------------------------------------------===//
 
-static void DummyQTToStringFnTy(intptr_t QT, const char *Modifier, unsigned ML,
-                                const char *Argument, unsigned ArgLen,
-                                llvm::SmallVectorImpl<char> &Output) {
-  const char *Str = "<can't format QualType>";
+static void DummyArgToStringFn(Diagnostic::ArgumentKind AK, intptr_t QT,
+                               const char *Modifier, unsigned ML,
+                               const char *Argument, unsigned ArgLen,
+                               llvm::SmallVectorImpl<char> &Output) {
+  const char *Str = "<can't format argument>";
   Output.append(Str, Str+strlen(Str));
 }
 
@@ -139,7 +140,7 @@ Diagnostic::Diagnostic(DiagnosticClient *client) : Client(client) {
   CustomDiagInfo = 0;
   CurDiagID = ~0U;
   
-  QualTypeToString = DummyQTToStringFnTy;
+  ArgToStringFn = DummyArgToStringFn;
 }
 
 Diagnostic::~Diagnostic() {
@@ -536,9 +537,9 @@ FormatDiagnostic(llvm::SmallVectorImpl<char> &OutStr) const {
     }
     case Diagnostic::ak_qualtype:
       OutStr.push_back('\'');
-      getDiags()->ConvertQualTypeToString(getRawArg(ArgNo),
-                                          Modifier, ModifierLen,
-                                          Argument, ArgumentLen, OutStr);
+      getDiags()->ConvertArgToString(getArgKind(ArgNo), getRawArg(ArgNo),
+                                     Modifier, ModifierLen,
+                                     Argument, ArgumentLen, OutStr);
       OutStr.push_back('\'');
       break;
     }
index d43eadd57441ca1d289368e351f97714e1b623d4..b01b5d77f3c57ce88bed4485081db99e874089cd 100644 (file)
@@ -22,12 +22,13 @@ using namespace clang;
 
 /// ConvertQualTypeToStringFn - This function is used to pretty print the 
 /// specified QualType as a string in diagnostics.
-static void ConvertQualTypeToStringFn(intptr_t QT,
+static void ConvertArgToStringFn(Diagnostic::ArgumentKind Kind, intptr_t QT,
                                       const char *Modifier, unsigned ML,
                                       const char *Argument, unsigned ArgLen,
                                       llvm::SmallVectorImpl<char> &Output) {
   assert(ML == 0 && ArgLen == 0 && "Invalid modifier for QualType argument");
-
+  assert(Kind == Diagnostic::ak_qualtype);
+  
   QualType Ty(QualType::getFromOpaquePtr(reinterpret_cast<void*>(QT)));
   
   // FIXME: Playing with std::string is really slow.
@@ -126,7 +127,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer)
     FieldCollector.reset(new CXXFieldCollector());
       
   // Tell diagnostics how to render things from the AST library.
-  PP.getDiagnostics().SetQualTypeToStringFn(ConvertQualTypeToStringFn);
+  PP.getDiagnostics().SetArgToStringFn(ConvertArgToStringFn);
 }
 
 /// ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.