r372863 - [AST] Extract Decl::printNestedNameSpecifier helper from Decl::printQualifiedName
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 25 08:50:18 PDT 2019
Reverted and re-landed with a fix to this.
This should've been an NFC, but I missed one corner case. Sorry about that.
On Wed, Sep 25, 2019 at 4:22 PM Nico Weber <thakis at chromium.org> wrote:
> 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
>>
>
--
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190925/60e8c789/attachment.html>
More information about the cfe-commits
mailing list