brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 2feddf5 Raw
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