Is it possible that this broke Tooling/clang-diff-ast.cpp http://lab.llvm.org:8011/builders/clang-cmake-x86_64-avx2-linux/builds/11395/steps/ninja%20check%201/logs/FAIL%3A%20Clang%3A%3Aclang-diff-ast.cpp ?
On Wed, Sep 25, 2019 at 9:07 AM Ilya Biryukov via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: ibiryukov > Date: Wed Sep 25 06:09:10 2019 > New Revision: 372863 > > URL: http://llvm.org/viewvc/llvm-project?rev=372863&view=rev > Log: > [AST] Extract Decl::printNestedNameSpecifier helper from > Decl::printQualifiedName > > Summary: > To be used in clangd, e.g. in D66647. > Currently the alternative to this function is doing string manipulation on > results of `printQualifiedName`, which is > hard-to-impossible to get right in presence of template arguments. > > Reviewers: kadircet, aaron.ballman > > Reviewed By: kadircet, aaron.ballman > > Subscribers: aaron.ballman, usaxena95, cfe-commits > > Tags: #clang > > Differential Revision: https://reviews.llvm.org/D67825 > > Modified: > cfe/trunk/include/clang/AST/Decl.h > cfe/trunk/lib/AST/Decl.cpp > cfe/trunk/unittests/AST/NamedDeclPrinterTest.cpp > > Modified: cfe/trunk/include/clang/AST/Decl.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=372863&r1=372862&r2=372863&view=diff > > ============================================================================== > --- cfe/trunk/include/clang/AST/Decl.h (original) > +++ cfe/trunk/include/clang/AST/Decl.h Wed Sep 25 06:09:10 2019 > @@ -310,6 +310,14 @@ public: > void printQualifiedName(raw_ostream &OS) const; > void printQualifiedName(raw_ostream &OS, const PrintingPolicy &Policy) > const; > > + /// Print only the nested name specifier part of a fully-qualified name, > + /// including the '::' at the end. E.g. > + /// when `printQualifiedName(D)` prints "A::B::i", > + /// this function prints "A::B::". > + void printNestedNameSpecifier(raw_ostream &OS) const; > + void printNestedNameSpecifier(raw_ostream &OS, > + const PrintingPolicy &Policy) const; > + > // FIXME: Remove string version. > std::string getQualifiedNameAsString() const; > > > Modified: cfe/trunk/lib/AST/Decl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=372863&r1=372862&r2=372863&view=diff > > ============================================================================== > --- cfe/trunk/lib/AST/Decl.cpp (original) > +++ cfe/trunk/lib/AST/Decl.cpp Wed Sep 25 06:09:10 2019 > @@ -1558,6 +1558,19 @@ void NamedDecl::printQualifiedName(raw_o > > void NamedDecl::printQualifiedName(raw_ostream &OS, > const PrintingPolicy &P) const { > + printNestedNameSpecifier(OS, P); > + if (getDeclName() || isa<DecompositionDecl>(this)) > + OS << *this; > + else > + OS << "(anonymous)"; > +} > + > +void NamedDecl::printNestedNameSpecifier(raw_ostream &OS) const { > + printNestedNameSpecifier(OS, getASTContext().getPrintingPolicy()); > +} > + > +void NamedDecl::printNestedNameSpecifier(raw_ostream &OS, > + const PrintingPolicy &P) const { > const DeclContext *Ctx = getDeclContext(); > > // For ObjC methods and properties, look through categories and use the > @@ -1571,10 +1584,8 @@ void NamedDecl::printQualifiedName(raw_o > Ctx = ID; > } > > - if (Ctx->isFunctionOrMethod()) { > - printName(OS); > + if (Ctx->isFunctionOrMethod()) > return; > - } > > using ContextsTy = SmallVector<const DeclContext *, 8>; > ContextsTy Contexts; > @@ -1644,11 +1655,6 @@ void NamedDecl::printQualifiedName(raw_o > } > OS << "::"; > } > - > - if (getDeclName() || isa<DecompositionDecl>(this)) > - OS << *this; > - else > - OS << "(anonymous)"; > } > > void NamedDecl::getNameForDiagnostic(raw_ostream &OS, > > Modified: cfe/trunk/unittests/AST/NamedDeclPrinterTest.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/NamedDeclPrinterTest.cpp?rev=372863&r1=372862&r2=372863&view=diff > > ============================================================================== > --- cfe/trunk/unittests/AST/NamedDeclPrinterTest.cpp (original) > +++ cfe/trunk/unittests/AST/NamedDeclPrinterTest.cpp Wed Sep 25 06:09:10 > 2019 > @@ -16,9 +16,12 @@ > > > //===----------------------------------------------------------------------===// > > #include "clang/AST/ASTContext.h" > +#include "clang/AST/Decl.h" > +#include "clang/AST/PrettyPrinter.h" > #include "clang/ASTMatchers/ASTMatchFinder.h" > #include "clang/Tooling/Tooling.h" > #include "llvm/ADT/SmallString.h" > +#include "llvm/Support/raw_ostream.h" > #include "gtest/gtest.h" > > using namespace clang; > @@ -30,11 +33,12 @@ namespace { > class PrintMatch : public MatchFinder::MatchCallback { > SmallString<1024> Printed; > unsigned NumFoundDecls; > - bool SuppressUnwrittenScope; > + std::function<void(llvm::raw_ostream &OS, const NamedDecl *)> Printer; > > public: > - explicit PrintMatch(bool suppressUnwrittenScope) > - : NumFoundDecls(0), SuppressUnwrittenScope(suppressUnwrittenScope) {} > + explicit PrintMatch( > + std::function<void(llvm::raw_ostream &OS, const NamedDecl *)> > Printer) > + : NumFoundDecls(0), Printer(std::move(Printer)) {} > > void run(const MatchFinder::MatchResult &Result) override { > const NamedDecl *ND = Result.Nodes.getNodeAs<NamedDecl>("id"); > @@ -45,9 +49,7 @@ public: > return; > > llvm::raw_svector_ostream Out(Printed); > - PrintingPolicy Policy = Result.Context->getPrintingPolicy(); > - Policy.SuppressUnwrittenScope = SuppressUnwrittenScope; > - ND->printQualifiedName(Out, Policy); > + Printer(Out, ND); > } > > StringRef getPrinted() const { > @@ -59,12 +61,12 @@ public: > } > }; > > -::testing::AssertionResult > -PrintedNamedDeclMatches(StringRef Code, const std::vector<std::string> > &Args, > - bool SuppressUnwrittenScope, > - const DeclarationMatcher &NodeMatch, > - StringRef ExpectedPrinted, StringRef FileName) { > - PrintMatch Printer(SuppressUnwrittenScope); > +::testing::AssertionResult PrintedDeclMatches( > + StringRef Code, const std::vector<std::string> &Args, > + const DeclarationMatcher &NodeMatch, StringRef ExpectedPrinted, > + StringRef FileName, > + std::function<void(llvm::raw_ostream &, const NamedDecl *)> Print) { > + PrintMatch Printer(std::move(Print)); > MatchFinder Finder; > Finder.addMatcher(NodeMatch, &Printer); > std::unique_ptr<FrontendActionFactory> Factory = > @@ -92,6 +94,21 @@ PrintedNamedDeclMatches(StringRef Code, > } > > ::testing::AssertionResult > +PrintedNamedDeclMatches(StringRef Code, const std::vector<std::string> > &Args, > + bool SuppressUnwrittenScope, > + const DeclarationMatcher &NodeMatch, > + StringRef ExpectedPrinted, StringRef FileName) { > + return PrintedDeclMatches(Code, Args, NodeMatch, ExpectedPrinted, > FileName, > + [=](llvm::raw_ostream &Out, const NamedDecl > *ND) { > + auto Policy = > + ND->getASTContext().getPrintingPolicy(); > + Policy.SuppressUnwrittenScope = > + SuppressUnwrittenScope; > + ND->printQualifiedName(Out, Policy); > + }); > +} > + > +::testing::AssertionResult > PrintedNamedDeclCXX98Matches(StringRef Code, StringRef DeclName, > StringRef ExpectedPrinted) { > std::vector<std::string> Args(1, "-std=c++98"); > @@ -127,6 +144,17 @@ PrintedWrittenPropertyDeclObjCMatches(St > "input.m"); > } > > +::testing::AssertionResult > +PrintedNestedNameSpecifierMatches(StringRef Code, StringRef DeclName, > + StringRef ExpectedPrinted) { > + std::vector<std::string> Args{"-std=c++11"}; > + return PrintedDeclMatches(Code, Args, > namedDecl(hasName(DeclName)).bind("id"), > + ExpectedPrinted, "input.cc", > + [](llvm::raw_ostream &Out, const NamedDecl > *D) { > + D->printNestedNameSpecifier(Out); > + }); > +} > + > } // unnamed namespace > > TEST(NamedDeclPrinter, TestNamespace1) { > @@ -223,3 +251,21 @@ R"( > "property", > "Obj::property")); > } > + > +TEST(NamedDeclPrinter, NestedNameSpecifierSimple) { > + const char *Code = > + R"( > + namespace foo { namespace bar { void func(); } } > +)"; > + ASSERT_TRUE(PrintedNestedNameSpecifierMatches(Code, "func", > "foo::bar::")); > +} > + > +TEST(NamedDeclPrinter, NestedNameSpecifierTemplateArgs) { > + const char *Code = > + R"( > + template <class T> struct vector; > + template <> struct vector<int> { int method(); }; > +)"; > + ASSERT_TRUE( > + PrintedNestedNameSpecifierMatches(Code, "method", "vector<int>::")); > +} > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits