Index: Tooling/CMakeLists.txt =================================================================== --- Tooling/CMakeLists.txt +++ Tooling/CMakeLists.txt @@ -21,10 +21,25 @@ LexicallyOrderedRecursiveASTVisitorTest.cpp LookupTest.cpp QualTypeNamesTest.cpp - RecursiveASTVisitorTest.cpp - RecursiveASTVisitorTestCallVisitor.cpp + RecursiveASTVisitorTests/Attr.cpp + RecursiveASTVisitorTests/Class.cpp + RecursiveASTVisitorTests/ConstructExpr.cpp + RecursiveASTVisitorTests/CXXBoolLiteralExpr.cpp + RecursiveASTVisitorTests/CXXMemberCall.cpp + RecursiveASTVisitorTests/CXXOperatorCallExprTraverser.cpp + RecursiveASTVisitorTests/DeclRefExpr.cpp + RecursiveASTVisitorTests/ImplicitCtor.cpp + RecursiveASTVisitorTests/InitListExprPostOrder.cpp + RecursiveASTVisitorTests/InitListExprPostOrderNoQueue.cpp + RecursiveASTVisitorTests/InitListExprPreOrder.cpp + RecursiveASTVisitorTests/InitListExprPreOrderNoQueue.cpp + RecursiveASTVisitorTests/IntegerLiteral.cpp + RecursiveASTVisitorTests/LambdaDefaultCapture.cpp + RecursiveASTVisitorTests/LambdaExpr.cpp + RecursiveASTVisitorTests/NestedNameSpecifiers.cpp + RecursiveASTVisitorTests/ParenExpr.cpp + RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp RecursiveASTVisitorTestDeclVisitor.cpp - RecursiveASTVisitorTestExprVisitor.cpp RecursiveASTVisitorTestPostOrderVisitor.cpp RecursiveASTVisitorTestTypeLocVisitor.cpp RefactoringActionRulesTest.cpp Index: unittests/Tooling/RecursiveASTVisitorTest.cpp =================================================================== --- unittests/Tooling/RecursiveASTVisitorTest.cpp +++ /dev/null @@ -1,305 +0,0 @@ -//===- unittest/Tooling/RecursiveASTVisitorTest.cpp -----------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "TestVisitor.h" -#include - -using namespace clang; - -namespace { - -class LambdaExprVisitor : public ExpectedLocationVisitor { -public: - bool VisitLambdaExpr(LambdaExpr *Lambda) { - PendingBodies.push(Lambda); - Match("", Lambda->getIntroducerRange().getBegin()); - return true; - } - /// For each call to VisitLambdaExpr, we expect a subsequent call (with - /// proper nesting) to TraverseLambdaBody. - bool TraverseLambdaBody(LambdaExpr *Lambda) { - EXPECT_FALSE(PendingBodies.empty()); - EXPECT_EQ(PendingBodies.top(), Lambda); - PendingBodies.pop(); - return TraverseStmt(Lambda->getBody()); - } - /// Determine whether TraverseLambdaBody has been called for every call to - /// VisitLambdaExpr. - bool allBodiesHaveBeenTraversed() const { - return PendingBodies.empty(); - } -private: - std::stack PendingBodies; -}; - -TEST(RecursiveASTVisitor, VisitsLambdaExpr) { - LambdaExprVisitor Visitor; - Visitor.ExpectMatch("", 1, 12); - EXPECT_TRUE(Visitor.runOver("void f() { []{ return; }(); }", - LambdaExprVisitor::Lang_CXX11)); -} - -TEST(RecursiveASTVisitor, TraverseLambdaBodyCanBeOverridden) { - LambdaExprVisitor Visitor; - EXPECT_TRUE(Visitor.runOver("void f() { []{ return; }(); }", - LambdaExprVisitor::Lang_CXX11)); - EXPECT_TRUE(Visitor.allBodiesHaveBeenTraversed()); -} - -TEST(RecursiveASTVisitor, VisitsAttributedLambdaExpr) { - LambdaExprVisitor Visitor; - Visitor.ExpectMatch("", 1, 12); - EXPECT_TRUE(Visitor.runOver( - "void f() { [] () __attribute__ (( fastcall )) { return; }(); }", - LambdaExprVisitor::Lang_CXX14)); -} - -// Matches the (optional) capture-default of a lambda-introducer. -class LambdaDefaultCaptureVisitor - : public ExpectedLocationVisitor { -public: - bool VisitLambdaExpr(LambdaExpr *Lambda) { - if (Lambda->getCaptureDefault() != LCD_None) { - Match("", Lambda->getCaptureDefaultLoc()); - } - return true; - } -}; - -TEST(RecursiveASTVisitor, HasCaptureDefaultLoc) { - LambdaDefaultCaptureVisitor Visitor; - Visitor.ExpectMatch("", 1, 20); - EXPECT_TRUE(Visitor.runOver("void f() { int a; [=]{a;}; }", - LambdaDefaultCaptureVisitor::Lang_CXX11)); -} - -// Checks for lambda classes that are not marked as implicitly-generated. -// (There should be none.) -class ClassVisitor : public ExpectedLocationVisitor { -public: - ClassVisitor() : SawNonImplicitLambdaClass(false) {} - bool VisitCXXRecordDecl(CXXRecordDecl* record) { - if (record->isLambda() && !record->isImplicit()) - SawNonImplicitLambdaClass = true; - return true; - } - - bool sawOnlyImplicitLambdaClasses() const { - return !SawNonImplicitLambdaClass; - } - -private: - bool SawNonImplicitLambdaClass; -}; - -TEST(RecursiveASTVisitor, LambdaClosureTypesAreImplicit) { - ClassVisitor Visitor; - EXPECT_TRUE(Visitor.runOver("auto lambda = []{};", ClassVisitor::Lang_CXX11)); - EXPECT_TRUE(Visitor.sawOnlyImplicitLambdaClasses()); -} - - -// Check to ensure that attributes and expressions within them are being -// visited. -class AttrVisitor : public ExpectedLocationVisitor { -public: - bool VisitMemberExpr(MemberExpr *ME) { - Match(ME->getMemberDecl()->getNameAsString(), ME->getLocStart()); - return true; - } - bool VisitAttr(Attr *A) { - Match("Attr", A->getLocation()); - return true; - } - bool VisitGuardedByAttr(GuardedByAttr *A) { - Match("guarded_by", A->getLocation()); - return true; - } -}; - - -TEST(RecursiveASTVisitor, AttributesAreVisited) { - AttrVisitor Visitor; - Visitor.ExpectMatch("Attr", 4, 24); - Visitor.ExpectMatch("guarded_by", 4, 24); - Visitor.ExpectMatch("mu1", 4, 35); - Visitor.ExpectMatch("Attr", 5, 29); - Visitor.ExpectMatch("mu1", 5, 54); - Visitor.ExpectMatch("mu2", 5, 59); - EXPECT_TRUE(Visitor.runOver( - "class Foo {\n" - " int mu1;\n" - " int mu2;\n" - " int a __attribute__((guarded_by(mu1)));\n" - " void bar() __attribute__((exclusive_locks_required(mu1, mu2)));\n" - "};\n")); -} - -// Check to ensure that implicit default argument expressions are visited. -class IntegerLiteralVisitor - : public ExpectedLocationVisitor { -public: - bool VisitIntegerLiteral(const IntegerLiteral *IL) { - Match("literal", IL->getLocation()); - return true; - } -}; - -TEST(RecursiveASTVisitor, DefaultArgumentsAreVisited) { - IntegerLiteralVisitor Visitor; - Visitor.ExpectMatch("literal", 1, 15, 2); - EXPECT_TRUE(Visitor.runOver("int f(int i = 1);\n" - "static int k = f();\n")); -} - -// Check to ensure that InitListExpr is visited twice, once each for the -// syntactic and semantic form. -class InitListExprPreOrderVisitor - : public ExpectedLocationVisitor { -public: - bool VisitInitListExpr(InitListExpr *ILE) { - Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getLocStart()); - return true; - } -}; - -class InitListExprPostOrderVisitor - : public ExpectedLocationVisitor { -public: - bool shouldTraversePostOrder() const { return true; } - - bool VisitInitListExpr(InitListExpr *ILE) { - Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getLocStart()); - return true; - } -}; - -class InitListExprPreOrderNoQueueVisitor - : public ExpectedLocationVisitor { -public: - bool TraverseInitListExpr(InitListExpr *ILE) { - return ExpectedLocationVisitor::TraverseInitListExpr(ILE); - } - - bool VisitInitListExpr(InitListExpr *ILE) { - Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getLocStart()); - return true; - } -}; - -class InitListExprPostOrderNoQueueVisitor - : public ExpectedLocationVisitor { -public: - bool shouldTraversePostOrder() const { return true; } - - bool TraverseInitListExpr(InitListExpr *ILE) { - return ExpectedLocationVisitor::TraverseInitListExpr(ILE); - } - - bool VisitInitListExpr(InitListExpr *ILE) { - Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getLocStart()); - return true; - } -}; - -TEST(RecursiveASTVisitor, InitListExprIsPreOrderVisitedTwice) { - InitListExprPreOrderVisitor Visitor; - Visitor.ExpectMatch("syntactic", 2, 21); - Visitor.ExpectMatch("semantic", 2, 21); - EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n" - "static struct S s = {.x = 0};\n", - InitListExprPreOrderVisitor::Lang_C)); -} - -TEST(RecursiveASTVisitor, InitListExprIsPostOrderVisitedTwice) { - InitListExprPostOrderVisitor Visitor; - Visitor.ExpectMatch("syntactic", 2, 21); - Visitor.ExpectMatch("semantic", 2, 21); - EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n" - "static struct S s = {.x = 0};\n", - InitListExprPostOrderVisitor::Lang_C)); -} - -TEST(RecursiveASTVisitor, InitListExprIsPreOrderNoQueueVisitedTwice) { - InitListExprPreOrderNoQueueVisitor Visitor; - Visitor.ExpectMatch("syntactic", 2, 21); - Visitor.ExpectMatch("semantic", 2, 21); - EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n" - "static struct S s = {.x = 0};\n", - InitListExprPreOrderNoQueueVisitor::Lang_C)); -} - -TEST(RecursiveASTVisitor, InitListExprIsPostOrderNoQueueVisitedTwice) { - InitListExprPostOrderNoQueueVisitor Visitor; - Visitor.ExpectMatch("syntactic", 2, 21); - Visitor.ExpectMatch("semantic", 2, 21); - EXPECT_TRUE(Visitor.runOver("struct S { int x; };\n" - "static struct S s = {.x = 0};\n", - InitListExprPostOrderNoQueueVisitor::Lang_C)); -} - -// Check to ensure that nested name specifiers are visited. -class NestedNameSpecifiersVisitor - : public ExpectedLocationVisitor { -public: - bool VisitRecordTypeLoc(RecordTypeLoc RTL) { - if (!RTL) - return true; - Match(RTL.getDecl()->getName(), RTL.getNameLoc()); - return true; - } - - bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) { - if (!NNS) - return true; - if (const NamespaceDecl *ND = - NNS.getNestedNameSpecifier()->getAsNamespace()) - Match(ND->getName(), NNS.getLocalBeginLoc()); - return ExpectedLocationVisitor::TraverseNestedNameSpecifierLoc(NNS); - } -}; - -TEST(RecursiveASTVisitor, - NestedNameSpecifiersForTemplateSpecializationsAreVisited) { - StringRef Source = R"( -namespace ns { -struct Outer { - template - struct Nested { }; - - template - static T x; -}; -} - -template<> -struct ns::Outer::Nested; - -template<> -struct ns::Outer::Nested { }; - -template -struct ns::Outer::Nested { }; - -template<> -int ns::Outer::x = 0; -)"; - NestedNameSpecifiersVisitor Visitor; - Visitor.ExpectMatch("ns", 13, 8); - Visitor.ExpectMatch("ns", 16, 8); - Visitor.ExpectMatch("ns", 19, 8); - Visitor.ExpectMatch("ns", 22, 5); - Visitor.ExpectMatch("Outer", 13, 12); - Visitor.ExpectMatch("Outer", 16, 12); - Visitor.ExpectMatch("Outer", 19, 12); - Visitor.ExpectMatch("Outer", 22, 9); - EXPECT_TRUE(Visitor.runOver(Source, NestedNameSpecifiersVisitor::Lang_CXX14)); -} - -} // end anonymous namespace Index: unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp =================================================================== --- unittests/Tooling/RecursiveASTVisitorTestExprVisitor.cpp +++ /dev/null @@ -1,271 +0,0 @@ -//===- unittest/Tooling/RecursiveASTVisitorTestExprVisitor.cpp ------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "TestVisitor.h" - -using namespace clang; - -namespace { - -class ParenExprVisitor : public ExpectedLocationVisitor { -public: - bool VisitParenExpr(ParenExpr *Parens) { - Match("", Parens->getExprLoc()); - return true; - } -}; - -TEST(RecursiveASTVisitor, VisitsParensDuringDataRecursion) { - ParenExprVisitor Visitor; - Visitor.ExpectMatch("", 1, 9); - EXPECT_TRUE(Visitor.runOver("int k = (4) + 9;\n")); -} - -class TemplateArgumentLocTraverser - : public ExpectedLocationVisitor { -public: - bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) { - std::string ArgStr; - llvm::raw_string_ostream Stream(ArgStr); - const TemplateArgument &Arg = ArgLoc.getArgument(); - - Arg.print(Context->getPrintingPolicy(), Stream); - Match(Stream.str(), ArgLoc.getLocation()); - return ExpectedLocationVisitor:: - TraverseTemplateArgumentLoc(ArgLoc); - } -}; - -TEST(RecursiveASTVisitor, VisitsClassTemplateTemplateParmDefaultArgument) { - TemplateArgumentLocTraverser Visitor; - Visitor.ExpectMatch("X", 2, 40); - EXPECT_TRUE(Visitor.runOver( - "template class X;\n" - "template