Start work on subclassing PathDiagnosticPiece to distinguish more between control-flow pieces, events, etc.

llvm-svn: 66291
This commit is contained in:
Ted Kremenek 2009-03-06 22:10:49 +00:00
parent f4649f9f57
commit 81bddcb61e
2 changed files with 33 additions and 6 deletions

View 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;

View 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() {