]> granicus.if.org Git - clang/commitdiff
Start work on subclassing PathDiagnosticPiece to distinguish more between control...
authorTed Kremenek <kremenek@apple.com>
Fri, 6 Mar 2009 22:10:49 +0000 (22:10 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 6 Mar 2009 22:10:49 +0000 (22:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@66291 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathDiagnostic.h
lib/Analysis/PathDiagnostic.cpp

index 30968592035536ad81ff0423d39ded2c738406e6..731bb7442261e3225d25ec6d816bf378d5655526 100644 (file)
@@ -26,7 +26,7 @@ namespace clang {
 
 class PathDiagnosticPiece {
 public:
-  enum Kind { ControlFlow, Event };
+  enum Kind { ControlFlow, Event, Macro };
   enum DisplayHint { Above, Below };
 
 private:
@@ -36,6 +36,7 @@ private:
   const Kind kind;
   const DisplayHint Hint;
   std::vector<SourceRange> ranges;
+  std::vector<PathDiagnosticPiece*> SubPieces;
   
   // Do not implement:
   PathDiagnosticPiece();
@@ -44,15 +45,17 @@ private:
   
 public:
   PathDiagnosticPiece(FullSourceLoc pos, const std::string& s,
-                      Kind k = Event,
-                      DisplayHint hint = Above);
+                      Kind k = Event, DisplayHint hint = Below);
   
   PathDiagnosticPiece(FullSourceLoc pos, const char* s,
-                      Kind k = Event,
-                      DisplayHint hint = Above);
+                      Kind k = Event, DisplayHint hint = Below);
+  
+  virtual ~PathDiagnosticPiece();
   
   const std::string& getString() const { return str; }
-   
+  
+  /// getDisplayHint - Return a hint indicating where the diagnostic should
+  ///  be displayed by the PathDiagnosticClient.
   DisplayHint getDisplayHint() const { return Hint; }
   
   Kind getKind() const { return kind; }
@@ -95,6 +98,24 @@ public:
   FullSourceLoc getLocation() const { return Pos; }
 };
   
+class PathDiagnosticMacroPiece : public PathDiagnosticPiece {
+  std::vector<PathDiagnosticPiece*> SubPieces;  
+public:
+  PathDiagnosticMacroPiece(FullSourceLoc pos, const std::string& s)
+    : PathDiagnosticPiece(pos, s, Macro) {}
+  
+  PathDiagnosticMacroPiece(FullSourceLoc pos, const char* s)
+    : PathDiagnosticPiece(pos, s, Macro) {}
+  
+  ~PathDiagnosticMacroPiece();
+  
+  void push_back(PathDiagnosticPiece* P) { SubPieces.push_back(P); }
+  
+  typedef std::vector<PathDiagnosticPiece*>::iterator iterator;
+  iterator begin() { return SubPieces.begin(); }
+  iterator end() { return SubPieces.end(); }
+};
+  
 class PathDiagnostic {
   std::list<PathDiagnosticPiece*> path;
   unsigned Size;
index 468b6c89f2bc5f76475a36e979786d8d14a4da9e..49af34dc1c1e909b70f8851436b42bc4b37961b4 100644 (file)
@@ -49,6 +49,12 @@ PathDiagnosticPiece::PathDiagnosticPiece(FullSourceLoc pos,
          "PathDiagnosticPiece's must have a valid location.");
 }
 
+PathDiagnosticPiece::~PathDiagnosticPiece() {}
+
+PathDiagnosticMacroPiece::~PathDiagnosticMacroPiece() {
+  for (iterator I = begin(), E = end(); I != E; ++I) delete *I;
+}
+
 PathDiagnostic::PathDiagnostic() : Size(0) {}
 
 PathDiagnostic::~PathDiagnostic() {