https://github.com/Sirraide created https://github.com/llvm/llvm-project/pull/115132
This pr refactors most tests that use RAV to use DRAV instead; this also has the nice effect of testing both the RAV and DRAV implementations at the same time w/o having to duplicate all of our AST visitor tests. Some tests rely on features that DRAV doesn’t support (mainly post-order traversal), so those haven’t been migrated. At the same time, `TestVisitor` is now a DRAV, so I’ve had to introduce a new `CTRPTestVisitor` for any tests that need to use RAV directly. >From 0dd745286a124f7142d827810be5185abdc196cf Mon Sep 17 00:00:00 2001 From: Sirraide <aeternalm...@gmail.com> Date: Mon, 19 Aug 2024 17:46:53 +0200 Subject: [PATCH] [Tests] Refactor most tests to use the dynamic visitor --- clang/unittests/AST/EvaluateAsRValueTest.cpp | 12 +- .../unittests/Analysis/CloneDetectionTest.cpp | 7 +- .../unittests/Frontend/FrontendActionTest.cpp | 6 +- clang/unittests/Tooling/ASTSelectionTest.cpp | 4 +- clang/unittests/Tooling/CRTPTestVisitor.h | 42 +++++ clang/unittests/Tooling/CastExprTest.cpp | 6 +- .../unittests/Tooling/CommentHandlerTest.cpp | 9 +- clang/unittests/Tooling/ExecutionTest.cpp | 13 +- ...exicallyOrderedRecursiveASTVisitorTest.cpp | 5 +- clang/unittests/Tooling/LookupTest.cpp | 10 +- clang/unittests/Tooling/QualTypeNamesTest.cpp | 4 +- .../RecursiveASTVisitorTestDeclVisitor.cpp | 22 ++- ...ecursiveASTVisitorTestPostOrderVisitor.cpp | 6 +- .../RecursiveASTVisitorTestTypeLocVisitor.cpp | 4 +- .../Tooling/RecursiveASTVisitorTests/Attr.cpp | 5 +- .../BitfieldInitializer.cpp | 5 +- .../CXXBoolLiteralExpr.cpp | 5 +- .../CXXMemberCall.cpp | 5 +- .../CXXMethodDecl.cpp | 18 +- .../CXXOperatorCallExprTraverser.cpp | 8 +- .../CallbacksCommon.h | 4 +- .../RecursiveASTVisitorTests/Class.cpp | 5 +- .../RecursiveASTVisitorTests/Concept.cpp | 115 +++++++------ .../ConstructExpr.cpp | 20 +-- .../RecursiveASTVisitorTests/DeclRefExpr.cpp | 17 +- .../DeductionGuide.cpp | 17 +- .../RecursiveASTVisitorTests/ImplicitCtor.cpp | 7 +- .../ImplicitCtorInitializer.cpp | 18 +- .../InitListExprPostOrder.cpp | 4 +- .../InitListExprPostOrderNoQueue.cpp | 6 +- .../InitListExprPreOrder.cpp | 15 +- .../InitListExprPreOrderNoQueue.cpp | 7 +- .../IntegerLiteral.cpp | 5 +- .../LambdaDefaultCapture.cpp | 5 +- .../RecursiveASTVisitorTests/LambdaExpr.cpp | 17 +- .../LambdaTemplateParams.cpp | 11 +- .../MemberPointerTypeLoc.cpp | 7 +- .../NestedNameSpecifiers.cpp | 7 +- .../RecursiveASTVisitorTests/ParenExpr.cpp | 4 +- .../TemplateArgumentLocTraverser.cpp | 8 +- .../TraversalScope.cpp | 6 +- clang/unittests/Tooling/RefactoringTest.cpp | 21 +-- clang/unittests/Tooling/SourceCodeTest.cpp | 55 +++--- clang/unittests/Tooling/TestVisitor.h | 160 +++++++++++------- 44 files changed, 378 insertions(+), 359 deletions(-) create mode 100644 clang/unittests/Tooling/CRTPTestVisitor.h diff --git a/clang/unittests/AST/EvaluateAsRValueTest.cpp b/clang/unittests/AST/EvaluateAsRValueTest.cpp index f6261b827671bc..1e17330863f264 100644 --- a/clang/unittests/AST/EvaluateAsRValueTest.cpp +++ b/clang/unittests/AST/EvaluateAsRValueTest.cpp @@ -13,7 +13,7 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" -#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Tooling/Tooling.h" #include "gtest/gtest.h" #include <map> @@ -28,8 +28,8 @@ typedef std::map<std::string, bool> VarInfoMap; /// \brief Records information on variable initializers to a map. class EvaluateConstantInitializersVisitor - : public clang::RecursiveASTVisitor<EvaluateConstantInitializersVisitor> { - public: + : public clang::DynamicRecursiveASTVisitor { +public: explicit EvaluateConstantInitializersVisitor(VarInfoMap &VarInfo) : VarInfo(VarInfo) {} @@ -38,7 +38,7 @@ class EvaluateConstantInitializersVisitor /// /// For each VarDecl with an initializer this also records in VarInfo /// whether the initializer could be evaluated as a constant. - bool VisitVarDecl(const clang::VarDecl *VD) { + bool VisitVarDecl(clang::VarDecl *VD) override { if (const clang::Expr *Init = VD->getInit()) { clang::Expr::EvalResult Result; bool WasEvaluated = Init->EvaluateAsRValue(Result, VD->getASTContext()); @@ -109,9 +109,9 @@ TEST(EvaluateAsRValue, FailsGracefullyForUnknownTypes) { } class CheckLValueToRValueConversionVisitor - : public clang::RecursiveASTVisitor<CheckLValueToRValueConversionVisitor> { + : public clang::DynamicRecursiveASTVisitor { public: - bool VisitDeclRefExpr(const clang::DeclRefExpr *E) { + bool VisitDeclRefExpr(clang::DeclRefExpr *E) override { clang::Expr::EvalResult Result; E->EvaluateAsRValue(Result, E->getDecl()->getASTContext(), true); diff --git a/clang/unittests/Analysis/CloneDetectionTest.cpp b/clang/unittests/Analysis/CloneDetectionTest.cpp index 738f6efd2018d7..d0148a8c28c54e 100644 --- a/clang/unittests/Analysis/CloneDetectionTest.cpp +++ b/clang/unittests/Analysis/CloneDetectionTest.cpp @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#include "clang/AST/RecursiveASTVisitor.h" #include "clang/Analysis/CloneDetection.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Tooling/Tooling.h" #include "gtest/gtest.h" @@ -15,15 +15,14 @@ namespace clang { namespace analysis { namespace { -class CloneDetectionVisitor - : public RecursiveASTVisitor<CloneDetectionVisitor> { +class CloneDetectionVisitor : public DynamicRecursiveASTVisitor { CloneDetector &Detector; public: explicit CloneDetectionVisitor(CloneDetector &D) : Detector(D) {} - bool VisitFunctionDecl(FunctionDecl *D) { + bool VisitFunctionDecl(FunctionDecl *D) override { Detector.analyzeCodeBody(D); return true; } diff --git a/clang/unittests/Frontend/FrontendActionTest.cpp b/clang/unittests/Frontend/FrontendActionTest.cpp index 818e8cef27e51b..6ce9ba6f6a0888 100644 --- a/clang/unittests/Frontend/FrontendActionTest.cpp +++ b/clang/unittests/Frontend/FrontendActionTest.cpp @@ -9,7 +9,7 @@ #include "clang/Frontend/FrontendAction.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" -#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/LangStandard.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/CompilerInvocation.h" @@ -53,7 +53,7 @@ class TestASTFrontendAction : public ASTFrontendAction { } private: - class Visitor : public ASTConsumer, public RecursiveASTVisitor<Visitor> { + class Visitor : public ASTConsumer, public DynamicRecursiveASTVisitor { public: Visitor(CompilerInstance &CI, bool ActOnEndOfTranslationUnit, std::vector<std::string> &decl_names) : @@ -67,7 +67,7 @@ class TestASTFrontendAction : public ASTFrontendAction { TraverseDecl(context.getTranslationUnitDecl()); } - virtual bool VisitNamedDecl(NamedDecl *Decl) { + bool VisitNamedDecl(NamedDecl *Decl) override { decl_names_.push_back(Decl->getQualifiedNameAsString()); return true; } diff --git a/clang/unittests/Tooling/ASTSelectionTest.cpp b/clang/unittests/Tooling/ASTSelectionTest.cpp index 113165f68449ca..1897bc15196ec2 100644 --- a/clang/unittests/Tooling/ASTSelectionTest.cpp +++ b/clang/unittests/Tooling/ASTSelectionTest.cpp @@ -26,7 +26,7 @@ struct FileLocation { using FileRange = std::pair<FileLocation, FileLocation>; -class SelectionFinderVisitor : public TestVisitor<SelectionFinderVisitor> { +class SelectionFinderVisitor : public TestVisitor { FileLocation Location; std::optional<FileRange> SelectionRange; llvm::function_ref<void(SourceRange SelectionRange, @@ -42,7 +42,7 @@ class SelectionFinderVisitor : public TestVisitor<SelectionFinderVisitor> { : Location(Location), SelectionRange(SelectionRange), Consumer(Consumer) { } - bool VisitTranslationUnitDecl(const TranslationUnitDecl *TU) { + bool VisitTranslationUnitDecl(TranslationUnitDecl *TU) override { const ASTContext &Context = TU->getASTContext(); const SourceManager &SM = Context.getSourceManager(); diff --git a/clang/unittests/Tooling/CRTPTestVisitor.h b/clang/unittests/Tooling/CRTPTestVisitor.h new file mode 100644 index 00000000000000..67ae36b2e3ddd9 --- /dev/null +++ b/clang/unittests/Tooling/CRTPTestVisitor.h @@ -0,0 +1,42 @@ +//===--- TestVisitor.h ------------------------------------------*- C++ -*-===// +// +// 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 +// +//===----------------------------------------------------------------------===// +/// +/// \file +/// \brief Defines a CRTP-based RecursiveASTVisitor helper for tests. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_UNITTESTS_TOOLING_CRTPTESTVISITOR_H +#define LLVM_CLANG_UNITTESTS_TOOLING_CRTPTESTVISITOR_H + +#include "TestVisitor.h" +#include "clang/AST/RecursiveASTVisitor.h" + +// CRTP versions of the visitors in TestVisitor.h. +namespace clang { +template <typename T> +class CRTPTestVisitor : public RecursiveASTVisitor<T>, + public detail::TestVisitorHelper { +public: + bool shouldVisitTemplateInstantiations() const { return true; } + bool shouldVisitImplicitCode() const { return true; } + + void InvokeTraverseDecl(TranslationUnitDecl *D) override { + RecursiveASTVisitor<T>::TraverseDecl(D); + } +}; + +template <typename T> +class CRTPExpectedLocationVisitor + : public CRTPTestVisitor<T>, + public detail::ExpectedLocationVisitorHelper { + ASTContext *getASTContext() override { return this->Context; } +}; +} // namespace clang + +#endif // LLVM_CLANG_UNITTESTS_TOOLING_CRTPTESTVISITOR_H diff --git a/clang/unittests/Tooling/CastExprTest.cpp b/clang/unittests/Tooling/CastExprTest.cpp index eab23a5a98e5d5..e5a8d994bf011b 100644 --- a/clang/unittests/Tooling/CastExprTest.cpp +++ b/clang/unittests/Tooling/CastExprTest.cpp @@ -12,17 +12,17 @@ using namespace clang; namespace { -struct CastExprVisitor : TestVisitor<CastExprVisitor> { +struct CastExprVisitor : TestVisitor { std::function<void(ExplicitCastExpr *)> OnExplicitCast; std::function<void(CastExpr *)> OnCast; - bool VisitExplicitCastExpr(ExplicitCastExpr *Expr) { + bool VisitExplicitCastExpr(ExplicitCastExpr *Expr) override { if (OnExplicitCast) OnExplicitCast(Expr); return true; } - bool VisitCastExpr(CastExpr *Expr) { + bool VisitCastExpr(CastExpr *Expr) override { if (OnCast) OnCast(Expr); return true; diff --git a/clang/unittests/Tooling/CommentHandlerTest.cpp b/clang/unittests/Tooling/CommentHandlerTest.cpp index 7eb11ccd6ee2d1..edfb72e2ec599b 100644 --- a/clang/unittests/Tooling/CommentHandlerTest.cpp +++ b/clang/unittests/Tooling/CommentHandlerTest.cpp @@ -22,12 +22,9 @@ struct Comment { class CommentVerifier; typedef std::vector<Comment> CommentList; -class CommentHandlerVisitor : public TestVisitor<CommentHandlerVisitor>, - public CommentHandler { - typedef TestVisitor<CommentHandlerVisitor> base; - +class CommentHandlerVisitor : public TestVisitor, public CommentHandler { public: - CommentHandlerVisitor() : base(), PP(nullptr), Verified(false) {} + CommentHandlerVisitor() : PP(nullptr), Verified(false) {} ~CommentHandlerVisitor() override { EXPECT_TRUE(Verified) << "CommentVerifier not accessed"; @@ -64,7 +61,7 @@ class CommentHandlerVisitor : public TestVisitor<CommentHandlerVisitor>, CommentList Comments; bool Verified; - class CommentHandlerAction : public base::TestAction { + class CommentHandlerAction : public TestAction { public: CommentHandlerAction(CommentHandlerVisitor *Visitor) : TestAction(Visitor) { } diff --git a/clang/unittests/Tooling/ExecutionTest.cpp b/clang/unittests/Tooling/ExecutionTest.cpp index 91ab8594f6823d..b0fd7ccb950ff4 100644 --- a/clang/unittests/Tooling/ExecutionTest.cpp +++ b/clang/unittests/Tooling/ExecutionTest.cpp @@ -9,7 +9,7 @@ #include "clang/Tooling/Execution.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/DeclCXX.h" -#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/FrontendAction.h" #include "clang/Frontend/FrontendActions.h" @@ -30,12 +30,9 @@ namespace { // This traverses the AST and outputs function name as key and "1" as value for // each function declaration. -class ASTConsumerWithResult - : public ASTConsumer, - public RecursiveASTVisitor<ASTConsumerWithResult> { +class ASTConsumerWithResult : public ASTConsumer, + public DynamicRecursiveASTVisitor { public: - using ASTVisitor = RecursiveASTVisitor<ASTConsumerWithResult>; - explicit ASTConsumerWithResult(ExecutionContext *Context) : Context(Context) { assert(Context != nullptr); } @@ -44,12 +41,12 @@ class ASTConsumerWithResult TraverseDecl(Context.getTranslationUnitDecl()); } - bool TraverseFunctionDecl(clang::FunctionDecl *Decl) { + bool TraverseFunctionDecl(clang::FunctionDecl *Decl) override { Context->reportResult(Decl->getNameAsString(), Context->getRevision() + ":" + Context->getCorpus() + ":" + Context->getCurrentCompilationUnit() + "/1"); - return ASTVisitor::TraverseFunctionDecl(Decl); + return DynamicRecursiveASTVisitor::TraverseFunctionDecl(Decl); } private: diff --git a/clang/unittests/Tooling/LexicallyOrderedRecursiveASTVisitorTest.cpp b/clang/unittests/Tooling/LexicallyOrderedRecursiveASTVisitorTest.cpp index 5d16595aec8014..b167eb4b811755 100644 --- a/clang/unittests/Tooling/LexicallyOrderedRecursiveASTVisitorTest.cpp +++ b/clang/unittests/Tooling/LexicallyOrderedRecursiveASTVisitorTest.cpp @@ -44,13 +44,14 @@ class LexicallyOrderedDeclVisitor llvm::SmallVector<Decl *, 8> TraversalStack; }; -class DummyMatchVisitor : public ExpectedLocationVisitor<DummyMatchVisitor> { +class DummyMatchVisitor : public ExpectedLocationVisitor { bool EmitDeclIndices, EmitStmtIndices; public: DummyMatchVisitor(bool EmitDeclIndices = false, bool EmitStmtIndices = false) : EmitDeclIndices(EmitDeclIndices), EmitStmtIndices(EmitStmtIndices) {} - bool VisitTranslationUnitDecl(TranslationUnitDecl *TU) { + + bool VisitTranslationUnitDecl(TranslationUnitDecl *TU) override { const ASTContext &Context = TU->getASTContext(); const SourceManager &SM = Context.getSourceManager(); LexicallyOrderedDeclVisitor SubVisitor(*this, SM, EmitDeclIndices, diff --git a/clang/unittests/Tooling/LookupTest.cpp b/clang/unittests/Tooling/LookupTest.cpp index 2cf5ebb2a4cbd0..acd1714a26e071 100644 --- a/clang/unittests/Tooling/LookupTest.cpp +++ b/clang/unittests/Tooling/LookupTest.cpp @@ -13,31 +13,31 @@ using namespace clang; namespace { -struct GetDeclsVisitor : TestVisitor<GetDeclsVisitor> { +struct GetDeclsVisitor : TestVisitor { std::function<void(CallExpr *)> OnCall; std::function<void(RecordTypeLoc)> OnRecordTypeLoc; std::function<void(UsingTypeLoc)> OnUsingTypeLoc; SmallVector<Decl *, 4> DeclStack; - bool VisitCallExpr(CallExpr *Expr) { + bool VisitCallExpr(CallExpr *Expr) override { if (OnCall) OnCall(Expr); return true; } - bool VisitRecordTypeLoc(RecordTypeLoc Loc) { + bool VisitRecordTypeLoc(RecordTypeLoc Loc) override { if (OnRecordTypeLoc) OnRecordTypeLoc(Loc); return true; } - bool VisitUsingTypeLoc(UsingTypeLoc Loc) { + bool VisitUsingTypeLoc(UsingTypeLoc Loc) override { if (OnUsingTypeLoc) OnUsingTypeLoc(Loc); return true; } - bool TraverseDecl(Decl *D) { + bool TraverseDecl(Decl *D) override { DeclStack.push_back(D); bool Ret = TestVisitor::TraverseDecl(D); DeclStack.pop_back(); diff --git a/clang/unittests/Tooling/QualTypeNamesTest.cpp b/clang/unittests/Tooling/QualTypeNamesTest.cpp index 686d189cf69eb2..5ded64d4fcc8c5 100644 --- a/clang/unittests/Tooling/QualTypeNamesTest.cpp +++ b/clang/unittests/Tooling/QualTypeNamesTest.cpp @@ -11,12 +11,12 @@ using namespace clang; namespace { -struct TypeNameVisitor : TestVisitor<TypeNameVisitor> { +struct TypeNameVisitor : TestVisitor { llvm::StringMap<std::string> ExpectedQualTypeNames; bool WithGlobalNsPrefix = false; // ValueDecls are the least-derived decl with both a qualtype and a name. - bool VisitValueDecl(const ValueDecl *VD) { + bool VisitValueDecl(ValueDecl *VD) override { std::string ExpectedName = ExpectedQualTypeNames.lookup(VD->getNameAsString()); if (ExpectedName != "") { diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTestDeclVisitor.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTestDeclVisitor.cpp index d72a110d37e0fd..eed016e9ee7c24 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTestDeclVisitor.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTestDeclVisitor.cpp @@ -12,12 +12,12 @@ using namespace clang; namespace { -class VarDeclVisitor : public ExpectedLocationVisitor<VarDeclVisitor> { +class VarDeclVisitor : public ExpectedLocationVisitor { public: - bool VisitVarDecl(VarDecl *Variable) { - Match(Variable->getNameAsString(), Variable->getBeginLoc()); - return true; - } + bool VisitVarDecl(VarDecl *Variable) override { + Match(Variable->getNameAsString(), Variable->getBeginLoc()); + return true; + } }; TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtLoopVariable) { @@ -29,12 +29,11 @@ TEST(RecursiveASTVisitor, VisitsCXXForRangeStmtLoopVariable) { VarDeclVisitor::Lang_CXX11)); } -class ParmVarDeclVisitorForImplicitCode : - public ExpectedLocationVisitor<ParmVarDeclVisitorForImplicitCode> { +class ParmVarDeclVisitorForImplicitCode : public ExpectedLocationVisitor { public: - bool shouldVisitImplicitCode() const { return true; } + ParmVarDeclVisitorForImplicitCode() { ShouldVisitImplicitCode = true; } - bool VisitParmVarDecl(ParmVarDecl *ParamVar) { + bool VisitParmVarDecl(ParmVarDecl *ParamVar) override { Match(ParamVar->getNameAsString(), ParamVar->getBeginLoc()); return true; } @@ -58,10 +57,9 @@ TEST(RecursiveASTVisitor, VisitsParmVarDeclForImplicitCode) { "void bar(Y a) {Y b = a;}")); } -class NamedDeclVisitor - : public ExpectedLocationVisitor<NamedDeclVisitor> { +class NamedDeclVisitor : public ExpectedLocationVisitor { public: - bool VisitNamedDecl(NamedDecl *Decl) { + bool VisitNamedDecl(NamedDecl *Decl) override { std::string NameWithTemplateArgs; llvm::raw_string_ostream OS(NameWithTemplateArgs); Decl->getNameForDiagnostic(OS, diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTestPostOrderVisitor.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTestPostOrderVisitor.cpp index 8ac0604c09110a..481559ed08efdf 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTestPostOrderVisitor.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTestPostOrderVisitor.cpp @@ -11,14 +11,12 @@ // //===----------------------------------------------------------------------===// -#include "TestVisitor.h" +#include "CRTPTestVisitor.h" using namespace clang; namespace { - -class RecordingVisitor : public TestVisitor<RecordingVisitor> { - +class RecordingVisitor : public CRTPTestVisitor<RecordingVisitor> { bool VisitPostOrder; public: diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTestTypeLocVisitor.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTestTypeLocVisitor.cpp index a21186265db6a9..eec628ca396417 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTestTypeLocVisitor.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTestTypeLocVisitor.cpp @@ -12,9 +12,9 @@ using namespace clang; namespace { -class TypeLocVisitor : public ExpectedLocationVisitor<TypeLocVisitor> { +class TypeLocVisitor : public ExpectedLocationVisitor { public: - bool VisitTypeLoc(TypeLoc TypeLocation) { + bool VisitTypeLoc(TypeLoc TypeLocation) override { Match(TypeLocation.getType().getAsString(), TypeLocation.getBeginLoc()); return true; } diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/Attr.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/Attr.cpp index 022ef8b8322868..7693e77236b0c4 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/Attr.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/Attr.cpp @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "TestVisitor.h" +#include "CRTPTestVisitor.h" using namespace clang; @@ -14,7 +14,7 @@ namespace { // Check to ensure that attributes and expressions within them are being // visited. -class AttrVisitor : public ExpectedLocationVisitor<AttrVisitor> { +class AttrVisitor : public CRTPExpectedLocationVisitor<AttrVisitor> { public: bool VisitMemberExpr(MemberExpr *ME) { Match(ME->getMemberDecl()->getNameAsString(), ME->getBeginLoc()); @@ -30,7 +30,6 @@ class AttrVisitor : public ExpectedLocationVisitor<AttrVisitor> { } }; - TEST(RecursiveASTVisitor, AttributesAreVisited) { AttrVisitor Visitor; Visitor.ExpectMatch("Attr", 4, 24); diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp index c11e726fe85528..c1217179768ac2 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/BitfieldInitializer.cpp @@ -14,10 +14,9 @@ using namespace clang; namespace { // Check to ensure that bitfield initializers are visited. -class BitfieldInitializerVisitor - : public ExpectedLocationVisitor<BitfieldInitializerVisitor> { +class BitfieldInitializerVisitor : public ExpectedLocationVisitor { public: - bool VisitIntegerLiteral(IntegerLiteral *IL) { + bool VisitIntegerLiteral(IntegerLiteral *IL) override { Match(std::to_string(IL->getValue().getSExtValue()), IL->getLocation()); return true; } diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXBoolLiteralExpr.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXBoolLiteralExpr.cpp index 1fb192dcda0863..4b0c4c31f2dd2e 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXBoolLiteralExpr.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXBoolLiteralExpr.cpp @@ -12,10 +12,9 @@ using namespace clang; namespace { -class CXXBoolLiteralExprVisitor - : public ExpectedLocationVisitor<CXXBoolLiteralExprVisitor> { +class CXXBoolLiteralExprVisitor : public ExpectedLocationVisitor { public: - bool VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *BE) { + bool VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *BE) override { if (BE->getValue()) Match("true", BE->getLocation()); else diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMemberCall.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMemberCall.cpp index c7b31e06e0e8e9..fe95e8987a73a1 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMemberCall.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMemberCall.cpp @@ -12,10 +12,9 @@ using namespace clang; namespace { -class CXXMemberCallVisitor - : public ExpectedLocationVisitor<CXXMemberCallVisitor> { +class CXXMemberCallVisitor : public ExpectedLocationVisitor { public: - bool VisitCXXMemberCallExpr(CXXMemberCallExpr *Call) { + bool VisitCXXMemberCallExpr(CXXMemberCallExpr *Call) override { Match(Call->getMethodDecl()->getQualifiedNameAsString(), Call->getBeginLoc()); return true; diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMethodDecl.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMethodDecl.cpp index 90fa84bd448124..1eeb3df81a3168 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMethodDecl.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXMethodDecl.cpp @@ -13,25 +13,21 @@ using namespace clang; namespace { -class CXXMethodDeclVisitor - : public ExpectedLocationVisitor<CXXMethodDeclVisitor> { +class CXXMethodDeclVisitor : public ExpectedLocationVisitor { public: - CXXMethodDeclVisitor(bool VisitImplicitCode) - : VisitImplicitCode(VisitImplicitCode) {} - - bool shouldVisitImplicitCode() const { return VisitImplicitCode; } + CXXMethodDeclVisitor(bool VisitImplicitCode) { + ShouldVisitImplicitCode = VisitImplicitCode; + } - bool VisitDeclRefExpr(DeclRefExpr *D) { + bool VisitDeclRefExpr(DeclRefExpr *D) override { Match("declref", D->getLocation()); return true; } - bool VisitParmVarDecl(ParmVarDecl *P) { + + bool VisitParmVarDecl(ParmVarDecl *P) override { Match("parm", P->getLocation()); return true; } - -private: - bool VisitImplicitCode; }; TEST(RecursiveASTVisitor, CXXMethodDeclNoDefaultBodyVisited) { diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXOperatorCallExprTraverser.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXOperatorCallExprTraverser.cpp index 376874eb351de1..46686199c05d4e 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXOperatorCallExprTraverser.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/CXXOperatorCallExprTraverser.cpp @@ -12,15 +12,13 @@ using namespace clang; namespace { -class CXXOperatorCallExprTraverser - : public ExpectedLocationVisitor<CXXOperatorCallExprTraverser> { +class CXXOperatorCallExprTraverser : public ExpectedLocationVisitor { public: // Use Traverse, not Visit, to check that data recursion optimization isn't // bypassing the call of this function. - bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *CE) { + bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *CE) override { Match(getOperatorSpelling(CE->getOperator()), CE->getExprLoc()); - return ExpectedLocationVisitor<CXXOperatorCallExprTraverser>:: - TraverseCXXOperatorCallExpr(CE); + return ExpectedLocationVisitor::TraverseCXXOperatorCallExpr(CE); } }; diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/CallbacksCommon.h b/clang/unittests/Tooling/RecursiveASTVisitorTests/CallbacksCommon.h index 92e30c2d46e5fa..355ecfb452e7e8 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/CallbacksCommon.h +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/CallbacksCommon.h @@ -6,7 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "TestVisitor.h" +#include "CRTPTestVisitor.h" using namespace clang; @@ -21,7 +21,7 @@ enum class ShouldTraversePostOrder : bool { /// sequence of calls to user-defined callbacks like Traverse*(), WalkUp*(), /// Visit*(). template <typename Derived> -class RecordingVisitorBase : public TestVisitor<Derived> { +class RecordingVisitorBase : public CRTPTestVisitor<Derived> { ShouldTraversePostOrder ShouldTraversePostOrderValue; public: diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/Class.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/Class.cpp index 3ea5abd46a1eca..79dc84b2fdb7b9 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/Class.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/Class.cpp @@ -14,10 +14,11 @@ namespace { // Checks for lambda classes that are not marked as implicitly-generated. // (There should be none.) -class ClassVisitor : public ExpectedLocationVisitor<ClassVisitor> { +class ClassVisitor : public ExpectedLocationVisitor { public: ClassVisitor() : SawNonImplicitLambdaClass(false) {} - bool VisitCXXRecordDecl(CXXRecordDecl* record) { + + bool VisitCXXRecordDecl(CXXRecordDecl *record) override { if (record->isLambda() && !record->isImplicit()) SawNonImplicitLambdaClass = true; return true; diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp index 6a8d91672f1d93..6dd28e27d7ec2c 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp @@ -16,78 +16,87 @@ using namespace clang; namespace { -struct ConceptVisitor : ExpectedLocationVisitor<ConceptVisitor> { - bool VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) { +struct ConceptVisitor : ExpectedLocationVisitor { + ConceptVisitor(bool VisitImplicitCode = false) { + ShouldVisitImplicitCode = VisitImplicitCode; + } + + bool VisitConceptSpecializationExpr(ConceptSpecializationExpr *E) override { ++ConceptSpecializationExprsVisited; return true; } - bool TraverseTypeConstraint(const TypeConstraint *C) { + bool TraverseTypeConstraint(const TypeConstraint *C) override { ++TypeConstraintsTraversed; return ExpectedLocationVisitor::TraverseTypeConstraint(C); } - bool TraverseConceptRequirement(concepts::Requirement *R) { + bool TraverseConceptRequirement(concepts::Requirement *R) override { ++ConceptRequirementsTraversed; return ExpectedLocationVisitor::TraverseConceptRequirement(R); } - bool TraverseConceptReference(ConceptReference *CR) { + bool TraverseConceptReference(ConceptReference *CR) override { ++ConceptReferencesTraversed; return ExpectedLocationVisitor::TraverseConceptReference(CR); } - bool VisitConceptReference(ConceptReference *CR) { + bool VisitConceptReference(ConceptReference *CR) override { ++ConceptReferencesVisited; return true; } - bool shouldVisitImplicitCode() { return ShouldVisitImplicitCode; } - int ConceptSpecializationExprsVisited = 0; int TypeConstraintsTraversed = 0; int ConceptRequirementsTraversed = 0; int ConceptReferencesTraversed = 0; int ConceptReferencesVisited = 0; - bool ShouldVisitImplicitCode = false; }; TEST(RecursiveASTVisitor, Concepts) { - ConceptVisitor Visitor; - Visitor.ShouldVisitImplicitCode = true; - EXPECT_TRUE(Visitor.runOver("template <typename T> concept Fooable = true;\n" - "template <Fooable T> void bar(T);", - ConceptVisitor::Lang_CXX2a)); - // Check that we traverse the "Fooable T" template parameter's - // TypeConstraint's ImmediatelyDeclaredConstraint, which is a - // ConceptSpecializationExpr. - EXPECT_EQ(1, Visitor.ConceptSpecializationExprsVisited); - // Also check we traversed the TypeConstraint that produced the expr. - EXPECT_EQ(1, Visitor.TypeConstraintsTraversed); - EXPECT_EQ(1, Visitor.ConceptReferencesTraversed); - EXPECT_EQ(1, Visitor.ConceptReferencesVisited); + { + ConceptVisitor Visitor{true}; + EXPECT_TRUE( + Visitor.runOver("template <typename T> concept Fooable = true;\n" + "template <Fooable T> void bar(T);", + ConceptVisitor::Lang_CXX2a)); + // Check that we traverse the "Fooable T" template parameter's + // TypeConstraint's ImmediatelyDeclaredConstraint, which is a + // ConceptSpecializationExpr. + EXPECT_EQ(1, Visitor.ConceptSpecializationExprsVisited); + // Also check we traversed the TypeConstraint that produced the expr. + EXPECT_EQ(1, Visitor.TypeConstraintsTraversed); + EXPECT_EQ(1, Visitor.ConceptReferencesTraversed); + EXPECT_EQ(1, Visitor.ConceptReferencesVisited); + } - Visitor = {}; // Don't visit implicit code now. - EXPECT_TRUE(Visitor.runOver("template <typename T> concept Fooable = true;\n" - "template <Fooable T> void bar(T);", - ConceptVisitor::Lang_CXX2a)); - // Check that we only visit the TypeConstraint, but not the implicitly - // generated immediately declared expression. - EXPECT_EQ(0, Visitor.ConceptSpecializationExprsVisited); - EXPECT_EQ(1, Visitor.TypeConstraintsTraversed); - EXPECT_EQ(1, Visitor.ConceptReferencesTraversed); - EXPECT_EQ(1, Visitor.ConceptReferencesVisited); + { + ConceptVisitor Visitor; // Don't visit implicit code now. + EXPECT_TRUE( + Visitor.runOver("template <typename T> concept Fooable = true;\n" + "template <Fooable T> void bar(T);", + ConceptVisitor::Lang_CXX2a)); + // Check that we only visit the TypeConstraint, but not the implicitly + // generated immediately declared expression. + EXPECT_EQ(0, Visitor.ConceptSpecializationExprsVisited); + EXPECT_EQ(1, Visitor.TypeConstraintsTraversed); + EXPECT_EQ(1, Visitor.ConceptReferencesTraversed); + EXPECT_EQ(1, Visitor.ConceptReferencesVisited); + } - Visitor = {}; - EXPECT_TRUE(Visitor.runOver("template <class T> concept A = true;\n" - "template <class T> struct vector {};\n" - "template <class T> concept B = requires(T x) {\n" - " typename vector<T*>;\n" - " {x} -> A;\n" - " requires true;\n" - "};", - ConceptVisitor::Lang_CXX2a)); - EXPECT_EQ(3, Visitor.ConceptRequirementsTraversed); - EXPECT_EQ(1, Visitor.ConceptReferencesTraversed); - EXPECT_EQ(1, Visitor.ConceptReferencesVisited); + { + ConceptVisitor Visitor; + EXPECT_TRUE( + Visitor.runOver("template <class T> concept A = true;\n" + "template <class T> struct vector {};\n" + "template <class T> concept B = requires(T x) {\n" + " typename vector<T*>;\n" + " {x} -> A;\n" + " requires true;\n" + "};", + ConceptVisitor::Lang_CXX2a)); + EXPECT_EQ(3, Visitor.ConceptRequirementsTraversed); + EXPECT_EQ(1, Visitor.ConceptReferencesTraversed); + EXPECT_EQ(1, Visitor.ConceptReferencesVisited); + } - Visitor = {}; + ConceptVisitor Visitor; llvm::StringRef Code = R"cpp( template<typename T> concept True = false; @@ -107,34 +116,34 @@ struct Foo<F> {}; EXPECT_EQ(2, Visitor.ConceptReferencesVisited); } -struct VisitDeclOnlyOnce : ExpectedLocationVisitor<VisitDeclOnlyOnce> { - bool VisitConceptDecl(ConceptDecl *D) { +struct VisitDeclOnlyOnce : ExpectedLocationVisitor { + VisitDeclOnlyOnce() { ShouldWalkTypesOfTypeLocs = false; } + + bool VisitConceptDecl(ConceptDecl *D) override { ++ConceptDeclsVisited; return true; } - bool VisitAutoType(AutoType *) { + bool VisitAutoType(AutoType *) override { ++AutoTypeVisited; return true; } - bool VisitAutoTypeLoc(AutoTypeLoc) { + bool VisitAutoTypeLoc(AutoTypeLoc) override { ++AutoTypeLocVisited; return true; } - bool VisitConceptReference(ConceptReference *) { + bool VisitConceptReference(ConceptReference *) override { ++ConceptReferencesVisited; return true; } - bool TraverseVarDecl(VarDecl *V) { + bool TraverseVarDecl(VarDecl *V) override { // The base traversal visits only the `TypeLoc`. // However, in the test we also validate the underlying `QualType`. TraverseType(V->getType()); return ExpectedLocationVisitor::TraverseVarDecl(V); } - bool shouldWalkTypesOfTypeLocs() { return false; } - int ConceptDeclsVisited = 0; int AutoTypeVisited = 0; int AutoTypeLocVisited = 0; diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/ConstructExpr.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/ConstructExpr.cpp index b4f4f54dc7e2f9..7b2ed9715aa80d 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/ConstructExpr.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/ConstructExpr.cpp @@ -18,18 +18,11 @@ namespace { /// The name recorded for the match is the name of the class whose constructor /// is invoked by the CXXConstructExpr, not the name of the class whose /// constructor the CXXConstructExpr is contained in. -class ConstructExprVisitor - : public ExpectedLocationVisitor<ConstructExprVisitor> { +class ConstructExprVisitor : public ExpectedLocationVisitor { public: - ConstructExprVisitor() : ShouldVisitImplicitCode(false) {} + ConstructExprVisitor() { ShouldVisitImplicitCode = false; } - bool shouldVisitImplicitCode() const { return ShouldVisitImplicitCode; } - - void setShouldVisitImplicitCode(bool NewValue) { - ShouldVisitImplicitCode = NewValue; - } - - bool VisitCXXConstructExpr(CXXConstructExpr* Expr) { + bool VisitCXXConstructExpr(CXXConstructExpr *Expr) override { if (const CXXConstructorDecl* Ctor = Expr->getConstructor()) { if (const CXXRecordDecl* Class = Ctor->getParent()) { Match(Class->getName(), Expr->getLocation()); @@ -37,14 +30,11 @@ class ConstructExprVisitor } return true; } - - private: - bool ShouldVisitImplicitCode; }; TEST(RecursiveASTVisitor, CanVisitImplicitMemberInitializations) { ConstructExprVisitor Visitor; - Visitor.setShouldVisitImplicitCode(true); + Visitor.ShouldVisitImplicitCode = true; Visitor.ExpectMatch("WithCtor", 2, 8); // Simple has a constructor that implicitly initializes 'w'. Test // that a visitor that visits implicit code visits that initialization. @@ -60,7 +50,7 @@ TEST(RecursiveASTVisitor, CanVisitImplicitMemberInitializations) { // visits are omitted when the visitor does not include implicit code. TEST(RecursiveASTVisitor, CanSkipImplicitMemberInitializations) { ConstructExprVisitor Visitor; - Visitor.setShouldVisitImplicitCode(false); + Visitor.ShouldVisitImplicitCode = false; Visitor.DisallowMatch("WithCtor", 2, 8); // Simple has a constructor that implicitly initializes 'w'. Test // that a visitor that skips implicit code skips that initialization. diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/DeclRefExpr.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/DeclRefExpr.cpp index adc972e1c3d913..6ed986c187eb52 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/DeclRefExpr.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/DeclRefExpr.cpp @@ -12,23 +12,14 @@ using namespace clang; namespace { -class DeclRefExprVisitor : public ExpectedLocationVisitor<DeclRefExprVisitor> { +class DeclRefExprVisitor : public ExpectedLocationVisitor { public: - DeclRefExprVisitor() : ShouldVisitImplicitCode(false) {} + DeclRefExprVisitor() { ShouldVisitImplicitCode = false; } - bool shouldVisitImplicitCode() const { return ShouldVisitImplicitCode; } - - void setShouldVisitImplicitCode(bool NewValue) { - ShouldVisitImplicitCode = NewValue; - } - - bool VisitDeclRefExpr(DeclRefExpr *Reference) { + bool VisitDeclRefExpr(DeclRefExpr *Reference) override { Match(Reference->getNameInfo().getAsString(), Reference->getLocation()); return true; } - -private: - bool ShouldVisitImplicitCode; }; TEST(RecursiveASTVisitor, VisitsBaseClassTemplateArguments) { @@ -73,7 +64,7 @@ TEST(RecursiveASTVisitor, VisitsUseOfImplicitLambdaCapture) { TEST(RecursiveASTVisitor, VisitsImplicitLambdaCaptureInit) { DeclRefExprVisitor Visitor; - Visitor.setShouldVisitImplicitCode(true); + Visitor.ShouldVisitImplicitCode = true; // We're expecting "i" to be visited twice: once for the initialization expr // for the captured variable "i" outside of the lambda body, and again for // the use of "i" inside the lambda. diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/DeductionGuide.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/DeductionGuide.cpp index df878bfc113e57..7d03b283947993 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/DeductionGuide.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/DeductionGuide.cpp @@ -13,23 +13,20 @@ using namespace clang; namespace { -class DeductionGuideVisitor - : public ExpectedLocationVisitor<DeductionGuideVisitor> { +class DeductionGuideVisitor : public ExpectedLocationVisitor { public: - DeductionGuideVisitor(bool ShouldVisitImplicitCode) - : ShouldVisitImplicitCode(ShouldVisitImplicitCode) {} - bool VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) { + DeductionGuideVisitor(bool VisitImplicitCode) { + ShouldVisitImplicitCode = VisitImplicitCode; + ShouldVisitTemplateInstantiations = false; + } + + bool VisitCXXDeductionGuideDecl(CXXDeductionGuideDecl *D) override { std::string Storage; llvm::raw_string_ostream Stream(Storage); D->print(Stream); Match(Storage, D->getLocation()); return true; } - - bool shouldVisitTemplateInstantiations() const { return false; } - - bool shouldVisitImplicitCode() const { return ShouldVisitImplicitCode; } - bool ShouldVisitImplicitCode; }; TEST(RecursiveASTVisitor, DeductionGuideNonImplicitMode) { diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtor.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtor.cpp index 27999e5ef8efcb..dc9455a01e4882 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtor.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtor.cpp @@ -13,12 +13,9 @@ using namespace clang; namespace { // A visitor that visits implicit declarations and matches constructors. -class ImplicitCtorVisitor - : public ExpectedLocationVisitor<ImplicitCtorVisitor> { +class ImplicitCtorVisitor : public ExpectedLocationVisitor { public: - bool shouldVisitImplicitCode() const { return true; } - - bool VisitCXXConstructorDecl(CXXConstructorDecl* Ctor) { + bool VisitCXXConstructorDecl(CXXConstructorDecl *Ctor) override { if (Ctor->isImplicit()) { // Was not written in source code if (const CXXRecordDecl* Class = Ctor->getParent()) { Match(Class->getName(), Ctor->getLocation()); diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtorInitializer.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtorInitializer.cpp index c762e1cffc3686..ae952c33bfe78b 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtorInitializer.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/ImplicitCtorInitializer.cpp @@ -12,26 +12,20 @@ using namespace clang; namespace { -class CXXCtorInitializerVisitor - : public ExpectedLocationVisitor<CXXCtorInitializerVisitor> { +class CXXCtorInitializerVisitor : public ExpectedLocationVisitor { public: - CXXCtorInitializerVisitor(bool VisitImplicitCode) - : VisitImplicitCode(VisitImplicitCode) {} - - bool shouldVisitImplicitCode() const { return VisitImplicitCode; } + CXXCtorInitializerVisitor(bool VisitImplicitCode) { + ShouldVisitImplicitCode = VisitImplicitCode; + } - bool TraverseConstructorInitializer(CXXCtorInitializer *Init) { + bool TraverseConstructorInitializer(CXXCtorInitializer *Init) override { if (!Init->isWritten()) VisitedImplicitInitializer = true; Match("initializer", Init->getSourceLocation()); - return ExpectedLocationVisitor< - CXXCtorInitializerVisitor>::TraverseConstructorInitializer(Init); + return ExpectedLocationVisitor::TraverseConstructorInitializer(Init); } bool VisitedImplicitInitializer = false; - -private: - bool VisitImplicitCode; }; // Check to ensure that CXXCtorInitializer is not visited when implicit code diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrder.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrder.cpp index 80d9c9873505b4..5836fc1b2e8de5 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrder.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrder.cpp @@ -6,14 +6,14 @@ // //===----------------------------------------------------------------------===// -#include "TestVisitor.h" +#include "CRTPTestVisitor.h" using namespace clang; namespace { class InitListExprPostOrderVisitor - : public ExpectedLocationVisitor<InitListExprPostOrderVisitor> { + : public CRTPExpectedLocationVisitor<InitListExprPostOrderVisitor> { public: bool shouldTraversePostOrder() const { return true; } diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrderNoQueue.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrderNoQueue.cpp index 8750f78349443e..20140d2dcbf9e4 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrderNoQueue.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPostOrderNoQueue.cpp @@ -6,19 +6,19 @@ // //===----------------------------------------------------------------------===// -#include "TestVisitor.h" +#include "CRTPTestVisitor.h" using namespace clang; namespace { class InitListExprPostOrderNoQueueVisitor - : public ExpectedLocationVisitor<InitListExprPostOrderNoQueueVisitor> { + : public CRTPExpectedLocationVisitor<InitListExprPostOrderNoQueueVisitor> { public: bool shouldTraversePostOrder() const { return true; } bool TraverseInitListExpr(InitListExpr *ILE) { - return ExpectedLocationVisitor::TraverseInitListExpr(ILE); + return CRTPExpectedLocationVisitor::TraverseInitListExpr(ILE); } bool VisitInitListExpr(InitListExpr *ILE) { diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrder.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrder.cpp index 3fa1529ea0eefe..933d25898390dd 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrder.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrder.cpp @@ -14,21 +14,16 @@ namespace { // Check to ensure that InitListExpr is visited twice, once each for the // syntactic and semantic form. -class InitListExprPreOrderVisitor - : public ExpectedLocationVisitor<InitListExprPreOrderVisitor> { +class InitListExprPreOrderVisitor : public ExpectedLocationVisitor { public: - InitListExprPreOrderVisitor(bool VisitImplicitCode) - : VisitImplicitCode(VisitImplicitCode) {} - - bool shouldVisitImplicitCode() const { return VisitImplicitCode; } + InitListExprPreOrderVisitor(bool VisitImplicitCode) { + ShouldVisitImplicitCode = VisitImplicitCode; + } - bool VisitInitListExpr(InitListExpr *ILE) { + bool VisitInitListExpr(InitListExpr *ILE) override { Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getBeginLoc()); return true; } - -private: - bool VisitImplicitCode; }; TEST(RecursiveASTVisitor, InitListExprIsPreOrderVisitedTwice) { diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrderNoQueue.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrderNoQueue.cpp index 8db88e1e063975..0dcd11b8027f04 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrderNoQueue.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/InitListExprPreOrderNoQueue.cpp @@ -12,14 +12,13 @@ using namespace clang; namespace { -class InitListExprPreOrderNoQueueVisitor - : public ExpectedLocationVisitor<InitListExprPreOrderNoQueueVisitor> { +class InitListExprPreOrderNoQueueVisitor : public ExpectedLocationVisitor { public: - bool TraverseInitListExpr(InitListExpr *ILE) { + bool TraverseInitListExpr(InitListExpr *ILE) override { return ExpectedLocationVisitor::TraverseInitListExpr(ILE); } - bool VisitInitListExpr(InitListExpr *ILE) { + bool VisitInitListExpr(InitListExpr *ILE) override { Match(ILE->isSemanticForm() ? "semantic" : "syntactic", ILE->getBeginLoc()); return true; } diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/IntegerLiteral.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/IntegerLiteral.cpp index 3fc3cb1a99a744..83136fc11edb2c 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/IntegerLiteral.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/IntegerLiteral.cpp @@ -13,10 +13,9 @@ using namespace clang; namespace { // Check to ensure that implicit default argument expressions are visited. -class IntegerLiteralVisitor - : public ExpectedLocationVisitor<IntegerLiteralVisitor> { +class IntegerLiteralVisitor : public ExpectedLocationVisitor { public: - bool VisitIntegerLiteral(const IntegerLiteral *IL) { + bool VisitIntegerLiteral(IntegerLiteral *IL) override { Match("literal", IL->getLocation()); return true; } diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaDefaultCapture.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaDefaultCapture.cpp index b1d6d593e733a9..4a9175ed2dda24 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaDefaultCapture.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaDefaultCapture.cpp @@ -13,10 +13,9 @@ using namespace clang; namespace { // Matches the (optional) capture-default of a lambda-introducer. -class LambdaDefaultCaptureVisitor - : public ExpectedLocationVisitor<LambdaDefaultCaptureVisitor> { +class LambdaDefaultCaptureVisitor : public ExpectedLocationVisitor { public: - bool VisitLambdaExpr(LambdaExpr *Lambda) { + bool VisitLambdaExpr(LambdaExpr *Lambda) override { if (Lambda->getCaptureDefault() != LCD_None) { Match("", Lambda->getCaptureDefaultLoc()); } diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaExpr.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaExpr.cpp index 337dace5fd2274..0ce7f4b18762f2 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaExpr.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaExpr.cpp @@ -14,9 +14,11 @@ using namespace clang; namespace { -class LambdaExprVisitor : public ExpectedLocationVisitor<LambdaExprVisitor> { +class LambdaExprVisitor : public ExpectedLocationVisitor { public: - bool VisitLambdaExpr(LambdaExpr *Lambda) { + LambdaExprVisitor() { ShouldVisitImplicitCode = false; } + + bool VisitLambdaExpr(LambdaExpr *Lambda) override { PendingBodies.push(Lambda->getBody()); PendingClasses.push(Lambda->getLambdaClass()); Match("", Lambda->getIntroducerRange().getBegin()); @@ -24,12 +26,12 @@ class LambdaExprVisitor : public ExpectedLocationVisitor<LambdaExprVisitor> { } /// For each call to VisitLambdaExpr, we expect a subsequent call to visit /// the body (and maybe the lambda class, which is implicit). - bool VisitStmt(Stmt *S) { + bool VisitStmt(Stmt *S) override { if (!PendingBodies.empty() && S == PendingBodies.top()) PendingBodies.pop(); return true; } - bool VisitDecl(Decl *D) { + bool VisitDecl(Decl *D) override { if (!PendingClasses.empty() && D == PendingClasses.top()) PendingClasses.pop(); return true; @@ -38,9 +40,6 @@ class LambdaExprVisitor : public ExpectedLocationVisitor<LambdaExprVisitor> { bool allBodiesHaveBeenTraversed() const { return PendingBodies.empty(); } bool allClassesHaveBeenTraversed() const { return PendingClasses.empty(); } - bool VisitImplicitCode = false; - bool shouldVisitImplicitCode() const { return VisitImplicitCode; } - private: std::stack<Stmt *> PendingBodies; std::stack<Decl *> PendingClasses; @@ -67,7 +66,7 @@ TEST(RecursiveASTVisitor, LambdaInLambda) { TEST(RecursiveASTVisitor, TopLevelLambda) { LambdaExprVisitor Visitor; - Visitor.VisitImplicitCode = true; + Visitor.ShouldVisitImplicitCode = true; Visitor.ExpectMatch("", 1, 10); Visitor.ExpectMatch("", 1, 14); EXPECT_TRUE(Visitor.runOver("auto x = []{ [] {}; };", @@ -78,7 +77,7 @@ TEST(RecursiveASTVisitor, TopLevelLambda) { TEST(RecursiveASTVisitor, VisitsLambdaExprAndImplicitClass) { LambdaExprVisitor Visitor; - Visitor.VisitImplicitCode = true; + Visitor.ShouldVisitImplicitCode = true; Visitor.ExpectMatch("", 1, 12); EXPECT_TRUE(Visitor.runOver("void f() { []{ return; }(); }", LambdaExprVisitor::Lang_CXX11)); diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaTemplateParams.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaTemplateParams.cpp index c355e3f1083f96..cfac3a3c5ad988 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaTemplateParams.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/LambdaTemplateParams.cpp @@ -13,24 +13,23 @@ using namespace clang; namespace { // Matches (optional) explicit template parameters. -class LambdaTemplateParametersVisitor - : public ExpectedLocationVisitor<LambdaTemplateParametersVisitor> { +class LambdaTemplateParametersVisitor : public ExpectedLocationVisitor { public: - bool shouldVisitImplicitCode() const { return false; } + LambdaTemplateParametersVisitor() { ShouldVisitImplicitCode = false; } - bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { + bool VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) override { EXPECT_FALSE(D->isImplicit()); Match(D->getName(), D->getBeginLoc()); return true; } - bool VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) { + bool VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) override { EXPECT_FALSE(D->isImplicit()); Match(D->getName(), D->getBeginLoc()); return true; } - bool VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) { + bool VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) override { EXPECT_FALSE(D->isImplicit()); Match(D->getName(), D->getBeginLoc()); return true; diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp index d67bd0395a670e..587a00dd270511 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/MemberPointerTypeLoc.cpp @@ -13,16 +13,15 @@ using namespace clang; namespace { -class MemberPointerTypeLocVisitor - : public ExpectedLocationVisitor<MemberPointerTypeLocVisitor> { +class MemberPointerTypeLocVisitor : public ExpectedLocationVisitor { public: - bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) { + bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc TL) override { if (!TL) return true; Match(TL.getDecl()->getName(), TL.getNameLoc()); return true; } - bool VisitRecordTypeLoc(RecordTypeLoc RTL) { + bool VisitRecordTypeLoc(RecordTypeLoc RTL) override { if (!RTL) return true; Match(RTL.getDecl()->getName(), RTL.getNameLoc()); diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/NestedNameSpecifiers.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/NestedNameSpecifiers.cpp index 868a3988c756d2..ddc663e2b6fd3f 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/NestedNameSpecifiers.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/NestedNameSpecifiers.cpp @@ -13,17 +13,16 @@ using namespace clang; namespace { // Check to ensure that nested name specifiers are visited. -class NestedNameSpecifiersVisitor - : public ExpectedLocationVisitor<NestedNameSpecifiersVisitor> { +class NestedNameSpecifiersVisitor : public ExpectedLocationVisitor { public: - bool VisitRecordTypeLoc(RecordTypeLoc RTL) { + bool VisitRecordTypeLoc(RecordTypeLoc RTL) override { if (!RTL) return true; Match(RTL.getDecl()->getName(), RTL.getNameLoc()); return true; } - bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) { + bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS) override { if (!NNS) return true; if (const NamespaceDecl *ND = diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/ParenExpr.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/ParenExpr.cpp index c316f98f40ce0f..89ccf20587ad06 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/ParenExpr.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/ParenExpr.cpp @@ -12,9 +12,9 @@ using namespace clang; namespace { -class ParenExprVisitor : public ExpectedLocationVisitor<ParenExprVisitor> { +class ParenExprVisitor : public ExpectedLocationVisitor { public: - bool VisitParenExpr(ParenExpr *Parens) { + bool VisitParenExpr(ParenExpr *Parens) override { Match("", Parens->getExprLoc()); return true; } diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp index b87e89f3fd56ff..e5e743ab8d76da 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/TemplateArgumentLocTraverser.cpp @@ -12,18 +12,16 @@ using namespace clang; namespace { -class TemplateArgumentLocTraverser - : public ExpectedLocationVisitor<TemplateArgumentLocTraverser> { +class TemplateArgumentLocTraverser : public ExpectedLocationVisitor { public: - bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) { + bool TraverseTemplateArgumentLoc(const TemplateArgumentLoc &ArgLoc) override { std::string ArgStr; llvm::raw_string_ostream Stream(ArgStr); const TemplateArgument &Arg = ArgLoc.getArgument(); Arg.print(Context->getPrintingPolicy(), Stream, /*IncludeType*/ true); Match(ArgStr, ArgLoc.getLocation()); - return ExpectedLocationVisitor<TemplateArgumentLocTraverser>:: - TraverseTemplateArgumentLoc(ArgLoc); + return ExpectedLocationVisitor::TraverseTemplateArgumentLoc(ArgLoc); } }; diff --git a/clang/unittests/Tooling/RecursiveASTVisitorTests/TraversalScope.cpp b/clang/unittests/Tooling/RecursiveASTVisitorTests/TraversalScope.cpp index 9e71f9554e5951..2feddf58cac7b2 100644 --- a/clang/unittests/Tooling/RecursiveASTVisitorTests/TraversalScope.cpp +++ b/clang/unittests/Tooling/RecursiveASTVisitorTests/TraversalScope.cpp @@ -12,17 +12,17 @@ using namespace clang; namespace { -class Visitor : public ExpectedLocationVisitor<Visitor, clang::TestVisitor> { +class Visitor : public ExpectedLocationVisitor { public: Visitor(ASTContext *Context) { this->Context = Context; } - bool VisitTranslationUnitDecl(TranslationUnitDecl *D) { + bool VisitTranslationUnitDecl(TranslationUnitDecl *D) override { auto &SM = D->getParentASTContext().getSourceManager(); Match("TU", SM.getLocForStartOfFile(SM.getMainFileID())); return true; } - bool VisitNamedDecl(NamedDecl *D) { + bool VisitNamedDecl(NamedDecl *D) override { if (!D->isImplicit()) Match(D->getName(), D->getLocation()); return true; diff --git a/clang/unittests/Tooling/RefactoringTest.cpp b/clang/unittests/Tooling/RefactoringTest.cpp index 4f0cccdc274963..254d95bc20cb01 100644 --- a/clang/unittests/Tooling/RefactoringTest.cpp +++ b/clang/unittests/Tooling/RefactoringTest.cpp @@ -13,7 +13,7 @@ #include "clang/AST/ASTContext.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclGroup.h" -#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/FileManager.h" @@ -647,8 +647,7 @@ TEST_F(FlushRewrittenFilesTest, StoresChangesOnDisk) { } namespace { -template <typename T> -class TestVisitor : public clang::RecursiveASTVisitor<T> { +class TestVisitor : public DynamicRecursiveASTVisitor { public: bool runOver(StringRef Code) { return runToolOnCode(std::make_unique<TestAction>(this), Code); @@ -698,9 +697,9 @@ void expectReplacementAt(const Replacement &Replace, EXPECT_EQ(Length, Replace.getLength()); } -class ClassDeclXVisitor : public TestVisitor<ClassDeclXVisitor> { +class ClassDeclXVisitor : public TestVisitor { public: - bool VisitCXXRecordDecl(CXXRecordDecl *Record) { + bool VisitCXXRecordDecl(CXXRecordDecl *Record) override { if (Record->getName() == "X") { Replace = Replacement(*SM, Record, ""); } @@ -721,9 +720,9 @@ TEST(Replacement, ReplacesAtSpellingLocation) { expectReplacementAt(ClassDeclX.Replace, "input.cc", 17, 7); } -class CallToFVisitor : public TestVisitor<CallToFVisitor> { +class CallToFVisitor : public TestVisitor { public: - bool VisitCallExpr(CallExpr *Call) { + bool VisitCallExpr(CallExpr *Call) override { if (Call->getDirectCallee()->getName() == "F") { Replace = Replacement(*SM, Call, ""); } @@ -745,10 +744,9 @@ TEST(Replacement, TemplatedFunctionCall) { expectReplacementAt(CallToF.Replace, "input.cc", 43, 8); } -class NestedNameSpecifierAVisitor - : public TestVisitor<NestedNameSpecifierAVisitor> { +class NestedNameSpecifierAVisitor : public TestVisitor { public: - bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNSLoc) { + bool TraverseNestedNameSpecifierLoc(NestedNameSpecifierLoc NNSLoc) override { if (NNSLoc.getNestedNameSpecifier()) { if (const NamespaceDecl* NS = NNSLoc.getNestedNameSpecifier()->getAsNamespace()) { if (NS->getName() == "a") { @@ -756,8 +754,7 @@ class NestedNameSpecifierAVisitor } } } - return TestVisitor<NestedNameSpecifierAVisitor>::TraverseNestedNameSpecifierLoc( - NNSLoc); + return TestVisitor::TraverseNestedNameSpecifierLoc(NNSLoc); } Replacement Replace; }; diff --git a/clang/unittests/Tooling/SourceCodeTest.cpp b/clang/unittests/Tooling/SourceCodeTest.cpp index 3c24b6220a224a..549b77752f1c21 100644 --- a/clang/unittests/Tooling/SourceCodeTest.cpp +++ b/clang/unittests/Tooling/SourceCodeTest.cpp @@ -35,8 +35,8 @@ using tooling::validateEditRange; namespace { -struct IntLitVisitor : TestVisitor<IntLitVisitor> { - bool VisitIntegerLiteral(IntegerLiteral *Expr) { +struct IntLitVisitor : TestVisitor { + bool VisitIntegerLiteral(IntegerLiteral *Expr) override { OnIntLit(Expr, Context); return true; } @@ -44,8 +44,8 @@ struct IntLitVisitor : TestVisitor<IntLitVisitor> { std::function<void(IntegerLiteral *, ASTContext *Context)> OnIntLit; }; -struct CallsVisitor : TestVisitor<CallsVisitor> { - bool VisitCallExpr(CallExpr *Expr) { +struct CallsVisitor : TestVisitor { + bool VisitCallExpr(CallExpr *Expr) override { OnCall(Expr, Context); return true; } @@ -53,8 +53,8 @@ struct CallsVisitor : TestVisitor<CallsVisitor> { std::function<void(CallExpr *, ASTContext *Context)> OnCall; }; -struct TypeLocVisitor : TestVisitor<TypeLocVisitor> { - bool VisitTypeLoc(TypeLoc TL) { +struct TypeLocVisitor : TestVisitor { + bool VisitTypeLoc(TypeLoc TL) override { OnTypeLoc(TL, Context); return true; } @@ -97,7 +97,7 @@ static ::testing::Matcher<CharSourceRange> AsRange(const SourceManager &SM, // Base class for visitors that expect a single match corresponding to a // specific annotated range. -template <typename T> class AnnotatedCodeVisitor : public TestVisitor<T> { +class AnnotatedCodeVisitor : public TestVisitor { protected: int MatchCount = 0; llvm::Annotations Code; @@ -199,9 +199,8 @@ TEST(SourceCodeTest, getExtendedText) { } TEST(SourceCodeTest, maybeExtendRange_TokenRange) { - struct ExtendTokenRangeVisitor - : AnnotatedCodeVisitor<ExtendTokenRangeVisitor> { - bool VisitCallExpr(CallExpr *CE) { + struct ExtendTokenRangeVisitor : AnnotatedCodeVisitor { + bool VisitCallExpr(CallExpr *CE) override { ++MatchCount; EXPECT_THAT(getExtendedRange(*CE, tok::TokenKind::semi, *Context), EqualsAnnotatedRange(Context, Code.range("r"))); @@ -218,8 +217,8 @@ TEST(SourceCodeTest, maybeExtendRange_TokenRange) { } TEST(SourceCodeTest, maybeExtendRange_CharRange) { - struct ExtendCharRangeVisitor : AnnotatedCodeVisitor<ExtendCharRangeVisitor> { - bool VisitCallExpr(CallExpr *CE) { + struct ExtendCharRangeVisitor : AnnotatedCodeVisitor { + bool VisitCallExpr(CallExpr *CE) override { ++MatchCount; CharSourceRange Call = Lexer::getAsCharRange(CE->getSourceRange(), Context->getSourceManager(), @@ -238,8 +237,8 @@ TEST(SourceCodeTest, maybeExtendRange_CharRange) { } TEST(SourceCodeTest, getAssociatedRange) { - struct VarDeclsVisitor : AnnotatedCodeVisitor<VarDeclsVisitor> { - bool VisitVarDecl(VarDecl *Decl) { return VisitDeclHelper(Decl); } + struct VarDeclsVisitor : AnnotatedCodeVisitor { + bool VisitVarDecl(VarDecl *Decl) override { return VisitDeclHelper(Decl); } }; VarDeclsVisitor Visitor; @@ -283,8 +282,10 @@ TEST(SourceCodeTest, getAssociatedRange) { } TEST(SourceCodeTest, getAssociatedRangeClasses) { - struct RecordDeclsVisitor : AnnotatedCodeVisitor<RecordDeclsVisitor> { - bool VisitRecordDecl(RecordDecl *Decl) { return VisitDeclHelper(Decl); } + struct RecordDeclsVisitor : AnnotatedCodeVisitor { + bool VisitRecordDecl(RecordDecl *Decl) override { + return VisitDeclHelper(Decl); + } }; RecordDeclsVisitor Visitor; @@ -297,8 +298,8 @@ TEST(SourceCodeTest, getAssociatedRangeClasses) { } TEST(SourceCodeTest, getAssociatedRangeClassTemplateSpecializations) { - struct CXXRecordDeclsVisitor : AnnotatedCodeVisitor<CXXRecordDeclsVisitor> { - bool VisitCXXRecordDecl(CXXRecordDecl *Decl) { + struct CXXRecordDeclsVisitor : AnnotatedCodeVisitor { + bool VisitCXXRecordDecl(CXXRecordDecl *Decl) override { return Decl->getTemplateSpecializationKind() != TSK_ExplicitSpecialization || VisitDeclHelper(Decl); @@ -315,8 +316,10 @@ TEST(SourceCodeTest, getAssociatedRangeClassTemplateSpecializations) { } TEST(SourceCodeTest, getAssociatedRangeFunctions) { - struct FunctionDeclsVisitor : AnnotatedCodeVisitor<FunctionDeclsVisitor> { - bool VisitFunctionDecl(FunctionDecl *Decl) { return VisitDeclHelper(Decl); } + struct FunctionDeclsVisitor : AnnotatedCodeVisitor { + bool VisitFunctionDecl(FunctionDecl *Decl) override { + return VisitDeclHelper(Decl); + } }; FunctionDeclsVisitor Visitor; @@ -328,8 +331,8 @@ TEST(SourceCodeTest, getAssociatedRangeFunctions) { } TEST(SourceCodeTest, getAssociatedRangeMemberTemplates) { - struct CXXMethodDeclsVisitor : AnnotatedCodeVisitor<CXXMethodDeclsVisitor> { - bool VisitCXXMethodDecl(CXXMethodDecl *Decl) { + struct CXXMethodDeclsVisitor : AnnotatedCodeVisitor { + bool VisitCXXMethodDecl(CXXMethodDecl *Decl) override { // Only consider the definition of the template. return !Decl->doesThisDeclarationHaveABody() || VisitDeclHelper(Decl); } @@ -346,8 +349,8 @@ TEST(SourceCodeTest, getAssociatedRangeMemberTemplates) { } TEST(SourceCodeTest, getAssociatedRangeWithComments) { - struct VarDeclsVisitor : AnnotatedCodeVisitor<VarDeclsVisitor> { - bool VisitVarDecl(VarDecl *Decl) { return VisitDeclHelper(Decl); } + struct VarDeclsVisitor : AnnotatedCodeVisitor { + bool VisitVarDecl(VarDecl *Decl) override { return VisitDeclHelper(Decl); } }; VarDeclsVisitor Visitor; @@ -447,9 +450,9 @@ TEST(SourceCodeTest, getAssociatedRangeWithComments) { } TEST(SourceCodeTest, getAssociatedRangeInvalidForPartialExpansions) { - struct FailingVarDeclsVisitor : TestVisitor<FailingVarDeclsVisitor> { + struct FailingVarDeclsVisitor : TestVisitor { FailingVarDeclsVisitor() {} - bool VisitVarDecl(VarDecl *Decl) { + bool VisitVarDecl(VarDecl *Decl) override { EXPECT_TRUE(getAssociatedRange(*Decl, *Context).isInvalid()); return true; } diff --git a/clang/unittests/Tooling/TestVisitor.h b/clang/unittests/Tooling/TestVisitor.h index 751ca74d1a881c..fdf57a946a6e2d 100644 --- a/clang/unittests/Tooling/TestVisitor.h +++ b/clang/unittests/Tooling/TestVisitor.h @@ -16,7 +16,7 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" -#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/FrontendAction.h" #include "clang/Tooling/Tooling.h" @@ -24,20 +24,11 @@ #include <vector> namespace clang { - -/// \brief Base class for simple RecursiveASTVisitor based tests. -/// -/// This is a drop-in replacement for RecursiveASTVisitor itself, with the -/// additional capability of running it over a snippet of code. -/// -/// Visits template instantiations and implicit code by default. -template <typename T> -class TestVisitor : public RecursiveASTVisitor<T> { +namespace detail { +// Use 'TestVisitor' or include 'CRTPTestVisitor.h' and use 'CRTPTestVisitor' +// instead of using this directly. +class TestVisitorHelper { public: - TestVisitor() { } - - virtual ~TestVisitor() { } - enum Language { Lang_C, Lang_CXX98, @@ -54,57 +45,63 @@ class TestVisitor : public RecursiveASTVisitor<T> { bool runOver(StringRef Code, Language L = Lang_CXX) { std::vector<std::string> Args; switch (L) { - case Lang_C: - Args.push_back("-x"); - Args.push_back("c"); - break; - case Lang_CXX98: Args.push_back("-std=c++98"); break; - case Lang_CXX11: Args.push_back("-std=c++11"); break; - case Lang_CXX14: Args.push_back("-std=c++14"); break; - case Lang_CXX17: Args.push_back("-std=c++17"); break; - case Lang_CXX2a: Args.push_back("-std=c++2a"); break; - case Lang_OBJC: - Args.push_back("-ObjC"); - Args.push_back("-fobjc-runtime=macosx-10.12.0"); - break; - case Lang_OBJCXX11: - Args.push_back("-ObjC++"); - Args.push_back("-std=c++11"); - Args.push_back("-fblocks"); - break; + case Lang_C: + Args.push_back("-x"); + Args.push_back("c"); + break; + case Lang_CXX98: + Args.push_back("-std=c++98"); + break; + case Lang_CXX11: + Args.push_back("-std=c++11"); + break; + case Lang_CXX14: + Args.push_back("-std=c++14"); + break; + case Lang_CXX17: + Args.push_back("-std=c++17"); + break; + case Lang_CXX2a: + Args.push_back("-std=c++2a"); + break; + case Lang_OBJC: + Args.push_back("-ObjC"); + Args.push_back("-fobjc-runtime=macosx-10.12.0"); + break; + case Lang_OBJCXX11: + Args.push_back("-ObjC++"); + Args.push_back("-std=c++11"); + Args.push_back("-fblocks"); + break; } return tooling::runToolOnCodeWithArgs(CreateTestAction(), Code, Args); } - bool shouldVisitTemplateInstantiations() const { - return true; - } - - bool shouldVisitImplicitCode() const { - return true; - } - protected: + TestVisitorHelper() = default; + virtual ~TestVisitorHelper() = default; + virtual void InvokeTraverseDecl(TranslationUnitDecl *D) = 0; + virtual std::unique_ptr<ASTFrontendAction> CreateTestAction() { return std::make_unique<TestAction>(this); } class FindConsumer : public ASTConsumer { public: - FindConsumer(TestVisitor *Visitor) : Visitor(Visitor) {} + FindConsumer(TestVisitorHelper *Visitor) : Visitor(Visitor) {} void HandleTranslationUnit(clang::ASTContext &Context) override { Visitor->Context = &Context; - Visitor->TraverseDecl(Context.getTranslationUnitDecl()); + Visitor->InvokeTraverseDecl(Context.getTranslationUnitDecl()); } private: - TestVisitor *Visitor; + TestVisitorHelper *Visitor; }; class TestAction : public ASTFrontendAction { public: - TestAction(TestVisitor *Visitor) : Visitor(Visitor) {} + TestAction(TestVisitorHelper *Visitor) : Visitor(Visitor) {} std::unique_ptr<clang::ASTConsumer> CreateASTConsumer(CompilerInstance &, llvm::StringRef dummy) override { @@ -113,20 +110,13 @@ class TestVisitor : public RecursiveASTVisitor<T> { } protected: - TestVisitor *Visitor; + TestVisitorHelper *Visitor; }; ASTContext *Context; }; -/// \brief A RecursiveASTVisitor to check that certain matches are (or are -/// not) observed during visitation. -/// -/// This is a RecursiveASTVisitor for testing the RecursiveASTVisitor itself, -/// and allows simple creation of test visitors running matches on only a small -/// subset of the Visit* methods. -template <typename T, template <typename> class Visitor = TestVisitor> -class ExpectedLocationVisitor : public Visitor<T> { +class ExpectedLocationVisitorHelper { public: /// \brief Expect 'Match' *not* to occur at the given 'Line' and 'Column'. /// @@ -147,37 +137,44 @@ class ExpectedLocationVisitor : public Visitor<T> { } /// \brief Checks that all expected matches have been found. - ~ExpectedLocationVisitor() override { - for (typename std::vector<ExpectedMatch>::const_iterator - It = ExpectedMatches.begin(), End = ExpectedMatches.end(); + virtual ~ExpectedLocationVisitorHelper() { + // FIXME: Range-based for loop. + for (std::vector<ExpectedMatch>::const_iterator + It = ExpectedMatches.begin(), + End = ExpectedMatches.end(); It != End; ++It) { It->ExpectFound(); } } protected: + virtual ASTContext *getASTContext() = 0; + /// \brief Checks an actual match against expected and disallowed matches. /// /// Implementations are required to call this with appropriate values /// for 'Name' during visitation. void Match(StringRef Name, SourceLocation Location) { - const FullSourceLoc FullLocation = this->Context->getFullLoc(Location); + const FullSourceLoc FullLocation = getASTContext()->getFullLoc(Location); - for (typename std::vector<MatchCandidate>::const_iterator - It = DisallowedMatches.begin(), End = DisallowedMatches.end(); + // FIXME: Range-based for loop. + for (std::vector<MatchCandidate>::const_iterator + It = DisallowedMatches.begin(), + End = DisallowedMatches.end(); It != End; ++It) { EXPECT_FALSE(It->Matches(Name, FullLocation)) << "Matched disallowed " << *It; } - for (typename std::vector<ExpectedMatch>::iterator - It = ExpectedMatches.begin(), End = ExpectedMatches.end(); + // FIXME: Range-based for loop. + for (std::vector<ExpectedMatch>::iterator It = ExpectedMatches.begin(), + End = ExpectedMatches.end(); It != End; ++It) { - It->UpdateFor(Name, FullLocation, this->Context->getSourceManager()); + It->UpdateFor(Name, FullLocation, getASTContext()->getSourceManager()); } } - private: +private: struct MatchCandidate { std::string ExpectedName; unsigned LineNumber; @@ -247,6 +244,41 @@ class ExpectedLocationVisitor : public Visitor<T> { std::vector<MatchCandidate> DisallowedMatches; std::vector<ExpectedMatch> ExpectedMatches; }; -} +} // namespace detail + +/// \brief Base class for simple (Dynamic)RecursiveASTVisitor based tests. +/// +/// This is a drop-in replacement for DynamicRecursiveASTVisitor itself, with +/// the additional capability of running it over a snippet of code. +/// +/// Visits template instantiations and implicit code by default. +/// +/// For post-order traversal etc. use CTRPTestVisitor from +/// CTRPTestVisitor.h instead. +class TestVisitor : public DynamicRecursiveASTVisitor, + public detail::TestVisitorHelper { +public: + TestVisitor() { + ShouldVisitTemplateInstantiations = true; + ShouldVisitImplicitCode = true; + } + + void InvokeTraverseDecl(TranslationUnitDecl *D) override { TraverseDecl(D); } +}; + +/// \brief A RecursiveASTVisitor to check that certain matches are (or are +/// not) observed during visitation. +/// +/// This is a RecursiveASTVisitor for testing the RecursiveASTVisitor itself, +/// and allows simple creation of test visitors running matches on only a small +/// subset of the Visit* methods. +/// +/// For post-order traversal etc. use CTRPExpectedLocationVisitor from +/// CTRPTestVisitor.h instead. +class ExpectedLocationVisitor : public TestVisitor, + public detail::ExpectedLocationVisitorHelper { + ASTContext *getASTContext() override { return Context; } +}; +} // namespace clang #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits