58 lines · cpp
1//===- unittest/Tooling/RecursiveASTVisitorTests/TraversalScope.cpp -------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "TestVisitor.h"10 11using namespace clang;12 13namespace {14 15class Visitor : public ExpectedLocationVisitor {16public:17 Visitor(ASTContext *Context) { this->Context = Context; }18 19 bool VisitTranslationUnitDecl(TranslationUnitDecl *D) override {20 auto &SM = D->getParentASTContext().getSourceManager();21 Match("TU", SM.getLocForStartOfFile(SM.getMainFileID()));22 return true;23 }24 25 bool VisitNamedDecl(NamedDecl *D) override {26 if (!D->isImplicit())27 Match(D->getName(), D->getLocation());28 return true;29 }30};31 32TEST(RecursiveASTVisitor, RespectsTraversalScope) {33 auto AST = tooling::buildASTFromCode(34 R"cpp(35struct foo {36 struct bar {37 struct baz {};38 };39};40 )cpp",41 "foo.cpp", std::make_shared<PCHContainerOperations>());42 auto &Ctx = AST->getASTContext();43 auto &TU = *Ctx.getTranslationUnitDecl();44 auto &Foo = *TU.lookup(&Ctx.Idents.get("foo")).front();45 auto &Bar = *cast<DeclContext>(Foo).lookup(&Ctx.Idents.get("bar")).front();46 47 Ctx.setTraversalScope({&Bar});48 49 Visitor V(&Ctx);50 V.ExpectMatch("TU", 1, 1);51 V.DisallowMatch("foo", 2, 8);52 V.ExpectMatch("bar", 3, 10);53 V.ExpectMatch("baz", 4, 12);54 V.TraverseAST(Ctx);55}56 57} // end anonymous namespace58