diff options
Diffstat (limited to 'clang/lib/AST')
| -rw-r--r-- | clang/lib/AST/DeclPrinter.cpp | 21 | ||||
| -rw-r--r-- | clang/lib/AST/StmtPrinter.cpp | 41 | 
2 files changed, 44 insertions, 18 deletions
| diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 6eeba88e403..00db026ebb4 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -28,6 +28,7 @@ namespace {    class DeclPrinter : public DeclVisitor<DeclPrinter> {      raw_ostream &Out;      PrintingPolicy Policy; +    const ASTContext &Context;      unsigned Indentation;      bool PrintInstantiation; @@ -48,9 +49,10 @@ namespace {    public:      DeclPrinter(raw_ostream &Out, const PrintingPolicy &Policy, -                unsigned Indentation = 0, bool PrintInstantiation = false) -      : Out(Out), Policy(Policy), Indentation(Indentation), -        PrintInstantiation(PrintInstantiation) { } +                const ASTContext &Context, unsigned Indentation = 0, +                bool PrintInstantiation = false) +        : Out(Out), Policy(Policy), Context(Context), Indentation(Indentation), +          PrintInstantiation(PrintInstantiation) {}      void VisitDeclContext(DeclContext *DC, bool Indent = true); @@ -115,7 +117,8 @@ void Decl::print(raw_ostream &Out, unsigned Indentation,  void Decl::print(raw_ostream &Out, const PrintingPolicy &Policy,                   unsigned Indentation, bool PrintInstantiation) const { -  DeclPrinter Printer(Out, Policy, Indentation, PrintInstantiation); +  DeclPrinter Printer(Out, Policy, getASTContext(), Indentation, +                      PrintInstantiation);    Printer.Visit(const_cast<Decl*>(this));  } @@ -192,7 +195,7 @@ LLVM_DUMP_METHOD void DeclContext::dumpDeclContext() const {      DC = DC->getParent();    ASTContext &Ctx = cast<TranslationUnitDecl>(DC)->getASTContext(); -  DeclPrinter Printer(llvm::errs(), Ctx.getPrintingPolicy(), 0); +  DeclPrinter Printer(llvm::errs(), Ctx.getPrintingPolicy(), Ctx, 0);    Printer.VisitDeclContext(const_cast<DeclContext *>(this), /*Indent=*/false);  } @@ -467,7 +470,7 @@ void DeclPrinter::VisitEnumConstantDecl(EnumConstantDecl *D) {    prettyPrintAttributes(D);    if (Expr *Init = D->getInitExpr()) {      Out << " = "; -    Init->printPretty(Out, nullptr, Policy, Indentation); +    Init->printPretty(Out, nullptr, Policy, Indentation, &Context);    }  } @@ -521,7 +524,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {      Proto = GuideDecl->getDeducedTemplate()->getDeclName().getAsString();    if (const TemplateArgumentList *TArgs = D->getTemplateSpecializationArgs()) {      llvm::raw_string_ostream POut(Proto); -    DeclPrinter TArgPrinter(POut, SubPolicy, Indentation); +    DeclPrinter TArgPrinter(POut, SubPolicy, Context, Indentation);      TArgPrinter.printTemplateArguments(*TArgs);    } @@ -539,7 +542,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {      Proto += "(";      if (FT) {        llvm::raw_string_ostream POut(Proto); -      DeclPrinter ParamPrinter(POut, SubPolicy, Indentation); +      DeclPrinter ParamPrinter(POut, SubPolicy, Context, Indentation);        for (unsigned i = 0, e = D->getNumParams(); i != e; ++i) {          if (i) POut << ", ";          ParamPrinter.VisitParmVarDecl(D->getParamDecl(i)); @@ -695,7 +698,7 @@ void DeclPrinter::VisitFunctionDecl(FunctionDecl *D) {          // This is a K&R function definition, so we need to print the          // parameters.          Out << '\n'; -        DeclPrinter ParamPrinter(Out, SubPolicy, Indentation); +        DeclPrinter ParamPrinter(Out, SubPolicy, Context, Indentation);          Indentation += Policy.Indentation;          for (unsigned i = 0, e = D->getNumParams(); i != e; ++i) {            Indent(); diff --git a/clang/lib/AST/StmtPrinter.cpp b/clang/lib/AST/StmtPrinter.cpp index e3b96284bd1..950d0e29979 100644 --- a/clang/lib/AST/StmtPrinter.cpp +++ b/clang/lib/AST/StmtPrinter.cpp @@ -24,6 +24,7 @@  #include "clang/AST/PrettyPrinter.h"  #include "clang/AST/StmtVisitor.h"  #include "clang/Basic/CharInfo.h" +#include "clang/Lex/Lexer.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/Support/Format.h"  using namespace clang; @@ -38,12 +39,14 @@ namespace  {      unsigned IndentLevel;      clang::PrinterHelper* Helper;      PrintingPolicy Policy; +    const ASTContext *Context;    public: -    StmtPrinter(raw_ostream &os, PrinterHelper* helper, -                const PrintingPolicy &Policy, -                unsigned Indentation = 0) -      : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy) {} +    StmtPrinter(raw_ostream &os, PrinterHelper *helper, +                const PrintingPolicy &Policy, unsigned Indentation = 0, +                const ASTContext *Context = nullptr) +        : OS(os), IndentLevel(Indentation), Helper(helper), Policy(Policy), +          Context(Context) {}      void PrintStmt(Stmt *S) {        PrintStmt(S, Policy.Indentation); @@ -1441,7 +1444,26 @@ void StmtPrinter::VisitCharacterLiteral(CharacterLiteral *Node) {    }  } +/// Prints the given expression using the original source text. Returns true on +/// success, false otherwise. +static bool printExprAsWritten(raw_ostream &OS, Expr *E, +                               const ASTContext *Context) { +  if (!Context) +    return false; +  bool Invalid = false; +  StringRef Source = Lexer::getSourceText( +      CharSourceRange::getTokenRange(E->getSourceRange()), +      Context->getSourceManager(), Context->getLangOpts(), &Invalid); +  if (!Invalid) { +    OS << Source; +    return true; +  } +  return false; +} +  void StmtPrinter::VisitIntegerLiteral(IntegerLiteral *Node) { +  if (Policy.ConstantsAsWritten && printExprAsWritten(OS, Node, Context)) +    return;    bool isSigned = Node->getType()->isSignedIntegerType();    OS << Node->getValue().toString(10, isSigned); @@ -1485,6 +1507,8 @@ static void PrintFloatingLiteral(raw_ostream &OS, FloatingLiteral *Node,  }  void StmtPrinter::VisitFloatingLiteral(FloatingLiteral *Node) { +  if (Policy.ConstantsAsWritten && printExprAsWritten(OS, Node, Context)) +    return;    PrintFloatingLiteral(OS, Node, /*PrintSuffix=*/true);  } @@ -2696,11 +2720,10 @@ void Stmt::dumpPretty(const ASTContext &Context) const {    printPretty(llvm::errs(), nullptr, PrintingPolicy(Context.getLangOpts()));  } -void Stmt::printPretty(raw_ostream &OS, -                       PrinterHelper *Helper, -                       const PrintingPolicy &Policy, -                       unsigned Indentation) const { -  StmtPrinter P(OS, Helper, Policy, Indentation); +void Stmt::printPretty(raw_ostream &OS, PrinterHelper *Helper, +                       const PrintingPolicy &Policy, unsigned Indentation, +                       const ASTContext *Context) const { +  StmtPrinter P(OS, Helper, Policy, Indentation, Context);    P.Visit(const_cast<Stmt*>(this));  } | 

