From 2e9c64acdd7c73ed179a6b13fc38fc74f10deebb Mon Sep 17 00:00:00 2001 From: Sterling Augustine Date: Fri, 4 May 2018 20:12:39 +0000 Subject: [PATCH] Allow modifying the PrintingPolicy for fully qualified names. Author: mikhail.ramalho@gmail.com git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@331552 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/QualTypeNames.h | 1 + lib/AST/QualTypeNames.cpp | 6 +---- unittests/Tooling/QualTypeNamesTest.cpp | 30 ++++++++++++++++++++++--- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/include/clang/AST/QualTypeNames.h b/include/clang/AST/QualTypeNames.h index 86d805feee..e2bf7dfdef 100644 --- a/include/clang/AST/QualTypeNames.h +++ b/include/clang/AST/QualTypeNames.h @@ -72,6 +72,7 @@ namespace TypeName { /// \param[in] WithGlobalNsPrefix - If true, then the global namespace /// specifier "::" will be prepended to the fully qualified name. std::string getFullyQualifiedName(QualType QT, const ASTContext &Ctx, + const PrintingPolicy &Policy, bool WithGlobalNsPrefix = false); /// \brief Generates a QualType that can be used to name the same type diff --git a/lib/AST/QualTypeNames.cpp b/lib/AST/QualTypeNames.cpp index 86c0eff9f7..9b773231d2 100644 --- a/lib/AST/QualTypeNames.cpp +++ b/lib/AST/QualTypeNames.cpp @@ -452,12 +452,8 @@ QualType getFullyQualifiedType(QualType QT, const ASTContext &Ctx, std::string getFullyQualifiedName(QualType QT, const ASTContext &Ctx, + const PrintingPolicy &Policy, bool WithGlobalNsPrefix) { - PrintingPolicy Policy(Ctx.getPrintingPolicy()); - Policy.SuppressScope = false; - Policy.AnonymousTagLocations = false; - Policy.PolishForDeclaration = true; - Policy.SuppressUnwrittenScope = true; QualType FQQT = getFullyQualifiedType(QT, Ctx, WithGlobalNsPrefix); return FQQT.getAsString(Policy); } diff --git a/unittests/Tooling/QualTypeNamesTest.cpp b/unittests/Tooling/QualTypeNamesTest.cpp index dd48f3bf45..b4c56f7bd5 100644 --- a/unittests/Tooling/QualTypeNamesTest.cpp +++ b/unittests/Tooling/QualTypeNamesTest.cpp @@ -26,9 +26,13 @@ struct TypeNameVisitor : TestVisitor { std::string ExpectedName = ExpectedQualTypeNames.lookup(VD->getNameAsString()); if (ExpectedName != "") { - std::string ActualName = - TypeName::getFullyQualifiedName(VD->getType(), *Context, - WithGlobalNsPrefix); + PrintingPolicy Policy(Context->getPrintingPolicy()); + Policy.SuppressScope = false; + Policy.AnonymousTagLocations = true; + Policy.PolishForDeclaration = true; + Policy.SuppressUnwrittenScope = true; + std::string ActualName = TypeName::getFullyQualifiedName( + VD->getType(), *Context, Policy, WithGlobalNsPrefix); if (ExpectedName != ActualName) { // A custom message makes it much easier to see what declaration // failed compared to EXPECT_EQ. @@ -217,6 +221,26 @@ TEST(QualTypeNameTest, getFullyQualifiedName) { " }\n" "}\n" ); + + TypeNameVisitor AnonStrucs; + AnonStrucs.ExpectedQualTypeNames["a"] = "short"; + AnonStrucs.ExpectedQualTypeNames["un_in_st_1"] = + "union (anonymous struct at input.cc:1:1)::(anonymous union at " + "input.cc:2:27)"; + AnonStrucs.ExpectedQualTypeNames["b"] = "short"; + AnonStrucs.ExpectedQualTypeNames["un_in_st_2"] = + "union (anonymous struct at input.cc:1:1)::(anonymous union at " + "input.cc:5:27)"; + AnonStrucs.ExpectedQualTypeNames["anon_st"] = + "struct (anonymous struct at input.cc:1:1)"; + AnonStrucs.runOver(R"(struct { + union { + short a; + } un_in_st_1; + union { + short b; + } un_in_st_2; + } anon_st;)"); } } // end anonymous namespace -- 2.40.0