ASTDumper.cpp revision d5bc359971fe9e3d78a44e9b25a909f01f3018ec
16000dace22f110d8768476989313e9d981d690d0Chris Lattner//===--- StmtDumper.cpp - Dumping implementation for Stmt ASTs ------------===//
26000dace22f110d8768476989313e9d981d690d0Chris Lattner//
36000dace22f110d8768476989313e9d981d690d0Chris Lattner//                     The LLVM Compiler Infrastructure
46000dace22f110d8768476989313e9d981d690d0Chris Lattner//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
76000dace22f110d8768476989313e9d981d690d0Chris Lattner//
86000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
96000dace22f110d8768476989313e9d981d690d0Chris Lattner//
10cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek// This file implements the Stmt::dump method, which dumps out the
116000dace22f110d8768476989313e9d981d690d0Chris Lattner// AST in a form that exposes type details and other fields.
126000dace22f110d8768476989313e9d981d690d0Chris Lattner//
136000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
146000dace22f110d8768476989313e9d981d690d0Chris Lattner
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/PrettyPrinter.h"
16478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h"
172a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor#include "clang/AST/DeclCXX.h"
1855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/DeclObjC.h"
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/AST/StmtVisitor.h"
20e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner#include "clang/Basic/SourceManager.h"
21806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar#include "llvm/Support/raw_ostream.h"
226000dace22f110d8768476989313e9d981d690d0Chris Lattnerusing namespace clang;
236000dace22f110d8768476989313e9d981d690d0Chris Lattner
246000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
256000dace22f110d8768476989313e9d981d690d0Chris Lattner// StmtDumper Visitor
266000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
276000dace22f110d8768476989313e9d981d690d0Chris Lattner
286000dace22f110d8768476989313e9d981d690d0Chris Lattnernamespace  {
29770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer  class StmtDumper : public StmtVisitor<StmtDumper> {
30e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    SourceManager *SM;
315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    raw_ostream &OS;
326000dace22f110d8768476989313e9d981d690d0Chris Lattner    unsigned IndentLevel;
33cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    bool IsFirstLine;
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
35e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    /// LastLocFilename/LastLocLine - Keep track of the last location we print
36e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    /// out so that we can print out deltas from then on out.
37e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    const char *LastLocFilename;
38e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    unsigned LastLocLine;
39d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregor
40cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    class IndentScope {
41cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      StmtDumper &Dumper;
42cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    public:
43cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      IndentScope(StmtDumper &Dumper) : Dumper(Dumper) {
44cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek        Dumper.indent();
45cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      }
46cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      ~IndentScope() {
47cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek        Dumper.unindent();
48cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      }
49cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    };
50cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek
516000dace22f110d8768476989313e9d981d690d0Chris Lattner  public:
5295f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko    StmtDumper(SourceManager *SM, raw_ostream &OS)
5395f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko      : SM(SM), OS(OS), IndentLevel(0), IsFirstLine(true),
5495f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko        LastLocFilename(""), LastLocLine(~0U) { }
551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    ~StmtDumper() {
57cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      OS << "\n";
58cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    }
59cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek
60d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    void dumpDecl(Decl *D);
61d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    void dumpStmt(Stmt *S);
621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
63cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    void indent() {
64cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      if (IsFirstLine)
65cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek        IsFirstLine = false;
66cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      else
67cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek        OS << "\n";
68cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      OS.indent(IndentLevel * 2);
69cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      OS << "(";
70cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      IndentLevel++;
71cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    }
72cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek
73cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    void unindent() {
74cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      OS << ")";
75cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek      IndentLevel--;
766000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
789dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff    void DumpType(QualType T) {
7949f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall      SplitQualType T_split = T.split();
8049f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall      OS << "'" << QualType::getAsString(T_split) << "'";
81fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner
8261366e9cd41a6dbde4e66416dac21269c8ac1d94Douglas Gregor      if (!T.isNull()) {
830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        // If the type is sugared, also dump a (shallow) desugared type.
8449f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall        SplitQualType D_split = T.getSplitDesugaredType();
8549f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall        if (T_split != D_split)
8649f4e1cbd839da27ff4814b4ea6d85a79f786cbdJohn McCall          OS << ":'" << QualType::getAsString(D_split) << "'";
87bad37858aef8910195a9c75f2892a09a032424b7Chris Lattner      }
88fd8f7da224ef188f799256a6bc37c463ba0071edChris Lattner    }
896b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    void DumpDeclRef(Decl *node);
90f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    void DumpValueKind(ExprValueKind K) {
91f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      switch (K) {
92f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      case VK_RValue: break;
93f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      case VK_LValue: OS << " lvalue"; break;
94f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      case VK_XValue: OS << " xvalue"; break;
95f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      }
96f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    }
97f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    void DumpObjectKind(ExprObjectKind K) {
98f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      switch (K) {
99f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      case OK_Ordinary: break;
100f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      case OK_BitField: OS << " bitfield"; break;
101f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      case OK_ObjCProperty: OS << " objcproperty"; break;
102ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek      case OK_ObjCSubscript: OS << " objcsubscript"; break;
103f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      case OK_VectorComponent: OS << " vectorcomponent"; break;
104f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall      }
105f89e55ab1bfb3ea997f8b02997c611a02254eb2dJohn McCall    }
1069dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroff    void DumpSourceRange(const Stmt *Node);
107e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner    void DumpLocation(SourceLocation Loc);
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Stmts.
110c5598cbc4c3f2fb515af7f142f78ff630bdb5c01Chris Lattner    void VisitStmt(Stmt *Node);
1115399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek    void VisitDeclStmt(DeclStmt *Node);
11217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitLabelStmt(LabelStmt *Node);
11317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitGotoStmt(GotoStmt *Node);
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // Exprs
11617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitExpr(Expr *Node);
11727a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson    void VisitCastExpr(CastExpr *Node);
11817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitDeclRefExpr(DeclRefExpr *Node);
119d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattner    void VisitPredefinedExpr(PredefinedExpr *Node);
12017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCharacterLiteral(CharacterLiteral *Node);
12117a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitIntegerLiteral(IntegerLiteral *Node);
12217a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitFloatingLiteral(FloatingLiteral *Node);
12317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitStringLiteral(StringLiteral *Str);
12417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitUnaryOperator(UnaryOperator *Node);
125f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    void VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node);
12617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitMemberExpr(MemberExpr *Node);
127213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begeman    void VisitExtVectorElementExpr(ExtVectorElementExpr *Node);
12817a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitBinaryOperator(BinaryOperator *Node);
12917a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCompoundAssignOperator(CompoundAssignOperator *Node);
13017a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitAddrLabelExpr(AddrLabelExpr *Node);
1316b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    void VisitBlockExpr(BlockExpr *Node);
1324b9c2d235fb9449e249d74f48ecfec601650de93John McCall    void VisitOpaqueValueExpr(OpaqueValueExpr *Node);
13317a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
13417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // C++
13549badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    void VisitCXXNamedCastExpr(CXXNamedCastExpr *Node);
13617a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node);
137cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor    void VisitCXXThisExpr(CXXThisExpr *Node);
13849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor    void VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node);
1390eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson    void VisitCXXConstructExpr(CXXConstructExpr *Node);
1400eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson    void VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node);
1414765fa05b5652fcc4356371c2f481d0ea9a1b007John McCall    void VisitExprWithCleanups(ExprWithCleanups *Node);
1429d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall    void VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node);
1430eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson    void DumpCXXTemporary(CXXTemporary *Temporary);
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
14517a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    // ObjC
1468f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    void VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node);
14717a1a72e70dcbd6257dde644c790a3013113174fChris Lattner    void VisitObjCEncodeExpr(ObjCEncodeExpr *Node);
148b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek    void VisitObjCMessageExpr(ObjCMessageExpr* Node);
14936faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis    void VisitObjCBoxedExpr(ObjCBoxedExpr* Node);
150b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian    void VisitObjCSelectorExpr(ObjCSelectorExpr *Node);
151390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian    void VisitObjCProtocolExpr(ObjCProtocolExpr *Node);
1527f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar    void VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node);
153ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    void VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node);
1543c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff    void VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node);
155ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    void VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node);
1566000dace22f110d8768476989313e9d981d690d0Chris Lattner  };
1576000dace22f110d8768476989313e9d981d690d0Chris Lattner}
1586000dace22f110d8768476989313e9d981d690d0Chris Lattner
1596000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
160e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//  Utilities
161e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
162e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
163e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid StmtDumper::DumpLocation(SourceLocation Loc) {
164df7c17a8d02fe09a3466786bae3e40fc3252687aChris Lattner  SourceLocation SpellingLoc = SM->getSpellingLoc(Loc);
1651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
166e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // The general format we print out is filename:line:col, but we drop pieces
167e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // that haven't changed since the last loc printed.
168b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  PresumedLoc PLoc = SM->getPresumedLoc(SpellingLoc);
169b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner
170cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor  if (PLoc.isInvalid()) {
171cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    OS << "<invalid sloc>";
172cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor    return;
173cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor  }
174cb7b1e17b63967317ab5cc55682168cf0380519aDouglas Gregor
175b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  if (strcmp(PLoc.getFilename(), LastLocFilename) != 0) {
176806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << PLoc.getFilename() << ':' << PLoc.getLine()
177806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar       << ':' << PLoc.getColumn();
178b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocFilename = PLoc.getFilename();
179b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocLine = PLoc.getLine();
180b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner  } else if (PLoc.getLine() != LastLocLine) {
181806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "line" << ':' << PLoc.getLine()
182806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar       << ':' << PLoc.getColumn();
183b9c3f966b103f7cfe8e5e60007c4c8b38f7298ebChris Lattner    LastLocLine = PLoc.getLine();
184e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  } else {
185806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "col" << ':' << PLoc.getColumn();
186e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
187e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
188e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
1899dcbfa450d751bd68fc4af8b75da381d4f6984b9Steve Naroffvoid StmtDumper::DumpSourceRange(const Stmt *Node) {
190e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // Can't translate locations if a SourceManager isn't available.
191e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  if (SM == 0) return;
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
193e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // TODO: If the parent expression is available, we can print a delta vs its
194e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // location.
195e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  SourceRange R = Node->getSourceRange();
1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
197806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " <";
198311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner  DumpLocation(R.getBegin());
199311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner  if (R.getBegin() != R.getEnd()) {
200806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << ", ";
201311ff02fae0392bee6abe7723cdf5a69b2899a47Chris Lattner    DumpLocation(R.getEnd());
202e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  }
203806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << ">";
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
205e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner  // <t2.c:123:421[blah], t2.c:412:321>
206e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
207e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner}
208e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner
209e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattner//===----------------------------------------------------------------------===//
210d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//  Decl printing methods.
2116000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
2126000dace22f110d8768476989313e9d981d690d0Chris Lattner
213d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienkovoid StmtDumper::dumpDecl(Decl *D) {
2146000dace22f110d8768476989313e9d981d690d0Chris Lattner  // FIXME: Need to complete/beautify this... this code simply shows the
2156000dace22f110d8768476989313e9d981d690d0Chris Lattner  // nodes are where they need to be.
2166000dace22f110d8768476989313e9d981d690d0Chris Lattner  if (TypedefDecl *localType = dyn_cast<TypedefDecl>(D)) {
217806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "\"typedef " << localType->getUnderlyingType().getAsString()
218b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer       << ' ' << *localType << '"';
219162e1c1b487352434552147967c3dd296ebee2f7Richard Smith  } else if (TypeAliasDecl *localType = dyn_cast<TypeAliasDecl>(D)) {
220b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << "\"using " << *localType << " = "
221162e1c1b487352434552147967c3dd296ebee2f7Richard Smith       << localType->getUnderlyingType().getAsString() << '"';
2226000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else if (ValueDecl *VD = dyn_cast<ValueDecl>(D)) {
223806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << "\"";
2246000dace22f110d8768476989313e9d981d690d0Chris Lattner    // Emit storage class for vardecls.
2256000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
226d931b086984257de68868a64a235c2b4b34003fbJohn McCall      if (V->getStorageClass() != SC_None)
227806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar        OS << VarDecl::getStorageClassSpecifierString(V->getStorageClass())
228806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar           << " ";
2296000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
2301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
23139f34e97d6a468f0a7dfa5664c61217cffc65b74Chris Lattner    std::string Name = VD->getNameAsString();
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    VD->getType().getAsStringInternal(Name,
2334e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie                          PrintingPolicy(VD->getASTContext().getLangOpts()));
234806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << Name;
2351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2366000dace22f110d8768476989313e9d981d690d0Chris Lattner    // If this is a vardecl with an initializer, emit it.
2376000dace22f110d8768476989313e9d981d690d0Chris Lattner    if (VarDecl *V = dyn_cast<VarDecl>(VD)) {
2386000dace22f110d8768476989313e9d981d690d0Chris Lattner      if (V->getInit()) {
239cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek        OS << " =";
240d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko        dumpStmt(V->getInit());
2416000dace22f110d8768476989313e9d981d690d0Chris Lattner      }
2426000dace22f110d8768476989313e9d981d690d0Chris Lattner    }
243806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << '"';
2449219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff  } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
2459219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    // print a free standing tag decl (e.g. "struct x;").
2469219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    const char *tagname;
2479219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    if (const IdentifierInfo *II = TD->getIdentifier())
248e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar      tagname = II->getNameStart();
2499219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    else
2509219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff      tagname = "<anonymous>";
251806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << '"' << TD->getKindName() << ' ' << tagname << ";\"";
2529219928c7a036b65d7801a02c4de3a8283ed3124Steve Naroff    // FIXME: print tag bodies.
2532a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor  } else if (UsingDirectiveDecl *UD = dyn_cast<UsingDirectiveDecl>(D)) {
2542a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    // print using-directive decl (e.g. "using namespace x;")
2552a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    const char *ns;
2562a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    if (const IdentifierInfo *II = UD->getNominatedNamespace()->getIdentifier())
257e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar      ns = II->getNameStart();
2582a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor    else
2592a3009a432bdcec59e6383d7b2b17494d6f91649Douglas Gregor      ns = "<anonymous>";
260806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << '"' << UD->getDeclKindName() << ns << ";\"";
2610ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl  } else if (UsingDecl *UD = dyn_cast<UsingDecl>(D)) {
2620ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl    // print using decl (e.g. "using std::string;")
2630ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl    const char *tn = UD->isTypeName() ? "typename " : "";
2640ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl    OS << '"' << UD->getDeclKindName() << tn;
265dc355713be51fcb4ee52d9fd6b4548ceff47fadfDouglas Gregor    UD->getQualifier()->print(OS,
2664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie                        PrintingPolicy(UD->getASTContext().getLangOpts()));
2670ca43595e9e8dcf62a2ab6f5c7f4666bfb230b6aSebastian Redl    OS << ";\"";
2684ae493cccbfbf122ec6ebac0e330232c22fa8489Chris Lattner  } else if (LabelDecl *LD = dyn_cast<LabelDecl>(D)) {
269a59d20b135bfde058a5a69045bab5ec4e2553f74Benjamin Kramer    OS << "label " << *LD;
27028ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne  } else if (StaticAssertDecl *SAD = dyn_cast<StaticAssertDecl>(D)) {
271cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    OS << "\"static_assert(";
272d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpStmt(SAD->getAssertExpr());
273cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    OS << ",";
274d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpStmt(SAD->getMessage());
27528ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourne    OS << ");\"";
2766000dace22f110d8768476989313e9d981d690d0Chris Lattner  } else {
277b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Unexpected decl");
2786000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
2796000dace22f110d8768476989313e9d981d690d0Chris Lattner}
2806000dace22f110d8768476989313e9d981d690d0Chris Lattner
281d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===//
282d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//  Stmt printing methods.
283d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko//===----------------------------------------------------------------------===//
284d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
285d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienkovoid StmtDumper::dumpStmt(Stmt *S) {
286d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  IndentScope Indent(*this);
287d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
288d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  if (!S) {
289d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    OS << "<<<NULL>>>";
290d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    return;
291d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  }
292d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
293d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  if (DeclStmt *DS = dyn_cast<DeclStmt>(S)) {
294d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    VisitDeclStmt(DS);
295d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    return;
296d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  }
297d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
298d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  Visit(S);
299d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  for (Stmt::child_range CI = S->children(); CI; ++CI)
300d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpStmt(*CI);
301d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko}
302d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
303d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienkovoid StmtDumper::VisitStmt(Stmt *Node) {
304d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  OS << Node->getStmtClassName() << " " << (const void *)Node;
305d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  DumpSourceRange(Node);
306d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko}
307d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko
3085399ce26f27e6d093417a3882e38da8738a78fefTed Kremenekvoid StmtDumper::VisitDeclStmt(DeclStmt *Node) {
309d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
31004a72b77da736734c925d673834888a081f5ebc5Ted Kremenek  for (DeclStmt::decl_iterator DI = Node->decl_begin(), DE = Node->decl_end();
31104a72b77da736734c925d673834888a081f5ebc5Ted Kremenek       DI != DE; ++DI) {
312cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    IndentScope Indent(*this);
3134afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor    Decl* D = *DI;
314806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << (void*) D << " ";
315d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpDecl(D);
3165399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek  }
3175399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek}
3185399ce26f27e6d093417a3882e38da8738a78fefTed Kremenek
3196000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitLabelStmt(LabelStmt *Node) {
320d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
321806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << Node->getName() << "'";
3226000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3236000dace22f110d8768476989313e9d981d690d0Chris Lattner
3246000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitGotoStmt(GotoStmt *Node) {
325d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
326806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << Node->getLabel()->getName()
327806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "':" << (void*)Node->getLabel();
3286000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3296000dace22f110d8768476989313e9d981d690d0Chris Lattner
3306000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
3316000dace22f110d8768476989313e9d981d690d0Chris Lattner//  Expr printing methods.
3326000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
3336000dace22f110d8768476989313e9d981d690d0Chris Lattner
3346000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitExpr(Expr *Node) {
335d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
336d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  OS << ' ';
337d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  DumpType(Node->getType());
338d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  DumpValueKind(Node->getValueKind());
339d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  DumpObjectKind(Node->getObjectKind());
3406000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3416000dace22f110d8768476989313e9d981d690d0Chris Lattner
3425f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic void DumpBasePath(raw_ostream &OS, CastExpr *Node) {
343f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  if (Node->path_empty())
3445cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    return;
3455cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
3465cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << " (";
3475cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  bool First = true;
348f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall  for (CastExpr::path_iterator
349f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall         I = Node->path_begin(), E = Node->path_end(); I != E; ++I) {
3505cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    const CXXBaseSpecifier *Base = *I;
3515cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    if (!First)
3525cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson      OS << " -> ";
3535cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
3545cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    const CXXRecordDecl *RD =
3555cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
3565cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
3575cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    if (Base->isVirtual())
3585cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson      OS << "virtual ";
3595cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    OS << RD->getName();
3605cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson    First = false;
3615cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  }
3625cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
3635cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ')';
3645cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson}
3655cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson
36627a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlssonvoid StmtDumper::VisitCastExpr(CastExpr *Node) {
367d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
3685cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << " <" << Node->getCastKindName();
3695cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  DumpBasePath(OS, Node);
3705cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ">";
37127a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson}
37227a5b9b9babd1e4f8a19c5c9c0736c4b311c79b2Anders Carlsson
3736000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitDeclRefExpr(DeclRefExpr *Node) {
374d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
375eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek
376806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
3776b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  DumpDeclRef(Node->getDecl());
3783aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  if (Node->getDecl() != Node->getFoundDecl()) {
3793aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    OS << " (";
3803aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    DumpDeclRef(Node->getFoundDecl());
3813aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth    OS << ")";
3823aa8140bde5b9bedf13e46ec0a668daa54814196Chandler Carruth  }
3836b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall}
3846b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
3856b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallvoid StmtDumper::DumpDeclRef(Decl *d) {
3866b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  OS << d->getDeclKindName() << ' ' << (void*) d;
3876b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
3886b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  if (NamedDecl *nd = dyn_cast<NamedDecl>(d)) {
3896b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    OS << " '";
3906b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    nd->getDeclName().printName(OS);
3916b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    OS << "'";
392eb641f9995e761004a0b1ac0c9e917a424a66032Ted Kremenek  }
3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3946b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  if (ValueDecl *vd = dyn_cast<ValueDecl>(d)) {
3956b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    OS << ' '; DumpType(vd->getType());
3966b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  }
3976000dace22f110d8768476989313e9d981d690d0Chris Lattner}
3986000dace22f110d8768476989313e9d981d690d0Chris Lattner
3999d5f35e1124bbaa4a8944f7409478d45cb839de5John McCallvoid StmtDumper::VisitUnresolvedLookupExpr(UnresolvedLookupExpr *Node) {
400d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
4019d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  OS << " (";
4029d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  if (!Node->requiresADL()) OS << "no ";
403900fc6388e803868a34b9483510c345e9b49d7ebBenjamin Kramer  OS << "ADL) = '" << Node->getName() << '\'';
4049d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall
4059d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  UnresolvedLookupExpr::decls_iterator
4069d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall    I = Node->decls_begin(), E = Node->decls_end();
4079d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  if (I == E) OS << " empty";
4089d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall  for (; I != E; ++I)
4099d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall    OS << " " << (void*) *I;
4109d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall}
4119d5f35e1124bbaa4a8944f7409478d45cb839de5John McCall
4123c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroffvoid StmtDumper::VisitObjCIvarRefExpr(ObjCIvarRefExpr *Node) {
413d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
4143c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
415806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getDecl()->getDeclKindName()
416b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer     << "Decl='" << *Node->getDecl()
417806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "' " << (void*)Node->getDecl();
418218543b10e81ea2269ef6ae34d2d8ddbdec54dbeSteve Naroff  if (Node->isFreeIvar())
419806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << " isFreeIvar";
4203c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff}
4213c64d9eaa092ac65c39e381f4a49689cf994d666Steve Naroff
422d9f6910f4ef37c0e8eeee2a01287d9572c3176efChris Lattnervoid StmtDumper::VisitPredefinedExpr(PredefinedExpr *Node) {
423d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
4246000dace22f110d8768476989313e9d981d690d0Chris Lattner  switch (Node->getIdentType()) {
425b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("unknown case");
426806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  case PredefinedExpr::Func:           OS <<  " __func__"; break;
427806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  case PredefinedExpr::Function:       OS <<  " __FUNCTION__"; break;
42828ad063b279378b19cb0704f977429df366a151eNico Weber  case PredefinedExpr::LFunction:       OS <<  " L__FUNCTION__"; break;
429806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  case PredefinedExpr::PrettyFunction: OS <<  " __PRETTY_FUNCTION__";break;
4306000dace22f110d8768476989313e9d981d690d0Chris Lattner  }
4316000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4326000dace22f110d8768476989313e9d981d690d0Chris Lattner
4336000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCharacterLiteral(CharacterLiteral *Node) {
434d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
43549cf8847ef4d9caebdd162d2a5d7d055333d8b5cRichard Trieu  OS << " " << Node->getValue();
4366000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4376000dace22f110d8768476989313e9d981d690d0Chris Lattner
4386000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitIntegerLiteral(IntegerLiteral *Node) {
439d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
4406000dace22f110d8768476989313e9d981d690d0Chris Lattner
4416000dace22f110d8768476989313e9d981d690d0Chris Lattner  bool isSigned = Node->getType()->isSignedIntegerType();
442806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getValue().toString(10, isSigned);
4436000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4446000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitFloatingLiteral(FloatingLiteral *Node) {
445d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
446806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getValueAsApproximateDouble();
4476000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4485d66145eed1c319df5a69977cb8ff74f597ea544Chris Lattner
4496000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitStringLiteral(StringLiteral *Str) {
450d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Str);
451806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
4528ab09da1faaa33b9fa78de59cc4e191bfe9907b5Richard Trieu  Str->outputString(OS);
4536000dace22f110d8768476989313e9d981d690d0Chris Lattner}
45417a1a72e70dcbd6257dde644c790a3013113174fChris Lattner
4556000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitUnaryOperator(UnaryOperator *Node) {
456d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
457806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << (Node->isPostfix() ? "postfix" : "prefix")
458806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << " '" << UnaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
4596000dace22f110d8768476989313e9d981d690d0Chris Lattner}
460f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbournevoid StmtDumper::VisitUnaryExprOrTypeTraitExpr(UnaryExprOrTypeTraitExpr *Node) {
461d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
462f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  switch(Node->getKind()) {
463f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_SizeOf:
464f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    OS << " sizeof ";
465f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
466f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_AlignOf:
467f70a88612a4bc2de2872a518267b9b4891ab6431Jordan Rose    OS << " alignof ";
468f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
469f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  case UETT_VecStep:
470f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    OS << " vec_step ";
471f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne    break;
472f4e3cfbe8abd124be6341ef5d714819b4fbd9082Peter Collingbourne  }
4730518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl  if (Node->isArgumentType())
4740518999d3adcc289997bd974dce90cc97f5c1c44Sebastian Redl    DumpType(Node->getArgumentType());
4756000dace22f110d8768476989313e9d981d690d0Chris Lattner}
47613cb21f55d80052d99ef8d54d44939b8e98f8de5Chris Lattner
4776000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitMemberExpr(MemberExpr *Node) {
478d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
479806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << (Node->isArrow() ? "->" : ".")
480b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer     << *Node->getMemberDecl() << ' '
481806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << (void*)Node->getMemberDecl();
4826000dace22f110d8768476989313e9d981d690d0Chris Lattner}
483213541a68a3e137d11d2cefb612c6cdb410d7e8eNate Begemanvoid StmtDumper::VisitExtVectorElementExpr(ExtVectorElementExpr *Node) {
484d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
485806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getAccessor().getNameStart();
4866000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4876000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitBinaryOperator(BinaryOperator *Node) {
488d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
489806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode()) << "'";
490eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattner}
491eb14fe839ec24c2ca14e5f094be147a34e3d3339Chris Lattnervoid StmtDumper::VisitCompoundAssignOperator(CompoundAssignOperator *Node) {
492d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
493806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " '" << BinaryOperator::getOpcodeStr(Node->getOpcode())
494806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "' ComputeLHSTy=";
495ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  DumpType(Node->getComputationLHSType());
496806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ComputeResultTy=";
497ab3a852ae713189444dcbf75e70accf1e8c2b7f2Eli Friedman  DumpType(Node->getComputationResultType());
4986000dace22f110d8768476989313e9d981d690d0Chris Lattner}
4996000dace22f110d8768476989313e9d981d690d0Chris Lattner
5006b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCallvoid StmtDumper::VisitBlockExpr(BlockExpr *Node) {
501d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
5026b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
5036b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  BlockDecl *block = Node->getBlockDecl();
50489da8cf16b671845660711d3dd4174a809ca6ccaJohn McCall  OS << " decl=" << block;
50589da8cf16b671845660711d3dd4174a809ca6ccaJohn McCall
5066b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  if (block->capturesCXXThis()) {
507cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    IndentScope Indent(*this);
508cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    OS << "capture this";
5096b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  }
5106b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  for (BlockDecl::capture_iterator
5116b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall         i = block->capture_begin(), e = block->capture_end(); i != e; ++i) {
512cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    IndentScope Indent(*this);
513cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    OS << "capture ";
5146b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    if (i->isByRef()) OS << "byref ";
5156b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall    if (i->isNested()) OS << "nested ";
516ac1303eca6cbe3e623fb5ec6fe7ec184ef4b0dfaDouglas Gregor    if (i->getVariable())
517ac1303eca6cbe3e623fb5ec6fe7ec184ef4b0dfaDouglas Gregor      DumpDeclRef(i->getVariable());
518d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    if (i->hasCopyExpr())
519d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko      dumpStmt(i->getCopyExpr());
5206b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall  }
5216b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
522d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  dumpStmt(block->getBody());
5236b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall}
5246b5a61b6dc400027fd793dcadceeb9da944a37eaJohn McCall
5254b9c2d235fb9449e249d74f48ecfec601650de93John McCallvoid StmtDumper::VisitOpaqueValueExpr(OpaqueValueExpr *Node) {
526d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
5274b9c2d235fb9449e249d74f48ecfec601650de93John McCall
528cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek  if (Expr *Source = Node->getSourceExpr())
529d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpStmt(Source);
5304b9c2d235fb9449e249d74f48ecfec601650de93John McCall}
5314b9c2d235fb9449e249d74f48ecfec601650de93John McCall
5326000dace22f110d8768476989313e9d981d690d0Chris Lattner// GNU extensions.
5336000dace22f110d8768476989313e9d981d690d0Chris Lattner
5346000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitAddrLabelExpr(AddrLabelExpr *Node) {
535d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
536806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getLabel()->getName()
537806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << " " << (void*)Node->getLabel();
5386000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5396000dace22f110d8768476989313e9d981d690d0Chris Lattner
540f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
541f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner// C++ Expressions
542f9e0581818f5daf7d6f467a72aeba266c086d61dChris Lattner//===----------------------------------------------------------------------===//
5436000dace22f110d8768476989313e9d981d690d0Chris Lattner
54449badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXNamedCastExpr(CXXNamedCastExpr *Node) {
545d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
546806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getCastName()
547806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar     << "<" << Node->getTypeAsWritten().getAsString() << ">"
5485cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson     << " <" << Node->getCastKindName();
5495cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  DumpBasePath(OS, Node);
5505cf86ba6b5a724bf91cb52feade1158f1fbeb605Anders Carlsson  OS << ">";
5516000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5526000dace22f110d8768476989313e9d981d690d0Chris Lattner
5536000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid StmtDumper::VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *Node) {
554d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
555806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << (Node->getValue() ? "true" : "false");
5566000dace22f110d8768476989313e9d981d690d0Chris Lattner}
5576000dace22f110d8768476989313e9d981d690d0Chris Lattner
558cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregorvoid StmtDumper::VisitCXXThisExpr(CXXThisExpr *Node) {
559d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
560806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " this";
561cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
562cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
56349badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregorvoid StmtDumper::VisitCXXFunctionalCastExpr(CXXFunctionalCastExpr *Node) {
564d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
565cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman  OS << " functional cast to " << Node->getTypeAsWritten().getAsString()
566cc2fca2ba2716293204901b8d2393428b965f12aEli Friedman     << " <" << Node->getCastKindName() << ">";
56749badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor}
56849badde06e066d058d6c7fcf4e628a72999b65a9Douglas Gregor
5690eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXConstructExpr(CXXConstructExpr *Node) {
570d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
571d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall  CXXConstructorDecl *Ctor = Node->getConstructor();
572d4bbdfebe9bd13defa977a934bf73fc2ce3b2817John McCall  DumpType(Ctor->getType());
5730eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson  if (Node->isElidable())
574806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar    OS << " elidable";
575f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall  if (Node->requiresZeroInitialization())
576f8cf0b028c7a5b632c3a711813cd44a9d9642537John McCall    OS << " zeroing";
5770eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
5780eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
5790eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::VisitCXXBindTemporaryExpr(CXXBindTemporaryExpr *Node) {
580d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
581806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
5820eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson  DumpCXXTemporary(Node->getTemporary());
5830eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
5840eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
5854765fa05b5652fcc4356371c2f481d0ea9a1b007John McCallvoid StmtDumper::VisitExprWithCleanups(ExprWithCleanups *Node) {
586d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
58780ee6e878a169e6255d4686a91bb696151ff229fJohn McCall  for (unsigned i = 0, e = Node->getNumObjects(); i != e; ++i) {
588cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    IndentScope Indent(*this);
589cb7b45e6d80c14d7d12db1eff17dc14b4ae8a35eManuel Klimek    OS << "cleanup ";
59080ee6e878a169e6255d4686a91bb696151ff229fJohn McCall    DumpDeclRef(Node->getObject(i));
5910eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson  }
5920eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
5930eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
5940eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlssonvoid StmtDumper::DumpCXXTemporary(CXXTemporary *Temporary) {
595806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << "(CXXTemporary " << (void *)Temporary << ")";
5960eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson}
5970eca1b609a2a272b6af1a3ead48186c8a15ae9b4Anders Carlsson
5985508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
5995508518a2702b00be3b15a26d772bde968972f54Anders Carlsson// Obj-C Expressions
6005508518a2702b00be3b15a26d772bde968972f54Anders Carlsson//===----------------------------------------------------------------------===//
6015508518a2702b00be3b15a26d772bde968972f54Anders Carlsson
602b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenekvoid StmtDumper::VisitObjCMessageExpr(ObjCMessageExpr* Node) {
603d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
604806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " selector=" << Node->getSelector().getAsString();
60504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  switch (Node->getReceiverKind()) {
60604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Instance:
60704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
60804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
60904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::Class:
61004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " class=";
61104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    DumpType(Node->getClassReceiver());
61204badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
61304badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
61404badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperInstance:
61504badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " super (instance)";
61604badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
61704badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor
61804badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  case ObjCMessageExpr::SuperClass:
61904badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    OS << " super (class)";
62004badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor    break;
62104badcf84c8d504d8491c7c7e29b58f52cb16640Douglas Gregor  }
622b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek}
623b3d914b91429477f4bf0436408b1656bd099b32aTed Kremenek
62436faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidisvoid StmtDumper::VisitObjCBoxedExpr(ObjCBoxedExpr* Node) {
625d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
62636faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis  OS << " selector=" << Node->getBoxingMethod()->getSelector().getAsString();
62736faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis}
62836faaddccf519231a3facd26495e895ba5a28776Argyrios Kyrtzidis
6298f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregorvoid StmtDumper::VisitObjCAtCatchStmt(ObjCAtCatchStmt *Node) {
630d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitStmt(Node);
631c00d8e18ad3d903acfeb5d05163ce90713066a3fDouglas Gregor  if (VarDecl *CatchParam = Node->getCatchParamDecl()) {
6328f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OS << " catch parm = ";
633d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko    dumpDecl(CatchParam);
6348f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  } else {
6358f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor    OS << " catch all";
6368f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor  }
6378f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor}
6388f5e3dd32e443768d9dbbad7191e123e6733750cDouglas Gregor
639f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlssonvoid StmtDumper::VisitObjCEncodeExpr(ObjCEncodeExpr *Node) {
640d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
641806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " ";
642f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson  DumpType(Node->getEncodedType());
643f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson}
644f9bcf01f82dfd2688f81e57bcc6300c9b13c51a6Anders Carlsson
645b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanianvoid StmtDumper::VisitObjCSelectorExpr(ObjCSelectorExpr *Node) {
646d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
6471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
648806c12e64ccbf7a259aa49dfe929724b4853baaeDaniel Dunbar  OS << " " << Node->getSelector().getAsString();
649b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian}
650b62f6813406a03bf8a371c4e46c9fad51d102121Fariborz Jahanian
651390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanianvoid StmtDumper::VisitObjCProtocolExpr(ObjCProtocolExpr *Node) {
652d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
6531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
654b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer  OS << ' ' <<* Node->getProtocol();
655390d50a725497e99247dc104a7d2c2a255d3af14Fariborz Jahanian}
6567f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbar
6577f8ea5c5b3a6a4332a841eefdd86b0726722ea7bDaniel Dunbarvoid StmtDumper::VisitObjCPropertyRefExpr(ObjCPropertyRefExpr *Node) {
658d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
65912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  if (Node->isImplicitProperty()) {
66099130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    OS << " Kind=MethodRef Getter=\"";
66199130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    if (Node->getImplicitPropertyGetter())
66299130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian      OS << Node->getImplicitPropertyGetter()->getSelector().getAsString();
66399130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    else
66499130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian      OS << "(null)";
66599130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian
66699130e5a02e93282cb393d2cba0d3dffc10abc01Fariborz Jahanian    OS << "\" Setter=\"";
66712f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    if (ObjCMethodDecl *Setter = Node->getImplicitPropertySetter())
66812f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      OS << Setter->getSelector().getAsString();
66912f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    else
67012f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall      OS << "(null)";
67112f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall    OS << "\"";
67212f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  } else {
673b8989f27f116ff2400e92a52c067a69846119eb5Benjamin Kramer    OS << " Kind=PropertyRef Property=\"" << *Node->getExplicitProperty() <<'"';
67412f78a6741a4cb3d904340f8d3d2714568b50e7aJohn McCall  }
6751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6768ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian  if (Node->isSuperReceiver())
6778ac2d449820fd0df00fcbde5bf82165c1f49854dFariborz Jahanian    OS << " super";
678b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis
679b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  OS << " Messaging=";
680b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  if (Node->isMessagingGetter() && Node->isMessagingSetter())
681b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Getter&Setter";
682b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  else if (Node->isMessagingGetter())
683b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Getter";
684b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis  else if (Node->isMessagingSetter())
685b085d898bdfe35097eba45f4072b0f6865f561dcArgyrios Kyrtzidis    OS << "Setter";
686cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor}
687cd9b46e5442a3ef17f83f75177d8545cb5b3e2b9Douglas Gregor
688ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtDumper::VisitObjCSubscriptRefExpr(ObjCSubscriptRefExpr *Node) {
689d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
690ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->isArraySubscriptRefExpr())
691ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " Kind=ArraySubscript GetterForArray=\"";
692ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
693ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << " Kind=DictionarySubscript GetterForDictionary=\"";
694ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->getAtIndexMethodDecl())
695ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << Node->getAtIndexMethodDecl()->getSelector().getAsString();
696ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
697ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "(null)";
698ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
699ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->isArraySubscriptRefExpr())
700ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "\" SetterForArray=\"";
701ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
702ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "\" SetterForDictionary=\"";
703ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  if (Node->setAtIndexMethodDecl())
704ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << Node->setAtIndexMethodDecl()->getSelector().getAsString();
705ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  else
706ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    OS << "(null)";
707ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
708ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
709ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenekvoid StmtDumper::VisitObjCBoolLiteralExpr(ObjCBoolLiteralExpr *Node) {
710d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  VisitExpr(Node);
711ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  OS << " " << (Node->getValue() ? "__objc_yes" : "__objc_no");
712ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek}
713ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
7146000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
7156000dace22f110d8768476989313e9d981d690d0Chris Lattner// Stmt method implementations
7166000dace22f110d8768476989313e9d981d690d0Chris Lattner//===----------------------------------------------------------------------===//
7176000dace22f110d8768476989313e9d981d690d0Chris Lattner
718e300c870f08d08badf2ebcb53ded49f304af37fcChris Lattnervoid Stmt::dump(SourceManager &SM) const {
7199668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis  dump(llvm::errs(), SM);
7209668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis}
7219668033ee4c25efd019e6c7e6dd96aa2e6364a46Argyrios Kyrtzidis
7225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid Stmt::dump(raw_ostream &OS, SourceManager &SM) const {
72395f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko  StmtDumper P(&SM, OS);
724d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  P.dumpStmt(const_cast<Stmt*>(this));
7250c727a35718556866a978f64ac549d9798735f08Chris Lattner}
7260c727a35718556866a978f64ac549d9798735f08Chris Lattner
7276000dace22f110d8768476989313e9d981d690d0Chris Lattnervoid Stmt::dump() const {
72895f6190acb664b345b1395abaea84ee451740c5bDmitri Gribenko  StmtDumper P(0, llvm::errs());
729d5bc359971fe9e3d78a44e9b25a909f01f3018ecAlexander Kornienko  P.dumpStmt(const_cast<Stmt*>(this));
7306000dace22f110d8768476989313e9d981d690d0Chris Lattner}
731