r361033 - Add a Visit overload for DynTypedNode to ASTNodeTraverser

Stephen Kelly via cfe-commits cfe-commits at lists.llvm.org
Fri May 17 10:57:14 PDT 2019


Hmm, thanks for letting me know!

Is that an old compiler?

I'm not near a computer for the weekend.

Can someone fix or revert?

Thanks,

Stephen.

On Fri 17 May 2019, 17:11 Yitzhak Mandelbaum, <yitzhakm at google.com> wrote:

> Looks like this caused a breakage:
> http://lab.llvm.org:8011/builders/clang-cmake-aarch64-quick/builds/18641/steps/ninja%20check%201/logs/stdio
>
> On Fri, May 17, 2019 at 9:52 AM Stephen Kelly via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> Author: steveire
>> Date: Fri May 17 06:55:28 2019
>> New Revision: 361033
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=361033&view=rev
>> Log:
>> Add a Visit overload for DynTypedNode to ASTNodeTraverser
>>
>> Reviewers: aaron.ballman
>>
>> Subscribers: cfe-commits
>>
>> Tags: #clang
>>
>> Differential Revision: https://reviews.llvm.org/D61834
>>
>> Added:
>>     cfe/trunk/unittests/AST/ASTTraverserTest.cpp
>> Modified:
>>     cfe/trunk/include/clang/AST/ASTNodeTraverser.h
>>     cfe/trunk/unittests/AST/CMakeLists.txt
>>
>> Modified: cfe/trunk/include/clang/AST/ASTNodeTraverser.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTNodeTraverser.h?rev=361033&r1=361032&r2=361033&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/ASTNodeTraverser.h (original)
>> +++ cfe/trunk/include/clang/AST/ASTNodeTraverser.h Fri May 17 06:55:28
>> 2019
>> @@ -205,6 +205,24 @@ public:
>>      });
>>    }
>>
>> +  void Visit(const ast_type_traits::DynTypedNode &N) {
>> +    // FIXME: Improve this with a switch or a visitor pattern.
>> +    if (const auto *D = N.get<Decl>())
>> +      Visit(D);
>> +    else if (const auto *S = N.get<Stmt>())
>> +      Visit(S);
>> +    else if (const auto *QT = N.get<QualType>())
>> +      Visit(*QT);
>> +    else if (const auto *T = N.get<Type>())
>> +      Visit(T);
>> +    else if (const auto *C = N.get<CXXCtorInitializer>())
>> +      Visit(C);
>> +    else if (const auto *C = N.get<OMPClause>())
>> +      Visit(C);
>> +    else if (const auto *T = N.get<TemplateArgument>())
>> +      Visit(*T);
>> +  }
>> +
>>    void dumpDeclContext(const DeclContext *DC) {
>>      if (!DC)
>>        return;
>>
>> Added: cfe/trunk/unittests/AST/ASTTraverserTest.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/ASTTraverserTest.cpp?rev=361033&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/unittests/AST/ASTTraverserTest.cpp (added)
>> +++ cfe/trunk/unittests/AST/ASTTraverserTest.cpp Fri May 17 06:55:28 2019
>> @@ -0,0 +1,220 @@
>> +//===-
>> unittests/AST/ASTTraverserTest.h------------------------------------===//
>> +//
>> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM
>> Exceptions.
>> +// See https://llvm.org/LICENSE.txt for license information.
>> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +#include "clang/AST/ASTContext.h"
>> +#include "clang/AST/ASTNodeTraverser.h"
>> +#include "clang/AST/TextNodeDumper.h"
>> +#include "clang/ASTMatchers/ASTMatchFinder.h"
>> +#include "clang/ASTMatchers/ASTMatchers.h"
>> +#include "clang/Tooling/Tooling.h"
>> +#include "gmock/gmock.h"
>> +#include "gtest/gtest.h"
>> +
>> +using namespace clang::tooling;
>> +using namespace clang::ast_matchers;
>> +
>> +namespace clang {
>> +
>> +class NodeTreePrinter : public TextTreeStructure {
>> +  llvm::raw_ostream &OS;
>> +
>> +public:
>> +  NodeTreePrinter(llvm::raw_ostream &OS)
>> +      : TextTreeStructure(OS, /* showColors */ false), OS(OS) {}
>> +
>> +  void Visit(const Decl *D) { OS << D->getDeclKindName() << "Decl"; }
>> +
>> +  void Visit(const Stmt *S) { OS << S->getStmtClassName(); }
>> +
>> +  void Visit(QualType QT) {
>> +    OS << "QualType " << QT.split().Quals.getAsString();
>> +  }
>> +
>> +  void Visit(const Type *T) { OS << T->getTypeClassName() << "Type"; }
>> +
>> +  void Visit(const comments::Comment *C, const comments::FullComment
>> *FC) {
>> +    OS << C->getCommentKindName();
>> +  }
>> +
>> +  void Visit(const CXXCtorInitializer *Init) { OS <<
>> "CXXCtorInitializer"; }
>> +
>> +  void Visit(const Attr *A) {
>> +    switch (A->getKind()) {
>> +#define ATTR(X)
>>       \
>> +  case attr::X:
>>       \
>> +    OS << #X;
>>       \
>> +    break;
>> +#include "clang/Basic/AttrList.inc"
>> +    }
>> +    OS << "Attr";
>> +  }
>> +
>> +  void Visit(const OMPClause *C) { OS << "OMPClause"; }
>> +  void Visit(const TemplateArgument &A, SourceRange R = {},
>> +             const Decl *From = nullptr, const char *Label = nullptr) {
>> +    OS << "TemplateArgument";
>> +  }
>> +
>> +  template <typename... T> void Visit(T...) {}
>> +};
>> +
>> +class TestASTDumper : public ASTNodeTraverser<TestASTDumper,
>> NodeTreePrinter> {
>> +
>> +  NodeTreePrinter MyNodeRecorder;
>> +
>> +public:
>> +  TestASTDumper(llvm::raw_ostream &OS) : MyNodeRecorder(OS) {}
>> +  NodeTreePrinter &doGetNodeDelegate() { return MyNodeRecorder; }
>> +};
>> +
>> +template <typename... NodeType> std::string dumpASTString(NodeType &&...
>> N) {
>> +  std::string Buffer;
>> +  llvm::raw_string_ostream OS(Buffer);
>> +
>> +  TestASTDumper Dumper(OS);
>> +
>> +  OS << "\n";
>> +
>> +  Dumper.Visit(std::forward<NodeType &&>(N)...);
>> +
>> +  return OS.str();
>> +}
>> +
>> +const FunctionDecl *getFunctionNode(clang::ASTUnit *AST,
>> +                                    const std::string &Name) {
>> +  auto Result =
>> ast_matchers::match(functionDecl(hasName(Name)).bind("fn"),
>> +                                    AST->getASTContext());
>> +  EXPECT_EQ(Result.size(), 1u);
>> +  return Result[0].getNodeAs<FunctionDecl>("fn");
>> +}
>> +
>> +template <typename T> struct Verifier {
>> +  static void withDynNode(T Node, const std::string &DumpString) {
>> +    EXPECT_EQ(dumpASTString(ast_type_traits::DynTypedNode::create(Node)),
>> +              DumpString);
>> +  }
>> +};
>> +
>> +template <typename T> struct Verifier<T *> {
>> +  static void withDynNode(T *Node, const std::string &DumpString) {
>> +
>> EXPECT_EQ(dumpASTString(ast_type_traits::DynTypedNode::create(*Node)),
>> +              DumpString);
>> +  }
>> +};
>> +
>> +template <typename T>
>> +void verifyWithDynNode(T Node, const std::string &DumpString) {
>> +  EXPECT_EQ(dumpASTString(Node), DumpString);
>> +
>> +  Verifier<T>::withDynNode(Node, DumpString);
>> +}
>> +
>> +TEST(Traverse, Dump) {
>> +
>> +  auto AST = buildASTFromCode(R"cpp(
>> +struct A {
>> +  int m_number;
>> +
>> +  /// CTor
>> +  A() : m_number(42) {}
>> +
>> +  [[nodiscard]] const int func() {
>> +    return 42;
>> +  }
>> +
>> +};
>> +
>> +template<typename T>
>> +struct templ
>> +{
>> +};
>> +
>> +template<>
>> +struct templ<int>
>> +{
>> +};
>> +
>> +)cpp");
>> +
>> +  const FunctionDecl *Func = getFunctionNode(AST.get(), "func");
>> +
>> +  verifyWithDynNode(Func,
>> +                    R"cpp(
>> +CXXMethodDecl
>> +|-CompoundStmt
>> +| `-ReturnStmt
>> +|   `-IntegerLiteral
>> +`-WarnUnusedResultAttr
>> +)cpp");
>> +
>> +  Stmt *Body = Func->getBody();
>> +
>> +  verifyWithDynNode(Body,
>> +                    R"cpp(
>> +CompoundStmt
>> +`-ReturnStmt
>> +  `-IntegerLiteral
>> +)cpp");
>> +
>> +  QualType QT = Func->getType();
>> +
>> +  verifyWithDynNode(QT,
>> +                    R"cpp(
>> +FunctionProtoType
>> +`-QualType const
>> +  `-BuiltinType
>> +)cpp");
>> +
>> +  const FunctionDecl *CTorFunc = getFunctionNode(AST.get(), "A");
>> +
>> +  verifyWithDynNode(CTorFunc->getType(),
>> +                    R"cpp(
>> +FunctionProtoType
>> +`-BuiltinType
>> +)cpp");
>> +
>> +  Attr *A = *Func->attr_begin();
>> +
>> +  EXPECT_EQ(dumpASTString(A),
>> +            R"cpp(
>> +WarnUnusedResultAttr
>> +)cpp");
>> +
>> +  auto *CTor = dyn_cast<CXXConstructorDecl>(CTorFunc);
>> +  const CXXCtorInitializer *Init = *CTor->init_begin();
>> +
>> +  verifyWithDynNode(Init,
>> +                    R"cpp(
>> +CXXCtorInitializer
>> +`-IntegerLiteral
>> +)cpp");
>> +
>> +  const comments::FullComment *Comment =
>> +      AST->getASTContext().getLocalCommentForDeclUncached(CTorFunc);
>> +
>> +  EXPECT_EQ(dumpASTString(Comment, Comment),
>> +            R"cpp(
>> +FullComment
>> +`-ParagraphComment
>> +  `-TextComment
>> +)cpp");
>> +
>> +  auto Result = ast_matchers::match(
>> +      classTemplateSpecializationDecl(hasName("templ")).bind("fn"),
>> +      AST->getASTContext());
>> +  EXPECT_EQ(Result.size(), 1u);
>> +  auto Templ =
>> Result[0].getNodeAs<ClassTemplateSpecializationDecl>("fn");
>> +
>> +  TemplateArgument TA = Templ->getTemplateArgs()[0];
>> +
>> +  verifyWithDynNode(TA,
>> +                    R"cpp(
>> +TemplateArgument
>> +)cpp");
>> +}
>> +} // namespace clang
>>
>> Modified: cfe/trunk/unittests/AST/CMakeLists.txt
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/CMakeLists.txt?rev=361033&r1=361032&r2=361033&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/unittests/AST/CMakeLists.txt (original)
>> +++ cfe/trunk/unittests/AST/CMakeLists.txt Fri May 17 06:55:28 2019
>> @@ -12,6 +12,7 @@ add_clang_unittest(ASTTests
>>    ASTImporterTest.cpp
>>    ASTImporterGenericRedeclTest.cpp
>>    ASTImporterVisibilityTest.cpp
>> +  ASTTraverserTest.cpp
>>    ASTTypeTraitsTest.cpp
>>    ASTVectorTest.cpp
>>    CommentLexer.cpp
>>
>>
>> _______________________________________________
>> 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/20190517/efadf81a/attachment.html>


More information about the cfe-commits mailing list