1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- //===- unittest/Tooling/RecursiveASTVisitorTests/TraversalScope.cpp -------===//
- //
- // 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 "TestVisitor.h"
- using namespace clang;
- namespace {
- class Visitor : public ExpectedLocationVisitor<Visitor, clang::TestVisitor> {
- public:
- Visitor(ASTContext *Context) { this->Context = Context; }
- bool VisitNamedDecl(NamedDecl *D) {
- if (!D->isImplicit())
- Match(D->getName(), D->getLocation());
- return true;
- }
- };
- TEST(RecursiveASTVisitor, RespectsTraversalScope) {
- auto AST = tooling::buildASTFromCode(
- R"cpp(
- struct foo {
- struct bar {
- struct baz {};
- };
- };
- )cpp",
- "foo.cpp", std::make_shared<PCHContainerOperations>());
- auto &Ctx = AST->getASTContext();
- auto &TU = *Ctx.getTranslationUnitDecl();
- auto &Foo = *TU.lookup(&Ctx.Idents.get("foo")).front();
- auto &Bar = *cast<DeclContext>(Foo).lookup(&Ctx.Idents.get("bar")).front();
- Ctx.setTraversalScope({&Bar});
- Visitor V(&Ctx);
- V.DisallowMatch("foo", 2, 8);
- V.ExpectMatch("bar", 3, 10);
- V.ExpectMatch("baz", 4, 12);
- V.TraverseAST(Ctx);
- }
- } // end anonymous namespace
|