r372863 - [AST] Extract Decl::printNestedNameSpecifier helper from Decl::printQualifiedName
Nico Weber via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 25 07:22:39 PDT 2019
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 at 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 at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190925/d75d26b0/attachment.html>
More information about the cfe-commits
mailing list