aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/AST/ASTDumper.cpp192
1 files changed, 156 insertions, 36 deletions
diff --git a/lib/AST/ASTDumper.cpp b/lib/AST/ASTDumper.cpp
index 29680c47e3..6248da045a 100644
--- a/lib/AST/ASTDumper.cpp
+++ b/lib/AST/ASTDumper.cpp
@@ -30,6 +30,46 @@ using namespace clang::comments;
//===----------------------------------------------------------------------===//
namespace {
+ // Colors used for various parts of the AST dump
+
+ struct TerminalColor {
+ raw_ostream::Colors Color;
+ bool Bold;
+ };
+
+ // Decl kind names (VarDecl, FunctionDecl, etc)
+ static const TerminalColor DeclKindNameColor = { raw_ostream::GREEN, true };
+ // Attr names (CleanupAttr, GuardedByAttr, etc)
+ static const TerminalColor AttrColor = { raw_ostream::BLUE, true };
+ // Statement names (DeclStmt, ImplicitCastExpr, etc)
+ static const TerminalColor StmtColor = { raw_ostream::MAGENTA, true };
+ // Comment names (FullComment, ParagraphComment, TextComment, etc)
+ static const TerminalColor CommentColor = { raw_ostream::YELLOW, true };
+
+ // Type names (int, float, etc, plus user defined types)
+ static const TerminalColor TypeColor = { raw_ostream::GREEN, false };
+
+ // Pointer address
+ static const TerminalColor AddressColor = { raw_ostream::YELLOW, false };
+ // Source locations
+ static const TerminalColor LocationColor = { raw_ostream::YELLOW, false };
+
+ // lvalue/xvalue
+ static const TerminalColor ValueKindColor = { raw_ostream::CYAN, false };
+ // bitfield/objcproperty/objcsubscript/vectorcomponent
+ static const TerminalColor ObjectKindColor = { raw_ostream::CYAN, false };
+
+ // Null statements
+ static const TerminalColor NullColor = { raw_ostream::BLUE, false };
+
+ // CastKind from CastExpr's
+ static const TerminalColor CastColor = { raw_ostream::RED, false };
+
+ // Value of the statement
+ static const TerminalColor ValueColor = { raw_ostream::CYAN, true };
+ // Decl names
+ static const TerminalColor DeclNameColor = { raw_ostream::CYAN, true };
+
class ASTDumper
: public DeclVisitor<ASTDumper>, public StmtVisitor<ASTDumper>,
public ConstCommentVisitor<ASTDumper> {
@@ -47,6 +87,8 @@ namespace {
/// The \c FullComment parent of the comment being dumped.
const FullComment *FC;
+ bool ShowColors;
+
class IndentScope {
ASTDumper &Dumper;
public:
@@ -58,11 +100,31 @@ namespace {
}
};
+ class ColorScope {
+ ASTDumper &Dumper;
+ public:
+ ColorScope(ASTDumper &Dumper, TerminalColor Color)
+ : Dumper(Dumper) {
+ if (Dumper.ShowColors)
+ Dumper.OS.changeColor(Color.Color, Color.Bold);
+ }
+ ~ColorScope() {
+ if (Dumper.ShowColors)
+ Dumper.OS.resetColor();
+ }
+ };
+
public:
ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
const SourceManager *SM)
: OS(OS), Traits(Traits), SM(SM), IndentLevel(0), IsFirstLine(true),
- LastLocFilename(""), LastLocLine(~0U), FC(0) { }
+ LastLocFilename(""), LastLocLine(~0U), FC(0),
+ ShowColors(SM && SM->getDiagnostics().getShowColors()) { }
+
+ ASTDumper(raw_ostream &OS, const CommandTraits *Traits,
+ const SourceManager *SM, bool ShowColors)
+ : OS(OS), Traits(Traits), SM(SM), IndentLevel(0), IsFirstLine(true),
+ LastLocFilename(""), LastLocLine(~0U), ShowColors(ShowColors) { }
~ASTDumper() {
OS << "\n";
@@ -238,10 +300,12 @@ void ASTDumper::unindent() {
}
void ASTDumper::dumpPointer(const void *Ptr) {
+ ColorScope Color(*this, AddressColor);
OS << ' ' << Ptr;
}
void ASTDumper::dumpLocation(SourceLocation Loc) {
+ ColorScope Color(*this, LocationColor);
SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
// The general format we print out is filename:line:col, but we drop pieces
@@ -285,6 +349,8 @@ void ASTDumper::dumpSourceRange(SourceRange R) {
}
void ASTDumper::dumpBareType(QualType T) {
+ ColorScope Color(*this, TypeColor);
+
SplitQualType T_split = T.split();
OS << "'" << QualType::getAsString(T_split) << "'";
@@ -302,10 +368,14 @@ void ASTDumper::dumpType(QualType T) {
}
void ASTDumper::dumpBareDeclRef(const Decl *D) {
- OS << D->getDeclKindName();
+ {
+ ColorScope Color(*this, DeclKindNameColor);
+ OS << D->getDeclKindName();
+ }
dumpPointer(D);
if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) {
+ ColorScope Color(*this, DeclNameColor);
OS << " '";
ND->getDeclName().printName(OS);
OS << "'";
@@ -326,8 +396,10 @@ void ASTDumper::dumpDeclRef(const Decl *D, const char *Label) {
}
void ASTDumper::dumpName(const NamedDecl *ND) {
- if (ND->getDeclName())
+ if (ND->getDeclName()) {
+ ColorScope Color(*this, DeclNameColor);
OS << ' ' << ND->getNameAsString();
+ }
}
void ASTDumper::dumpDeclContext(const DeclContext *DC) {
@@ -340,12 +412,15 @@ void ASTDumper::dumpDeclContext(const DeclContext *DC) {
void ASTDumper::dumpAttr(const Attr *A) {
IndentScope Indent(*this);
- switch (A->getKind()) {
+ {
+ ColorScope Color(*this, AttrColor);
+ switch (A->getKind()) {
#define ATTR(X) case attr::X: OS << #X; break;
#include "clang/Basic/AttrList.inc"
- default: llvm_unreachable("unexpected attribute kind");
+ default: llvm_unreachable("unexpected attribute kind");
+ }
+ OS << "Attr";
}
- OS << "Attr";
dumpPointer(A);
dumpSourceRange(A->getRange());
#include "clang/AST/AttrDump.inc"
@@ -460,11 +535,15 @@ void ASTDumper::dumpDecl(Decl *D) {
IndentScope Indent(*this);
if (!D) {
+ ColorScope Color(*this, NullColor);
OS << "<<<NULL>>>";
return;
}
- OS << D->getDeclKindName() << "Decl";
+ {
+ ColorScope Color(*this, DeclKindNameColor);
+ OS << D->getDeclKindName() << "Decl";
+ }
dumpPointer(D);
dumpSourceRange(D->getSourceRange());
DeclVisitor<ASTDumper>::Visit(D);
@@ -981,6 +1060,7 @@ void ASTDumper::dumpStmt(Stmt *S) {
IndentScope Indent(*this);
if (!S) {
+ ColorScope Color(*this, NullColor);
OS << "<<<NULL>>>";
return;
}
@@ -996,7 +1076,10 @@ void ASTDumper::dumpStmt(Stmt *S) {
}
void ASTDumper::VisitStmt(Stmt *Node) {
- OS << Node->getStmtClassName();
+ {
+ ColorScope Color(*this, StmtColor);
+ OS << Node->getStmtClassName();
+ }
dumpPointer(Node);
dumpSourceRange(Node->getSourceRange());
}
@@ -1034,32 +1117,38 @@ void ASTDumper::VisitExpr(Expr *Node) {
VisitStmt(Node);
dumpType(Node->getType());
- switch (Node->getValueKind()) {
- case VK_RValue:
- break;
- case VK_LValue:
- OS << " lvalue";
- break;
- case VK_XValue:
- OS << " xvalue";
- break;
+ {
+ ColorScope Color(*this, ValueKindColor);
+ switch (Node->getValueKind()) {
+ case VK_RValue:
+ break;
+ case VK_LValue:
+ OS << " lvalue";
+ break;
+ case VK_XValue:
+ OS << " xvalue";
+ break;
+ }
}
- switch (Node->getObjectKind()) {
- case OK_Ordinary:
- break;
- case OK_BitField:
- OS << " bitfield";
- break;
- case OK_ObjCProperty:
- OS << " objcproperty";
- break;
- case OK_ObjCSubscript:
- OS << " objcsubscript";
- break;
- case OK_VectorComponent:
- OS << " vectorcomponent";
- break;
+ {
+ ColorScope Color(*this, ObjectKindColor);
+ switch (Node->getObjectKind()) {
+ case OK_Ordinary:
+ break;
+ case OK_BitField:
+ OS << " bitfield";
+ break;
+ case OK_ObjCProperty:
+ OS << " objcproperty";
+ break;
+ case OK_ObjCSubscript:
+ OS << " objcsubscript";
+ break;
+ case OK_VectorComponent:
+ OS << " vectorcomponent";
+ break;
+ }
}
}
@@ -1089,7 +1178,11 @@ static void dumpBasePath(raw_ostream &OS, CastExpr *Node) {
void ASTDumper::VisitCastExpr(CastExpr *Node) {
VisitExpr(Node);
- OS << " <" << Node->getCastKindName();
+ OS << " <";
+ {
+ ColorScope Color(*this, CastColor);
+ OS << Node->getCastKindName();
+ }
dumpBasePath(OS, Node);
OS << ">";
}
@@ -1124,8 +1217,11 @@ void ASTDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
void ASTDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
VisitExpr(Node);
- OS << " " << Node->getDecl()->getDeclKindName()
- << "Decl='" << *Node->getDecl() << "'";
+ {
+ ColorScope Color(*this, DeclKindNameColor);
+ OS << " " << Node->getDecl()->getDeclKindName() << "Decl";
+ }
+ OS << "='" << *Node->getDecl() << "'";
dumpPointer(Node->getDecl());
if (Node->isFreeIvar())
OS << " isFreeIvar";
@@ -1144,6 +1240,7 @@ void ASTDumper::VisitPredefinedExpr(PredefinedExpr *Node) {
void ASTDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
VisitExpr(Node);
+ ColorScope Color(*this, ValueColor);
OS << " " << Node->getValue();
}
@@ -1151,16 +1248,19 @@ void ASTDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
VisitExpr(Node);
bool isSigned = Node->getType()->isSignedIntegerType();
+ ColorScope Color(*this, ValueColor);
OS << " " << Node->getValue().toString(10, isSigned);
}
void ASTDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
VisitExpr(Node);
+ ColorScope Color(*this, ValueColor);
OS << " " << Node->getValueAsApproximateDouble();
}
void ASTDumper::VisitStringLiteral(StringLiteral *Str) {
VisitExpr(Str);
+ ColorScope Color(*this, ValueColor);
OS << " ";
Str->outputString(OS);
}
@@ -1429,11 +1529,15 @@ void ASTDumper::dumpComment(const Comment *C) {
IndentScope Indent(*this);
if (!C) {
+ ColorScope Color(*this, NullColor);
OS << "<<<NULL>>>";
return;
}
- OS << C->getCommentKindName();
+ {
+ ColorScope Color(*this, CommentColor);
+ OS << C->getCommentKindName();
+ }
dumpPointer(C);
dumpSourceRange(C->getSourceRange());
ConstCommentVisitor<ASTDumper>::visit(C);
@@ -1556,6 +1660,11 @@ void Decl::dump(raw_ostream &OS) const {
P.dumpDecl(const_cast<Decl*>(this));
}
+void Decl::dumpColor() const {
+ ASTDumper P(llvm::errs(), &getASTContext().getCommentCommandTraits(),
+ &getASTContext().getSourceManager(), /*ShowColors*/true);
+ P.dumpDecl(const_cast<Decl*>(this));
+}
//===----------------------------------------------------------------------===//
// Stmt method implementations
//===----------------------------------------------------------------------===//
@@ -1574,6 +1683,11 @@ void Stmt::dump() const {
P.dumpStmt(const_cast<Stmt*>(this));
}
+void Stmt::dumpColor() const {
+ ASTDumper P(llvm::errs(), 0, 0, /*ShowColors*/true);
+ P.dumpStmt(const_cast<Stmt*>(this));
+}
+
//===----------------------------------------------------------------------===//
// Comment method implementations
//===----------------------------------------------------------------------===//
@@ -1593,3 +1707,9 @@ void Comment::dump(raw_ostream &OS, const CommandTraits *Traits,
ASTDumper D(OS, Traits, SM);
D.dumpFullComment(FC);
}
+
+void Comment::dumpColor() const {
+ const FullComment *FC = dyn_cast<FullComment>(this);
+ ASTDumper D(llvm::errs(), 0, 0, /*ShowColors*/true);
+ D.dumpFullComment(FC);
+}